關於CPU利用率,可以反映出整機的繁忙程度,從整體上了解CPU的使用情況,下面小編就帶來關於CPU利用率的介紹。CPU是給軟體服務的,這是指用戶進程等調度單元,也就可以知道進程的CPU利用率是多少,因此CPU利用率可以分為3個粒度來考慮:
1.單個CPU核心的利用率
2.整機CPU利用率
3.進程的CPU利用率。
這3種CPU利用率有各自的算法,作業系統是以時間片來為系統計時的,是最本質的時間單位,其它能看到的更人性化的時間格式都是通過它轉換的。需要注意的是,時間片是個累積量,無論是針對CPU級別還是進程級別,從作業系統被加載到內存並掌權後,作業系統為它們記錄各自的時間片累計數,這個量會一直累積增長,直到關機或進程結束生命周期。
CPU利用率是指一段時間內CPU消耗的度量,強調的是經過一段時間內測出來的,就像速度一樣,其概念是單位時間內移動的距離,這也解釋了為什麼top命令要有個時間間隔,默認是2秒。總的來說CPU利用率的實現原理是:在單位時間內連續兩次採樣CPU的時間片數,由於其是累積量,因此要取其差以獲取增量,然後再經過後續處理得到不同級別的CPU利用率。
1、單個CPU核心的利用率
通過一定的時間間隔,周期地對某個CPU核心上的idle線程運行的時間片數,和該CPU運行的時間片數進行兩次採樣,分別將兩次採樣值各自取其差,然後進行環比,最後再將比值乘以100%,所得的百分比便是該CPU的空閒率。
伺服器中有多個CPU,我們用其中的一個CPU-CPU1來舉例說在時間A對CPU1的idle線程運行的時間片數和CPU1的總運行時間片數採樣,採樣值分別為 cpu1_ idle_ slices_A和cpul_ total sices A,然後在時間B同樣對CPU1的idle線程運行的時間片數和CPU1的總運行時間片數採樣,採樣值分別是 cpu1_idle_ slices_B和cpul_total_ slices_B。那麼在B-A這段時間裡,CPU1的空閒率公式便為:
(cpu1_idle_slicesB-cpu1_idle_slices_A)/(cpu1_total_slices_Bcpu1_total_slices_)"100%
相應CPU1的利用率便為100減去上面公式的結果。如果CPU1很繁忙,idle線程一直未被調度運行,CPU1的空閒率便是0%,即利用率是100%。
2、整機CPU利用率
通過一定的時間間隔周期對所有CPU上idle線程運行的時間片數和所有CPU運行的時間片數進行兩次採樣,分別將兩次採樣值各自取其差,然後進行環比,也就是用這段採樣周期內所有CPU核心上idle線程運行的時間片數之和,比上這段採樣周期內所有CPU運行的時間片數之和,最後再將比值乘以100%,所得的百分比便是所有idle線程在所有CPU上的利用率,也就是系統的整體空閒率。
假如在時間A對所有CPU上的idle線程運行的時間片數和所有CPU運行的時間片數採樣,採樣值分別是 cpuall_idle_ slices_A和 cpual_total_ slices_A,然後在時間B同樣對所有CPU上的idle線程運行的時間片數和所有CPU運行的時間片數採樣,採樣值分別是 cpuall_idle_ slices_B和 cpuall_total slices_B,那麼在B-A這段時間裡,整機CPU空閒率公式便為:
(cpuall _idle_slices_b-cpuall idle_slices_A)/(cpuall_totalslices_b-cpualltotallslices_A)*100%同樣,相應整機的CPU利用率便為100去上面公式的結果。
以上這兩類CPU利用率主要是看CPU是否運行idle線程,屬於CPU級別的。由於運行哪個任務是由作業系統的任務調度器決定的,也就是只有當作業系統發現沒有任務可運行時才會去執行idle線程,因此只要idle在運行,就表示CPU有多餘的空閒資源。
3、進程的CPU利用率
進程的CPU利用率同樣是需要兩次採樣才能得到,但卻與前兩種CPU利用率有很大不同,進程在任意時刻只會在一個CPU上運行,當上有多個CPU時,保不準進程會在多個CPU之間來迴轉移,比如當前CPU負載很高,利用率已接近100%,當下一次該進程重新運行在CPU上時,調度器會根據實際CPU負載情況,將其換到另一個負載輕的CPU上執行。
儘管切換CPU這在一定程度上會影響性能,但由於進程之前所在的CPU的利用率已經是100%,換到空閒CPU上對進程來說,得到了更多的執行機會,可以更早的結束運行,因此利大於弊。
因此無法獲知在兩次採樣期間,進程被換了多少個CPU運行,多個CPU是並行的,它們各自獨立運行了一定的時間片數,雖然可以獲取進程運行的時間片數,但沒辦法知道進程經過了哪些CPU,僅能知道最後一次是在哪個CPU上執行,所以不知道去獲取哪些CPU在這段採樣周期內運行的時間片數。
基於這個原因,進程CPU利用率的計算原理採用了「時間比」,也就是進程的執行時間比上次採樣周期時間,所得的比值再乘以100%。但作業系統為用戶進程記錄的是進程的時間片數,因此要將時間片數轉換為時間。轉換的方法也很簡單,將時間片數除以 syscon_SC_ CLK TCK換成以秒為單位的時間,然後再除以秒為單位的採樣時間。
當然,如果是以秒這種粗粒度的時間去比較,必然會造成一定的誤差,因此,常常換算為以毫秒為單位的時間比。原理是這樣的,具體取決於實現,如果要以微秒為單位採樣也是可以的。