1# CPU占用率<a name="ZH-CN_TOPIC_0000001123188477"></a> 2 3- [基本概念](#section17683419227) 4- [运行机制](#section593718536227) 5- [开发指导](#section11284210152311) 6 - [接口说明](#section3745151592312) 7 - [开发流程](#section122901429182316) 8 - [编程实例](#section1765785212310) 9 10 11## 基本概念<a name="section17683419227"></a> 12 13CPU(中央处理器,Central Processing Unit)占用率分为系统CPU占用率、进程CPU占用率、任务CPU占用率和中断CPU占用率。用户通过系统级的CPU占用率,判断当前系统负载是否超出设计规格。通过系统中各个进程/任务/中断的CPU占用情况,判断各个进程/任务/中断的CPU占用率是否符合设计的预期。 14 15- 系统CPU占用率(CPU Percent) 16 17 指周期时间内系统的CPU占用率,用于表示系统一段时间内的闲忙程度,也表示CPU的负载情况。系统CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100表示系统满负荷运转。 18 19- 进程CPU占用率 20 21 指单个进程的CPU占用率,用于表示单个进程在一段时间内的闲忙程度。进程CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100表示在一段时间内系统一直在运行该进程。 22 23- 任务CPU占用率 24 25 指单个任务的CPU占用率,用于表示单个任务在一段时间内的闲忙程度。任务CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100表示在一段时间内系统一直在运行该任务。 26 27- 中断CPU占用率 28 29 指单个中断的CPU占用率,用于表示单个中断在一段时间内的闲忙程度。中断CPU占用率的有效表示范围为0~100,其精度(可通过配置调整)为百分比。100表示在一段时间内系统一直在运行该中断。 30 31 32## 运行机制<a name="section593718536227"></a> 33 34OpenHarmony LiteOS-A内核CPUP(CPU Percent,CPU占用率)模块采用进程、任务和中断级记录的方式,在进程/任务切换时,记录进程/任务启动时间,进程/任务切出或者退出时,系统会累加整个进程/任务的占用时间; 在执行中断时系统会累加记录每个中断的执行时间。 35 36OpenHarmony 提供以下四种CPU占用率的信息查询: 37 38- 系统CPU占用率 39- 进程CPU占用率 40- 任务CPU占用率 41- 中断CPU占用率 42 43**CPU占用率的计算方法:** 44 45系统CPU占用率=系统中除idle任务外其他任务运行总时间/系统运行总时间 46 47进程CPU占用率=进程运行总时间/系统运行总时间 48 49任务CPU占用率=任务运行总时间/系统运行总时间 50 51中断CPU占用率=中断运行总时间/系统运行总时间 52 53## 开发指导<a name="section11284210152311"></a> 54 55### 接口说明<a name="section3745151592312"></a> 56 57**表 1** CPUP模块接口 58 59<a name="table147491853163018"></a> 60<table><thead align="left"><tr id="row10807205323013"><th class="cellrowborder" valign="top" width="28.3971602839716%" id="mcps1.2.4.1.1"><p id="p980714539304"><a name="p980714539304"></a><a name="p980714539304"></a>功能分类</p> 61</th> 62<th class="cellrowborder" valign="top" width="36.47635236476353%" id="mcps1.2.4.1.2"><p id="p1780715533305"><a name="p1780715533305"></a><a name="p1780715533305"></a>接口<strong id="b197068338312"><a name="b197068338312"></a><a name="b197068338312"></a>名称</strong></p> 63</th> 64<th class="cellrowborder" valign="top" width="35.12648735126487%" id="mcps1.2.4.1.3"><p id="p18807185316301"><a name="p18807185316301"></a><a name="p18807185316301"></a>描述</p> 65</th> 66</tr> 67</thead> 68<tbody><tr id="row3807145310300"><td class="cellrowborder" valign="top" width="28.3971602839716%" headers="mcps1.2.4.1.1 "><p id="p174011140141013"><a name="p174011140141013"></a><a name="p174011140141013"></a>系统CPU占用率</p> 69</td> 70<td class="cellrowborder" valign="top" width="36.47635236476353%" headers="mcps1.2.4.1.2 "><p id="p158071153133013"><a name="p158071153133013"></a><a name="p158071153133013"></a>LOS_HistorySysCpuUsage</p> 71</td> 72<td class="cellrowborder" valign="top" width="35.12648735126487%" headers="mcps1.2.4.1.3 "><p id="p14808115353010"><a name="p14808115353010"></a><a name="p14808115353010"></a>获取系统历史CPU占用率</p> 73</td> 74</tr> 75<tr id="row147461859201016"><td class="cellrowborder" rowspan="2" valign="top" width="28.3971602839716%" headers="mcps1.2.4.1.1 "><p id="p374720596102"><a name="p374720596102"></a><a name="p374720596102"></a>进程CPU占用率</p> 76</td> 77<td class="cellrowborder" valign="top" width="36.47635236476353%" headers="mcps1.2.4.1.2 "><p id="p3747859101010"><a name="p3747859101010"></a><a name="p3747859101010"></a>LOS_HistoryProcessCpuUsage</p> 78</td> 79<td class="cellrowborder" valign="top" width="35.12648735126487%" headers="mcps1.2.4.1.3 "><p id="p1747959131016"><a name="p1747959131016"></a><a name="p1747959131016"></a>获取指定进程历史CPU占用率</p> 80</td> 81</tr> 82<tr id="row2075434812116"><td class="cellrowborder" valign="top" headers="mcps1.2.4.1.1 "><p id="p17541648171114"><a name="p17541648171114"></a><a name="p17541648171114"></a>LOS_GetAllProcessCpuUsage</p> 83</td> 84<td class="cellrowborder" valign="top" headers="mcps1.2.4.1.2 "><p id="p1575419483116"><a name="p1575419483116"></a><a name="p1575419483116"></a>获取系统所有进程的历史CPU占用率</p> 85</td> 86</tr> 87<tr id="row1480855311301"><td class="cellrowborder" valign="top" width="28.3971602839716%" headers="mcps1.2.4.1.1 "><p id="p1618792981018"><a name="p1618792981018"></a><a name="p1618792981018"></a>任务CPU占用率</p> 88</td> 89<td class="cellrowborder" valign="top" width="36.47635236476353%" headers="mcps1.2.4.1.2 "><p id="p9808185353016"><a name="p9808185353016"></a><a name="p9808185353016"></a>LOS_HistoryTaskCpuUsage</p> 90</td> 91<td class="cellrowborder" valign="top" width="35.12648735126487%" headers="mcps1.2.4.1.3 "><p id="p12808653183016"><a name="p12808653183016"></a><a name="p12808653183016"></a>获取指定任务历史CPU占用率</p> 92</td> 93</tr> 94<tr id="row680812535306"><td class="cellrowborder" valign="top" width="28.3971602839716%" headers="mcps1.2.4.1.1 "><p id="p13808125314307"><a name="p13808125314307"></a><a name="p13808125314307"></a>中断CPU占用率</p> 95</td> 96<td class="cellrowborder" valign="top" width="36.47635236476353%" headers="mcps1.2.4.1.2 "><p id="p1480835316303"><a name="p1480835316303"></a><a name="p1480835316303"></a>LOS_GetAllIrqCpuUsage</p> 97</td> 98<td class="cellrowborder" valign="top" width="35.12648735126487%" headers="mcps1.2.4.1.3 "><p id="p33741531163313"><a name="p33741531163313"></a><a name="p33741531163313"></a>获取系统所有中断的历史CPU占用率</p> 99</td> 100</tr> 101</tbody> 102</table> 103 104### 开发流程<a name="section122901429182316"></a> 105 106CPU占用率的典型开发流程: 107 1081. 调用获取系统历史CPU占用率函数LOS\_HistorySysCpuUsage。 1092. 调用获取指定进程历史CPU占用率函数LOS\_HistoryProcessCpuUsage。 110 - 若进程已创建,则关中断,根据不同模式正常获取,恢复中断; 111 - 若进程未创建,则返回错误码; 112 1133. 调用获取所有进程CPU占用率函数LOS\_GetAllProcessCpuUsage。 114 - 若CPUP已初始化,则关中断,根据不同模式正常获取,恢复中断; 115 - 若CPUP未初始化或有非法入参,则返回错误码; 116 1174. 调用获取指定任务历史CPU占用率函数LOS\_HistoryTaskCpuUsage。 118 - 若任务已创建,则关中断,根据不同模式正常获取,恢复中断; 119 - 若任务未创建,则返回错误码; 120 1215. 调用获取所有中断CPU占用率函数LOS\_GetAllIrqCpuUsage。 122 - 若CPUP已初始化,则关中断,根据不同模式正常获取,恢复中断; 123 - 若CPUP未初始化或有非法入参,则返回错误码; 124 125 126### 编程实例<a name="section1765785212310"></a> 127 128本实例实现如下功能: 129 1301. 创建一个用于CPUP测试的任务。 1312. 获取当前系统CPUP。 1323. 以不同模式获取历史系统CPUP。 1334. 获取创建的测试任务的CPUP。 1345. 以不同模式获取创建的测试任务的CPUP。 135 136前提条件: 137 138在menuconfig 配置中打开cpup控制开关。 139 140**示例代码** 141 142代码实现如下: 143 144``` 145#include "los_task.h" 146#include "los_cpup.h" 147#define MODE 4 148UINT32 g_cpuTestTaskID; 149VOID ExampleCpup(VOID) 150{ 151 printf("entry cpup test example\n"); 152 while(1) { 153 usleep(100); 154 } 155} 156UINT32 ItCpupTest(VOID) 157{ 158 UINT32 ret; 159 UINT32 cpupUse; 160 TSK_INIT_PARAM_S cpupTestTask = { 0 }; 161 memset(&cpupTestTask, 0, sizeof(TSK_INIT_PARAM_S)); 162 cpupTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)ExampleCpup; 163 cpupTestTask.pcName = "TestCpupTsk"; 164 cpupTestTask.uwStackSize = 0x800; 165 cpupTestTask.usTaskPrio = 5; 166 ret = LOS_TaskCreate(&g_cpuTestTaskID, &cpupTestTask); 167 if(ret != LOS_OK) { 168 printf("cpupTestTask create failed .\n"); 169 return LOS_NOK; 170 } 171 172 usleep(100); 173 174 /* 获取当前系统历史cpu占用率 */ 175 cpupUse = LOS_HistorySysCpuUsage(CPU_LESS_THAN_1S); 176 printf("the history system cpu usage in all time:%u.%u\n", 177 cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); 178 /* 获取指定任务的cpu占用率,该测试例程中指定的任务为以上创建的cpup测试任务 */ 179 cpupUse = LOS_HistoryTaskCpuUsage(g_cpuTestTaskID, CPU_LESS_THAN_1S); 180 printf("cpu usage of the cpupTestTask in all time:\n TaskID: %d\n usage: %u.%u\n", 181 g_cpuTestTaskID, cpupUse / LOS_CPUP_PRECISION_MULT, cpupUse % LOS_CPUP_PRECISION_MULT); 182 return LOS_OK; 183} 184``` 185 186**结果验证** 187 188编译运行得到的结果为: 189 190``` 191entry cpup test example 192the history system cpu usage in all time: 3.0 193cpu usage of the cpupTestTask in all time: TaskID:10 usage: 0.0 194``` 195 196