開發與維運

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。
20201222080745476.png
總cpuusage:除idle任務外,所有任務在統計週期內的累計執行時間/統計週期,這時可以通過100%-idle任務cpuusage來計算。
20201222080804176.png
舉例說明:
0680bee5c94401c3bfcc6108e5c25976.png
以上述執行時序為例,在統計週期內,task1被調度執行1次,task2被調度執行2次,其餘時間均為idle任務運行。
20201222080838546.png
20201222080855536.png

2.2、任務運行時間的累計

單個任務的單次統計時間確定好後,那麼在一段時間內,任意任務的運行時間就可以確定下來——只需將這段時間內這個任務的運行時間進行累計。
93f8b3374dada1c2f53f765ba1f299e8.png
以上圖中的任務切換為例:

假設 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、命令運行截圖

e4cb1bd247158a2a2792fdd5799412ea.png

可以看到執行了cpuusage 命令後,每秒打印出一次當前系統內所有task的CPU利用率,當前系統內沒有跑應用,idle_task的運行時間佔據了99.99%。

希望開發者也可以動手嘗試,創建幾個任務,觀察下cpuusage有什麼變化。

4、開發者技術支持

如需更多技術支持,可加入釘釘開發者群

test

更多技術與解決方案介紹,請訪問阿里雲AIoT首頁https://iot.aliyun.com/

Leave a Reply

Your email address will not be published. Required fields are marked *