1. 程式人生 > >Linux 測試cpu效能詳解

Linux 測試cpu效能詳解

原帖地址:http://os.51cto.com/art/201006/203872.htm


在這篇文章中,主要介紹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命令可以看出它的優先順序在不斷下降。
 


 
  1. term1# ./cpu-hog  
  2. term2# while :; do ps -eo pid,ni,pri,pcpu,comm | egrep  
  3. 'hog|PRI'; sleep 1; done  
  4. PID NI PRI %CPU COMMAND  
  5. 22855 0 20 84.5 cpu-hog  
  6. PID NI PRI %CPU COMMAND  
  7. 22855 0 18 89.6 cpu-hog  
  8. PID NI PRI %CPU COMMAND  
  9. 22855 0 15 92.2 cpu-hog  
  10. PID NI PRI %CPU COMMAND  
  11. 22855 0 15 93.8 cpu-hog  

我們執行find命令,是一個IO Bound的程式,可以觀察到它的優先順序不斷提高。
 


 
  1. term1# find /  
  2. term2# while :; do ps -eo pid,ni,pri,pcpu,comm | egrep  
  3. 'find|PRI'; sleep 1; done  
  4. PID NI PRI %CPU COMMAND  
  5. 23101 0 20 0.0 find  
  6. PID NI PRI %CPU COMMAND  
  7. 23101 0 21 4.0 find  
  8. PID NI PRI %CPU COMMAND  
  9. 23101 0 23 3.5 find  
  10. PID NI PRI %CPU COMMAND  
  11. 23101 0 23 4.3 find  
  12. PID NI PRI %CPU COMMAND  
  13. 23101 0 23 4.2 find  
  14. PID NI PRI %CPU COMMAND  
  15. 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.
 


 
  1. # vmstat 1  
  2. procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----  
  3. r b swpd free buff cache si so bi bo in cs us sy id wa  
  4. 0 0 104300 16800 95328 72200 0 0 5 26 7 14 4 1 95 0  
  5. 0 0 104300 16800 95328 72200 0 0 0 24 1021 64 1 1 98 0  
  6. 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程序總會被獎勵(提高優先順序)。