天天看點

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