Linux kernel 性能優化(三)CPU性能監控

要理解CPU的性能,就要懂得解讀運行隊列,使用率以及上下文切換。正如前文描述,性能是和基準數據相關。然而在任何系統上都有通用的性能期望。這些期望包括:
• 運行隊列

-- 一個處理器上的運行隊列應該有少於1-3個線程。也就是說一個雙核系統的運行隊列上不應該有多於六個線程。


• CPU使用率

– 如果一個CPU被完全使用,那麼應該達到以下的平衡

• 65% – 70% User Time
• 30% - 35% System Time
• 0% - 5% Idle Time

• 上下文切換

– 上下文切換的總量與CPU佔用率直接相關。如果CPU佔用率在上述的平衡中,那麼大量的上下文切換是可以接受的。Linux下有許多可用的工具用來衡量這些數據。頭兩個工具就是vmstat & top.


3.1 使用vmstat
vmstat工具提供了一個很好的低開銷的監聽系統性能的方式。因爲vmstat是如此低開銷的工具,在高負載的服務器上仍舊可以用它在console下使用來監聽系統的健康。這個工具有兩種運行模式:平均模式和採樣模式。採樣模式將會在一個特定的間隔中測量數據,這種模式在持續負載的情況下非常有用。以下vmstat是在一秒的間隔下運行。

alpha-> vmstat
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy wa id
0 0 200560 88796 88612 179036 0 1 1 20 112 20 3 1 1 96

輸出中相關的域如下所示:
R:運行隊列中的進程數。這些是可運行進程,不過CPU還無法執行他們。
B:被阻塞等待IO請求結束的進程數。
In:中斷執行數目。
Cs:當前系統中發生的上下文切換數。
Us:用戶CPU佔用百分比。
Sys:內核和中斷佔用百分比。
Wa:所有可運行進程都被IO請求阻塞,所導致的CPU空閒時間。
Id: CPU完全空閒的時間百分比。

3.1.1 案例分析:應用Spike
在接下來這個例子中,一個系統正在經歷CPU性能起伏,從完全空閒到完全被佔用。
alpha-> vmstat 1
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy wa id
4 0 200560 91656 88596 176092 0 0 0 0 103 12 0 0 0 100
0 0 200560 91660 88600 176092 0 0 0 0 104 12 0 0 0 100
0 0 200560 91660 88600 176092 0 0 0 0 103 16 1 0 0 99
0 0 200560 91660 88600 176092 0 0 0 0 103 12 0 0 0 100
0 0 200560 91660 88604 176092 0 0 0 80 108 28 0 0 6 94
0 0 200560 91660 88604 176092 0 0 0 0 103 12 0 0 0 100
1 0 200560 91660 88604 176092 0 0 0 0 103 12 0 0 0 100
1 0 200560 91652 88604 176092 0 0 0 0 113 27 14 3 0 83
1 0 200560 84176 88604 176092 0 0 0 0 104 14 95 5 0 0
2 0 200560 87216 88604 176092 0 0 0 324 137 96 86 9 1 4
2 0 200560 78592 88604 176092 0 0 0 0 104 23 97 3 0 0
2 0 200560 90940 88604 176092 0 0 0 0 149 63 92 8 0 0
2 0 200560 83036 88604 176092 0 0 0 0 104 32 97 3 0 0
2 0 200560 74916 88604 176092 0 0 0 0 103 22 93 7 0 0
2 0 200560 80188 88608 176092 0 0 0 376 130 104 70 30 0 0
3 0 200560 74028 88608 176092 0 0 0 0 103 69 70 30 0 0
2 0 200560 81560 88608 176092 0 0 0 0 219 213 38 62 0 0
1 0 200560 90200 88608 176100 0 0 8 0 153 118 56 31 0 13
0 0 200560 88692 88612 179036 0 0 2940 0 249 249 44 4 24 28
2 0 200560 88708 88612 179036 0 0 0 484 254 94 39 22 1 38
0 0 200560 88708 88612 179036 0 0 0 0 121 22 0 0 0 100
0 0 200560 88708 88612 179036 0 0 0 0 103 12 0 0 0 100
可以根據觀察得到以下結論:
•運行隊列在高峯時到達了3,幾乎要超過閾值。
•用戶空間的CPU佔用時間幾乎要到達90%,接着馬上就降下來。
•在這段時間裏,上下文切換並沒有顯著的增加,這個可以說明一個單獨的線程應用在段時間裏佔用了大量的處理器資源。
•這個看起來像是一個應用在一個動作裏批處理了所有寫磁盤的動作。有一秒,CPU經歷了磁盤使用的高峯 (wa = 24%)

3.1.2 案例分析:可持續的CPU佔用
下個例子中,整個系統被完全佔用了。
# vmstat 1
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy wa id
3 0 206564 15092 80336 176080 0 0 0 0 718 26 81 19 0 0
2 0 206564 14772 80336 176120 0 0 0 0 758 23 96 4 0 0
1 0 206564 14208 80336 176136 0 0 0 0 820 20 96 4 0 0
1 0 206956 13884 79180 175964 0 412 0 2680 1008 80 93 7 0 0
2 0 207348 14448 78800 175576 0 412 0 412 763 70 84 16 0 0
2 0 207348 15756 78800 175424 0 0 0 0 874 25 89 11 0 0
1 0 207348 16368 78800 175596 0 0 0 0 940 24 86 14 0 0
1 0 207348 16600 78800 175604 0 0 0 0 929 27 95 3 0 2
3 0 207348 16976 78548 175876 0 0 0 2508 969 35 93 7 0 0
4 0 207348 16216 78548 175704 0 0 0 0 874 36 93 6 0 1
4 0 207348 16424 78548 175776 0 0 0 0 850 26 77 23 0 0
2 0 207348 17496 78556 175840 0 0 0 0 736 23 83 17 0 0
0 0 207348 17680 78556 175868 0 0 0 0 861 21 91 8 0 1
根據輸出有以下觀察:
•大量的中斷和少量的上下文切換。看起來有一個進程在不斷的請求硬件設備。
•有進一步證據表明是某個單獨的應用,us時間保持在85%以上。並且只有少量的上下文切換,某個進程一直佔用了處理器
•運行隊列一直在可接受的性能邊緣。甚至有幾次超過了可接受的極限。

3.1.3 案例分析:超負荷調度器
再接下來這個例子裏,內核調度器不斷進行上下文切換以至於飽和。
alpha-> vmstat 1
procs memory swap io system cpu
r b swpd free buff cache si so bi bo in cs us sy wa id
2 1 207740 98476 81344 180972 0 0 2496 0 900 2883 4 12 57 27
0 1 207740 96448 83304 180984 0 0 1968 328 810 2559 8 9 83 0
0 1 207740 94404 85348 180984 0 0 2044 0 829 2879 9 6 78 7
0 1 207740 92576 87176 180984 0 0 1828 0 689 2088 3 9 78 10
2 0 207740 91300 88452 180984 0 0 1276 0 565 2182 7 6 83 4
3 1 207740 90124 89628 180984 0 0 1176 0 551 2219 2 7 91 0
4 2 207740 89240 90512 180984 0 0 880 520 443 907 22 10 67 0
5 3 207740 88056 91680 180984 0 0 1168 0 628 1248 12 11 77 0
4 2 207740 86852 92880 180984 0 0 1200 0 654 1505 6 7 87 0
6 1 207740 85736 93996 180984 0 0 1116 0 526 1512 5 10 85 0
0 1 207740 84844 94888 180984 0 0 892 0 438 1556 6 4 90 0
根據輸出可以得出以下結論:
•上下文切換的總量比中斷高,意味着內核正在使用可接受的上下文切換的總量。
•大量的上下文切換導致了一個不健康的CPU使用率負載。這個可以根據IO等待的比例非常高而用戶消耗比例非常低推斷而得。
•因爲CPU被IO等待阻塞住,運行隊列開始被填充並且阻塞在IO的線程也變多。

3.2 使用mpstat工具
如果你的系統是多核處理器,即可以用mpstat命令來監控麼個單獨的核。Linux內核對待一個雙核處理器爲兩個CPU。所以,一個有兩個CPU的雙核處理器系統將會顯示爲4個可用CPU。mpstat命令提供和vmstat同樣的CPU使用數據,不過mpstat把數據分解到每個獨立的處理器上。
# mpstat –P ALL 1
Linux 2.4.21-20.ELsmp (localhost.localdomain) 05/23/2006
05:17:31 PM CPU %user %nice %system %idle intr/s
05:17:32 PM all 0.00 0.00 3.19 96.53 13.27
05:17:32 PM 0 0.00 0.00 0.00 100.00 0.00
05:17:32 PM 1 1.12 0.00 12.73 86.15 13.27
05:17:32 PM 2 0.00 0.00 0.00 100.00 0.00
05:17:32 PM 3 0.00 0.00 0.00 100.00 0.00

3.2.1 案例分析:未完全利用的處理器負載
在以下案例中,是一個4CPU的處理器。其中有兩個CPU緊張地運行(CPU 0 & 1).第三個CPU處理所有內核和其他系統功能(CPU 3)。第四個處理器一直保持空閒(CPU 2)。
# mpstat –P ALL 1
Linux 2.4.21-20.ELsmp (localhost.localdomain) 05/23/2006
05:17:31 PM CPU %user %nice %system %idle intr/s
05:17:32 PM all 81.52 0.00 18.48 21.17 130.58
05:17:32 PM 0 83.67 0.00 17.35 0.00 115.31
05:17:32 PM 1 80.61 0.00 19.39 0.00 13.27
05:17:32 PM 2 0.00 0.00 16.33 84.66 2.01
05:17:32 PM 3 79.59 0.00 21.43 0.00 0.00
05:17:32 PM CPU %user %nice %system %idle intr/s
05:17:33 PM all 85.86 0.00 14.14 25.00 116.49
05:17:33 PM 0 88.66 0.00 12.37 0.00 116.49
05:17:33 PM 1 80.41 0.00 19.59 0.00 0.00
05:17:33 PM 2 0.00 0.00 0.00 100.00 0.00
05:17:33 PM 3 83.51 0.00 16.49 0.00 0.00
05:17:33 PM CPU %user %nice %system %idle intr/s
05:17:34 PM all 82.74 0.00 17.26 25.00 115.31
05:17:34 PM 0 85.71 0.00 13.27 0.00 115.31
05:17:34 PM 1 78.57 0.00 21.43 0.00 0.00
05:17:34 PM 2 0.00 0.00 0.00 100.00 0.00
05:17:34 PM 3 92.86 0.00 9.18 0.00 0.00
05:17:34 PM CPU %user %nice %system %idle intr/s
05:17:35 PM all 87.50 0.00 12.50 25.00 115.31
05:17:35 PM 0 91.84 0.00 8.16 0.00 114.29
05:17:35 PM 1 90.82 0.00 10.20 0.00 1.02
05:17:35 PM 2 0.00 0.00 0.00 100.00 0.00
05:17:35 PM 3 81.63 0.00 15.31 0.00 0.00

3.3 CPU性能優化
Linux 2.6 內核並沒有提供任何給CPU子系統可優化的參數。最好的優化方式就是熟悉正常的CPU使用比率。如果一個CPU被過度使用,用類似top和ps這樣的命令來定位出問題的進程,這個進程或許需要被移到另一個系統或者提供給它更多的硬件資源。
下面這個top的輸出顯示了一個運行StrongMail MTA服務器的CPU使用信息。這個系統處在一個可接受的CPU使用範圍內。任何多餘的StrongMail MTA將會需要額外的CPU。
# top
Tasks: 102 total, 5 running,
97 sleeping, 0 stopped,m 406m 69m R 89.6 10.0 26:15.64 strongmail-sm
0 zombie
Cpu(s): 51.8% us, 47.8% sy,
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2717 strongma 18 0 799m 703m 68m R 12.6 17.4 29:43.39 strongmail-sm
tp :03.85 strongmail-smtp
2663 strongma 25 0 457m 450m 68m R 36.3 11.1 30:26.71 strongmail-sm
tp
2719 strongma 20 0 408m 406m 69m R 63.6 10.0 26:17.55 strongmail-sm
--More--(74%)4k free, 1543392k m 2428 S 9.1 0.3 2:08.91 strongmail-psto
cached
2702 strongma 15 0 13688 10m 1788 S 0.0 0.2 0:00.97 strongmail-logp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章