vmstat,top,ps aux查看的cpu佔用率不一致的問題
問題:
用vmstat,top,和ps aux三個命令查看進程對cpu的佔用率,數值差異很大。
例:
用 vmstat 查看系統cpu空閒率, id是cpu的空閒率,可以看出,空閒率一直在73%以上
用 ps aux 統計兩個compress進程的cpu佔用率,長時間恆定在15.5%和28.9%
用 top統計兩個compress進程的cpu佔用率,可以看出是一個動態變化的過程
(命令執行結果後面有顯示)
這三個命令查出的cpu利用率不統一
首先,ps aux中兩個compress進程佔用cpu 15.5%+28.9%>40%,再加上其它進程,爲
何vmstat查看cpu空閒率id還能一直大於73%
其次,top命令顯示的進程compress的cpu佔用率和ps顯示的數值差別很大,ps的
cpu佔用率雷打不動,一直是恆定值,
top的比較動態, 難道ps aux顯示的進程cpu佔用率不可靠?
最後,這三個命令查出的cpu佔用率相互之間均不統一,用哪一個更可靠?例如輸入如下命令,粗體字是cpu佔用率
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 432 802660 28724 5747324 0 0 204 770 0 0 6 3 90 2
3 0 432 799196 28724 5747392 0 0 0 152 1455 681 2 2 96 0
0 0 432 802420 28724 5747460 0 0 0 480 1599 1892 10 8 82 0
0 0 432 802292 28724 5747664 0 0 0 440 1859 6179 14 13 73 0
2 0 432 797636 28724 5752084 0 0 0 240 1403 3419 8 7 85 0
1 0 432 798732 28724 5751268 0 0 0 448 1506 4608 10 8 81 0
2 0 432 797924 28724 5752084 0 0 0 192 1752 4332 11 10 79 0
0 0 432 802076 28724 5747936 0 0 0 280 1705 1527 14 6 79 0
$ps aux | grep compress
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
img 6569 15.5 0.2 36716 16540 ? S Aug12 230:57 ./bin/compress 8014
img 6570 28.9 0.2 54592 22524 ? S Aug12 430:28 ./bin/compress 8004
$top | grep compress
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6569 img 16 0 40956 20m 6632 R 10.7 0.3 231:10.12 compress
6570 img 16 0 54592 21m 2456 S 20.3 0.3 430:54.32 compress
6569 img 17 0 36740 16m 2456 S 10.3 0.2 231:10.43 compress
6570 img 16 0 54592 21m 2456 R 58.9 0.3 430:56.09 compress
6569 img 16 0 36716 16m 2456 R 53.9 0.2 231:12.05 compress
6570 img 16 0 58444 24m 4752 R 69.9 0.3 430:58.19 compress
6569 img 16 0 36716 16m 2456 S 60.2 0.2 231:13.86 compress
6570 img 16 0 54592 21m 2456 S 52.6 0.3 430:59.77 compress
6569 img 15 0 36716 16m 2456 S 45.3 0.2 231:15.22 compress
大概看了些源碼,補充一下:
top,ps,vmstat都是根據系統的proc文件進行計算的,其中vmstat,top都使用了/proc/stat文件,而ps,top也使用了/proc/*/stat文件進行計算。
1.vmstat對於cpu idle的計算方式比較複雜,但是顯示的爲平均值,即使用cpu使用時間片的差值/時間間隔/cpu個數(爲物理cpu數目*cpu核心數),其中時間間隔爲vmstat後加的參數,如vmstat 10就爲10s內的平均cpu 佔用率;
2.ps計算的爲每個進程的cpu佔用時間,使用的爲/proc/*/stat文件,其中*爲進程號,計算方式爲使用cpu總的時間片數/Hertz,目前確認爲對於每個物理cpu的佔用比率,因此在雙核機器上顯示的數值需要除以核心數2;
3.top使用的是/proc/stat計算上面顯示的cpu佔用,使用/proc/*/stat計算每個進程佔用的時間。但是計算的方式有所不同,代碼較爲複雜,但是目前確認爲默認顯示爲Irix模式,即爲相對於單個cpu core的佔用的時間,如雙核機器需要將該數值除以2*2計算,通過 shift+i可以進行切換;
通過上述說明可以解釋珺方發現的問題:
問題1:首先,ps aux中兩個compress進程佔用cpu 15.5%+28.9%>40%,再加上其它進程,爲何vmstat查看cpu空閒率id還能一直大於73%
ps的cpu佔用率需要除以雙核cpu數目爲2,因此實際佔用爲(15.5%+28.9% )/2=22.2% ,也就約等於100%-73%;
問題2:其次,top命令顯示的進程compress的cpu佔用率和ps顯示的數值差別很大,ps的cpu佔用率雷打不動,一直是恆定值,top的比較動態, 難道ps aux顯示的進程cpu佔用率不可靠?
ps和top相差的數值爲2倍關係,因此顯示的佔用率相差很大,同時變化率也會較大;
問題3:最後,這三個命令查出的cpu佔用率相互之間均不統一,用哪一個更可靠?例如輸入如下命令,粗體字是cpu佔用率
這三個命令的佔用率是統一的,按照如下公式進行計算時數據是一致的:
vmstat 的100%-idle == ps的cpu佔用/cpu核心數 == top的cpu佔用/cpu核心數/物理cpu數目;
用vmstat,top,和ps aux三個命令查看進程對cpu的佔用率,數值差異很大。
例:
用 vmstat 查看系統cpu空閒率, id是cpu的空閒率,可以看出,空閒率一直在73%以上
用 ps aux 統計兩個compress進程的cpu佔用率,長時間恆定在15.5%和28.9%
用 top統計兩個compress進程的cpu佔用率,可以看出是一個動態變化的過程
(命令執行結果後面有顯示)
這三個命令查出的cpu利用率不統一
首先,ps aux中兩個compress進程佔用cpu 15.5%+28.9%>40%,再加上其它進程,爲
何vmstat查看cpu空閒率id還能一直大於73%
其次,top命令顯示的進程compress的cpu佔用率和ps顯示的數值差別很大,ps的
cpu佔用率雷打不動,一直是恆定值,
top的比較動態, 難道ps aux顯示的進程cpu佔用率不可靠?
最後,這三個命令查出的cpu佔用率相互之間均不統一,用哪一個更可靠?例如輸入如下命令,粗體字是cpu佔用率
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 432 802660 28724 5747324 0 0 204 770 0 0 6 3 90 2
3 0 432 799196 28724 5747392 0 0 0 152 1455 681 2 2 96 0
0 0 432 802420 28724 5747460 0 0 0 480 1599 1892 10 8 82 0
0 0 432 802292 28724 5747664 0 0 0 440 1859 6179 14 13 73 0
2 0 432 797636 28724 5752084 0 0 0 240 1403 3419 8 7 85 0
1 0 432 798732 28724 5751268 0 0 0 448 1506 4608 10 8 81 0
2 0 432 797924 28724 5752084 0 0 0 192 1752 4332 11 10 79 0
0 0 432 802076 28724 5747936 0 0 0 280 1705 1527 14 6 79 0
$ps aux | grep compress
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
img 6569 15.5 0.2 36716 16540 ? S Aug12 230:57 ./bin/compress 8014
img 6570 28.9 0.2 54592 22524 ? S Aug12 430:28 ./bin/compress 8004
$top | grep compress
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6569 img 16 0 40956 20m 6632 R 10.7 0.3 231:10.12 compress
6570 img 16 0 54592 21m 2456 S 20.3 0.3 430:54.32 compress
6569 img 17 0 36740 16m 2456 S 10.3 0.2 231:10.43 compress
6570 img 16 0 54592 21m 2456 R 58.9 0.3 430:56.09 compress
6569 img 16 0 36716 16m 2456 R 53.9 0.2 231:12.05 compress
6570 img 16 0 58444 24m 4752 R 69.9 0.3 430:58.19 compress
6569 img 16 0 36716 16m 2456 S 60.2 0.2 231:13.86 compress
6570 img 16 0 54592 21m 2456 S 52.6 0.3 430:59.77 compress
6569 img 15 0 36716 16m 2456 S 45.3 0.2 231:15.22 compress
大概看了些源碼,補充一下:
top,ps,vmstat都是根據系統的proc文件進行計算的,其中vmstat,top都使用了/proc/stat文件,而ps,top也使用了/proc/*/stat文件進行計算。
1.vmstat對於cpu idle的計算方式比較複雜,但是顯示的爲平均值,即使用cpu使用時間片的差值/時間間隔/cpu個數(爲物理cpu數目*cpu核心數),其中時間間隔爲vmstat後加的參數,如vmstat 10就爲10s內的平均cpu 佔用率;
2.ps計算的爲每個進程的cpu佔用時間,使用的爲/proc/*/stat文件,其中*爲進程號,計算方式爲使用cpu總的時間片數/Hertz,目前確認爲對於每個物理cpu的佔用比率,因此在雙核機器上顯示的數值需要除以核心數2;
3.top使用的是/proc/stat計算上面顯示的cpu佔用,使用/proc/*/stat計算每個進程佔用的時間。但是計算的方式有所不同,代碼較爲複雜,但是目前確認爲默認顯示爲Irix模式,即爲相對於單個cpu core的佔用的時間,如雙核機器需要將該數值除以2*2計算,通過 shift+i可以進行切換;
通過上述說明可以解釋珺方發現的問題:
問題1:首先,ps aux中兩個compress進程佔用cpu 15.5%+28.9%>40%,再加上其它進程,爲何vmstat查看cpu空閒率id還能一直大於73%
ps的cpu佔用率需要除以雙核cpu數目爲2,因此實際佔用爲(15.5%+28.9% )/2=22.2% ,也就約等於100%-73%;
問題2:其次,top命令顯示的進程compress的cpu佔用率和ps顯示的數值差別很大,ps的cpu佔用率雷打不動,一直是恆定值,top的比較動態, 難道ps aux顯示的進程cpu佔用率不可靠?
ps和top相差的數值爲2倍關係,因此顯示的佔用率相差很大,同時變化率也會較大;
問題3:最後,這三個命令查出的cpu佔用率相互之間均不統一,用哪一個更可靠?例如輸入如下命令,粗體字是cpu佔用率
這三個命令的佔用率是統一的,按照如下公式進行計算時數據是一致的:
vmstat 的100%-idle == ps的cpu佔用/cpu核心數 == top的cpu佔用/cpu核心數/物理cpu數目;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.