HaaS100 開發除錯系列 之 CPU利用率(cpuusage)的原理與使用
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
注意: 我們在HaaS100上已經打開了平臺配置開關,同時適配好了硬體定時器。
也就是說,在HaaS100上cpuusage的功能是預設開啟的,可以直接使用!
3.3、使用方法——通過cli命令cpuusage
cpuusage是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、傳送門
5、開發者技術支援
如需更多技術支援,可加入釘釘開發者群
更多技術與解決方案介紹,請訪問阿里雲AIoT首頁http://iot.aliyun.com/
- HTML及CSS筆記
- CNCF宣佈Open Policy Agent正式畢業!
- 獨家 | 利用Python實現主題建模和LDA 演算法(附連結)
- 一行程式碼引來的安全漏洞就讓我們丟失了整個伺服器的控制權
- bzoj3289: Mato的檔案管理(莫隊 樹狀陣列)
- 橡皮擦和 TA 在 CSDN 的精英好友們,頂級大佬推薦清單
- 吳恩達深度學習學習筆記——C1W2——神經網路基礎——作業1——Python及Numpy基礎
- k8s交付服務總結
- 物理史上的八大名人
- Java遍歷Map集合方法
- HaaS100 開發除錯系列 之 CPU利用率(cpuusage)的原理與使用
- Ceph 壞盤
- N51期第四次作業
- 帶BlendShape表情的動作檔案播放異常
- 系統開發基礎:UML相關知識筆記
- 雜湊表的實現
- 關於Docker、Docker Engine和Kubernetes v1.20,開發人員需要了解的一切
- Java第九次作業
- 最厲害的VUE指令,看完你就會了!!!
- SpringBoot整合Quartz實現定時任務的動態建立、啟動、暫停、恢復、刪除。