面試會遇到的一個問題,ps看到的CPU使用率能大于100%,有時候能準確的回答赠幕,是在排障的過程中確實見過大于100%的,那么ps命令是如果計算進程CPU使用率的呢询筏?CPU利用率高是經常遇到的問題榕堰,常用的系統(tǒng)命令比如sar,pidstat ,mpstat是如何計算CPU使用率的嫌套?對于偶發(fā)的CPU高逆屡,使用ps能準確抓到CPU高的進程嗎?
一踱讨、通俗的理解CPU使用率
CPU(central processing unit)中央處理器是計算機系統(tǒng)的運算和控制中心魏蔗,我們寫一段代碼,經過編譯匯編痹筛,最終翻譯成CPU的指令莺治,CPU就像是一個長跑運動員,我們的代碼就像是指令卡帚稠,CPU拿著指令谣旁,來完成我們要做的事情,比如監(jiān)聽一個端口滋早,讀取網絡上的數據包蔓挖,應用程序返回響應;我們把CPU的計算能力比做運動員單位時間能跑的公里數馆衔,當前CPU利用率比做當前的單位時間運動員跑了多少除以他的最大能力瘟判。為了方便理解,用下面的餅圖做一個形象的展示:
當然cpu并不是在單位時間內連續(xù)的完成一件事情角溃,把相同的事情畫到一個餅圖方便展示CPU使用率的種類拷获。
二、CPU使用率計算方法
CPU整體的使用率在文件/proc/stat中
cpu一行依次代表:
name user nice system idle iowait irrq softirq steal guest guest_nice ,
CPU總時間 = user + system + nice + idle + iowait + irq + softirq
命令中看到的各個過程使用率為各個階段處以總的時間减细,比如
%user = user/CPU總時間
使用stress命令打壓力匆瓜,兩次文件對比,可以看到user狀態(tài)的數字明顯上漲:
stress -c 1
top, sar, mpstat這些命令讀取/proc/stat文件未蝌,根據命令參數的時間間隔采樣文件數據驮吱,除以時間間隔,計算中最終的CPU使用率萧吠;對于單個進程的CPU使用情況左冬,存在文件/proc/pid/stat,pidstat 這個命令會讀取這個文件纸型,計算進程使用的CPU使用情況拇砰;
三梅忌、實驗模擬CPU高的場景
通過模擬單核和多核CPU跑滿的情況,看下各個命令的處理結果
1.單核打滿
go語言模擬單核CPU打滿
package main
// CPU test
func main() {
i := 0
for {
//fmt.Println(i)
i++
}
}
top命令結果2.多核打滿
多進程代碼
package main
func CPU1()() {
i := 0
for {
//fmt.Println(i)
i++
}
}
func CPU2()() {
i := 0
for {
//fmt.Println(i)
i++
}
}
// CPU test
func main() {
go CPU1()
go CPU2()
i := 0
for {
//fmt.Println(i)
i++
}
}
TOP結果圖使用top命令查看
top -H
mpstat結果
四除破、結論
從多核CPU利用率的結果看到牧氮,如果進程使用了多個核,ps命令看到的進程使用率是每個核使用率相加瑰枫,是會超過100%踱葛。
查看man ps中的解釋,ps命令計算CPU使用率的方法是
%cpu %CPU cpu utilization of the process in "##.#" format. Currently, it is the CPU time used divided by the time the process has been running (cputime/realtime ratio),
expressed as a percentage. It will not add up to 100% unless you are lucky. (alias pcpu).
可以看到光坝,ps命令計算CPU使用率的是用CPU使用時間除以進程存活時間尸诽,ps算的是所有CPU使用率,而不是單個CPU使用率教馆,所以相加是會大于100%的逊谋。
所以,如果要排查CPU使用率高的進程土铺,使用ps并不能準備的反應出當前進程使用的情況胶滋,需要使用類似top,pidstat這種實時統(tǒng)計CPU使用率的工具查看悲敷。