Linux 測試cpu性能詳解
在這篇文章中,主要介紹Linux 測試cpu性能的一些基礎知識.首先介紹一下Linux kernel中的調度器(scheduler),調度器負責調度系統中的兩種資源,一是線程,二是中斷。調度器給不同資源不同的優先級。
Linux 測試cpu性能從高到低為:
1. 硬件中斷(Hardware Interrupts)--這些請求由硬件觸發,比如磁盤已經完成了讀寫任務或是網卡受到了新的數據包。
2. 軟件中斷(Software Interrupts)--這里指的是維護內核運行的內核態軟件中斷。比如內核的時鐘管理進程。
3. 實時進程(Real time threads)--實時進程比內核本身具備更高的優先級,它可以搶占內核的CPU時間片,在2.4內核是一個不可搶占的內核,它中不支持實時程序。
4. 內核進程(Kernel threads)--包括所以的內核程序。
5. 用戶進程(User threads)-- 所有運行在用戶態的進程。
關于Linux 測試cpu性能,有3個重要的概念:上下文切換(context switchs),運行隊列(Run queue)和使用率(utilization)。
上下文切換:
目前流行的CPU在同一時間內只能運行一個線程,超線程的處理器可以在同一時間運行多個線程(包括多核CPU),Linux內核會把多核的處理器當作多個單獨的CPU來識別。
一個標準的Linux內核何以支持運行50~50000個進程運行,對于普通的CPU,內核會調度和執行這些進程。每個進程都會分到CPU的時間片來運行,當一個進程用完時間片或者被更高優先級的進程搶占后,它會備份到CPU的運行隊列中,同時其他進程在CPU上運行。這個進程切換的過程被稱作上下文切換。過多的上下文切換會造成系統很大的開銷。
運行隊列:
每個CPU都會維持一個運行隊列,理想情況下,調度器會不斷讓隊列中的進程運行。進程不是處在sleep狀態就是run able狀態。 如果CPU過載,就會出現調度器跟不上系統的要求,導致可運行的進程會填滿隊列。隊列愈大,程序執行時間就愈長。“load”用來表示運行隊列,用top命令我們可以看到CPU一分鐘,5分鐘和15分鐘內的運行隊列的大小。這個值越大表明系統負荷越大。
Linux 測試cpu性能CPU使用率:
CPU使用率可分為一下幾個部分
User Time—執行用戶進程的時間百分比;
System Time—執行內核進程和中斷的時間百分比;
Wait IO—因為IO等待而使CPU處于idle狀態的時間百分比;
Idle—CPU處于Idle狀態的時間百分比。
關于時間片和動態優先級:
時間片對于CPU來說是很關鍵的參數,如果時間片太長,就會使系統的交互性能變差,用戶感覺不到并行。如果太短,又會造成系統頻繁的上下文切換,使性能下降。對于IO Bound的系統來講并不需要太長的時間片,因為系統主要是IO操作;而對于CPU Bound的系統來說需要長的時間片以保持cache的有效性。每一個進程啟動的時候系統都會給出一個默認的優先級,但在運行過程中,系統會根據進程的運行狀況不斷調整優先級,內核會升高或降低進程的優先級(每次增加或降低5),判斷標準是根據進程處于sleep狀態的時間。IO Bound進程大部分時間在sleep狀態,所以內核會調高它的優先級,CPU Bound進程會被內核懲罰降低優先級。因此,如果一個系統上即運行IO Bound進程,又運行CPU Bound進程,我們會發現,IO Bound進程的性能不會下降,而CPU Bound進程性能會不斷下降。
我們運行一個CPU Bound的程序:cpu-hog。用ps命令可以看出它的優先級在不斷下降。
- term1# ./cpu-hog
- term2# while :; do ps -eo pid,ni,pri,pcpu,comm | egrep
- 'hog|PRI'; sleep 1; done
- PID NI PRI %CPU COMMAND
- 22855 0 20 84.5 cpu-hog
- PID NI PRI %CPU COMMAND
- 22855 0 18 89.6 cpu-hog
- PID NI PRI %CPU COMMAND
- 22855 0 15 92.2 cpu-hog
- PID NI PRI %CPU COMMAND
- 22855 0 15 93.8 cpu-hog
我們運行find命令,是一個IO Bound的程序,可以觀察到它的優先級不斷提高。
- term1# find /
- term2# while :; do ps -eo pid,ni,pri,pcpu,comm | egrep
- 'find|PRI'; sleep 1; done
- PID NI PRI %CPU COMMAND
- 23101 0 20 0.0 find
- PID NI PRI %CPU COMMAND
- 23101 0 21 4.0 find
- PID NI PRI %CPU COMMAND
- 23101 0 23 3.5 find
- PID NI PRI %CPU COMMAND
- 23101 0 23 4.3 find
- PID NI PRI %CPU COMMAND
- 23101 0 23 4.2 find
- PID NI PRI %CPU COMMAND
- 23101 0 23 4.4 find
正如我們之前討論的任何系統的性能比較都是基于基線的,并且監控CPU的性能就是以上3點,運行隊列、CPU使用率和上下文切換。以下是一些對于CPU很普遍的性能要求:
1. 對于每一個CPU來說運行隊列不要超過3,例如,如果是雙核CPU就不要超過6;
2. 如果CPU在滿負荷運行,應該符合下列分布,
a) User Time:65%~70%
b) System Time:30%~35%
c) Idle:0%~5%
3. 對于上下文切換要結合CPU使用率來看,如果CPU使用滿足上述分布,大量的上下文切換也是可以接受的。
常用的監視工具有,vmstat, top,dstat和mpstat.
- # 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 104300 16800 95328 72200 0 0 5 26 7 14 4 1 95 0
- 0 0 104300 16800 95328 72200 0 0 0 24 1021 64 1 1 98 0
- 0 0 104300 16800 95328 72200 0 0 0 0 1009 59 1 1 98 0
r表示運行隊列的大小,
b表示由于IO等待而block的線程數量,
in表示中斷的數量,
cs表示上下文切換的數量,
us表示用戶CPU時間,
sys表示系統CPU時間,
wa表示由于IO等待而是CPU處于idle狀態的時間,
id表示CPU處于idle狀態的總時間。
總結的說,Linux 測試CPU性能監控包含以下方面:
檢查系統的運行隊列,確保每一個CPU的運行隊列不大于3.
確保CPU使用分布滿足70/30原則(用戶70%,系統30%)。
如果系統時間過長,可能是因為頻繁的調度和改變優先級。
CPU Bound進程總是會被懲罰(降低優先級)而IO Bound進程總會被獎勵(提高優先級)。
【編輯推薦】