1、cpuusage是什麼
cpuusage(即CPU利用率,本文均用cpuusage指代CPU利用率)通常是指:CPU從事任何工作的時間比例。 如:90%的cpuusage表示CPU處於90%忙碌狀態和10%空閒狀態。當CPU空閒時,它什麼也不做,在嵌入式實時操作系統RTOS上,它會進入idle狀態,idle本身也是一個task,它只是在等待中斷,消耗CPU。
在RTOS上,CPU 都是分時間片使用的。比如:任務A運行了10ms,然後切換到任務B,B運行了30ms,然後空閒60ms(即進入idle task運行60ms),接著切換回任務A週期這樣運行。如果在一段時間內都是如此,那麼這段時間內的cpuusage為40%(其中任務A的cpuusage為10%,任務B的cpuusage為30%)。
cpuusage可以反映當前cpu的繁忙程度,cpuusage 越高,說明在設備上運行了很多程序,反之較少。如果cpuusage在一段時間內一直過高,可能是高優先級的任務一直佔據著CPU來運行,導致了低優先級的任務始終無法獲得CPU來運行,這樣的設計可能存在問題。因此,cpuusage的統計可以幫助我們優化應用程序。
## 2、AliOS Things上cpuusage如何被統計出來
### 2.1、cpuusage統計原理
任務cpuusage: 任務在統計週期內的執行時間除以統計週期即為任務的cpuusage。
總cpuusage:除idle任務外,所有任務在統計週期內的累計執行時間/統計週期,這時可以通過100%-idle任務cpuusage來計算。
舉例說明:
以上述執行時序為例,在統計週期內,task1被調度執行1次,task2被調度執行2次,其餘時間均為idle任務運行。
2.2、任務運行時間的累計
單個任務的單次統計時間確定好後,那麼在一段時間內,任意任務的運行時間就可以確定下來——只需將這段時間內這個任務的運行時間進行累計。
以上圖中的任務切換為例:
假設 Task1的在 t1 時刻已經運行的時間為 total_task1,Task2的在 t1 時刻已經運行的時間為 total_task2;
那麼在 t2 時刻,total_task1更新為
``total_task1 += t2 - t1;
``
在 t3 時刻,total_task2更新為
``total_task2 += t3 - t2;
``
如此累計下去,就可以獲得一段時間內,需要統計任務的運行時間總和。
3、HaaS100上cpuusage如何使用
3.1、打開平臺配置
在相應平臺的 k_config.h 文件中配置如下宏:
- RHINO_CONFIG_SYS_STATS配置為1,啟用統計功能;
- RHINO_CONFIG_HW_COUNT配置為1,使用硬件計時器(該計時器需要適配)。
#ifndef RHINO_CONFIG_SYS_STATS
#define RHINO_CONFIG_SYS_STATS 1
#endif
#ifndef RHINO_CONFIG_HW_COUNT
#define RHINO_CONFIG_HW_COUNT 1
#endif
3.2、適配硬件定時器
cpuusage的時間統計,是通過板卡上自帶的高精度的硬件定時器來實現的,這個硬件定時器的主頻一般是幾MHz~幾十MHz不等。
這個定時器值的獲取依賴硬件廠商提供的bsp接口,為了屏蔽這些底層硬件的差異,AliOS Things提供了一個統一的接口來獲取這個定時器的值,如下:
``hr_timer_t soc_hr_hw_cnt_get(void);
``
在HaaS100開發板上,如果有開發者對定時基準細節感興趣,可以參考定時器的獲取接口的實現細節,代碼位於:
``platform/board/haas100/config/board.c
``
AliOS Things 代碼下載及說明
注意: 我們在HaaS100上已經打開了平臺配置開關,同時適配好了硬件定時器。
也就是說,在HaaS100上cpuusage的功能是默認打開的,可以直接使用!
3.3、使用方法——通過cli命令cpuusage
puusage是kernel 自帶的一個命令,不依賴任何app,也就是說,只要在編譯時加上cli 組件,在cli shell下執行一個命令cpuusage,即可開始統計系統內所有任務的cpuusage。
注意:關於cli 組件如何打開使用,請參考另外一篇文章——見文尾鏈接“傳送門”《一文輕鬆入門HaaS100診斷調試系統》。
3.3.1、命令使用說明
cpuusage [-d n] [-t m] 命令啟動CPU利用率統計
其中:-d選項用於指定統計週期,單位為ms,默認為1 s;
-t選項用於指定統計時長,單位為ms,默認為連續運行。
舉例說明:
cpuusage -- 啟動一個cpuusage任務,該任務默認每隔1s執行一次統計;
cpuusage -d 3000 -- 啟動一個cpuusage任務,該任務默認每隔3s(3000ms)執行一次統計;
cpuusage -d 2000 -t 10000 -- 啟動一個cpuusage任務,該任務默認每隔2s(2000ms)執行一次統計,
統計到10s(10000ms)後停止;
ctrl+c 結束統計
3.3.2、命令運行截圖
可以看到執行了cpuusage 命令後,每秒打印出一次當前系統內所有task的CPU利用率,當前系統內沒有跑應用,idle_task的運行時間佔據了99.99%。
希望開發者也可以動手嘗試,創建幾個任務,觀察下cpuusage有什麼變化。
4、開發者技術支持
如需更多技術支持,可加入釘釘開發者群
更多技術與解決方案介紹,請訪問阿里雲AIoT首頁https://iot.aliyun.com/