Linux 測(cè)試cpu性能詳解
在這篇文章中,主要介紹Linux 測(cè)試cpu性能的一些基礎(chǔ)知識(shí).首先介紹一下Linux kernel中的調(diào)度器(scheduler),調(diào)度器負(fù)責(zé)調(diào)度系統(tǒng)中的兩種資源,一是線程,二是中斷。調(diào)度器給不同資源不同的優(yōu)先級(jí)。
Linux 測(cè)試cpu性能從高到低為:
1. 硬件中斷(Hardware Interrupts)--這些請(qǐng)求由硬件觸發(fā),比如磁盤(pán)已經(jīng)完成了讀寫(xiě)任務(wù)或是網(wǎng)卡受到了新的數(shù)據(jù)包。
2. 軟件中斷(Software Interrupts)--這里指的是維護(hù)內(nèi)核運(yùn)行的內(nèi)核態(tài)軟件中斷。比如內(nèi)核的時(shí)鐘管理進(jìn)程。
3. 實(shí)時(shí)進(jìn)程(Real time threads)--實(shí)時(shí)進(jìn)程比內(nèi)核本身具備更高的優(yōu)先級(jí),它可以搶占內(nèi)核的CPU時(shí)間片,在2.4內(nèi)核是一個(gè)不可搶占的內(nèi)核,它中不支持實(shí)時(shí)程序。
4. 內(nèi)核進(jìn)程(Kernel threads)--包括所以的內(nèi)核程序。
5. 用戶(hù)進(jìn)程(User threads)-- 所有運(yùn)行在用戶(hù)態(tài)的進(jìn)程。
關(guān)于Linux 測(cè)試cpu性能,有3個(gè)重要的概念:上下文切換(context switchs),運(yùn)行隊(duì)列(Run queue)和使用率(utilization)。
上下文切換:
目前流行的CPU在同一時(shí)間內(nèi)只能運(yùn)行一個(gè)線程,超線程的處理器可以在同一時(shí)間運(yùn)行多個(gè)線程(包括多核CPU),Linux內(nèi)核會(huì)把多核的處理器當(dāng)作多個(gè)單獨(dú)的CPU來(lái)識(shí)別。
一個(gè)標(biāo)準(zhǔn)的Linux內(nèi)核何以支持運(yùn)行50~50000個(gè)進(jìn)程運(yùn)行,對(duì)于普通的CPU,內(nèi)核會(huì)調(diào)度和執(zhí)行這些進(jìn)程。每個(gè)進(jìn)程都會(huì)分到CPU的時(shí)間片來(lái)運(yùn)行,當(dāng)一個(gè)進(jìn)程用完時(shí)間片或者被更高優(yōu)先級(jí)的進(jìn)程搶占后,它會(huì)備份到CPU的運(yùn)行隊(duì)列中,同時(shí)其他進(jìn)程在CPU上運(yùn)行。這個(gè)進(jìn)程切換的過(guò)程被稱(chēng)作上下文切換。過(guò)多的上下文切換會(huì)造成系統(tǒng)很大的開(kāi)銷(xiāo)。
運(yùn)行隊(duì)列:
每個(gè)CPU都會(huì)維持一個(gè)運(yùn)行隊(duì)列,理想情況下,調(diào)度器會(huì)不斷讓隊(duì)列中的進(jìn)程運(yùn)行。進(jìn)程不是處在sleep狀態(tài)就是run able狀態(tài)。 如果CPU過(guò)載,就會(huì)出現(xiàn)調(diào)度器跟不上系統(tǒng)的要求,導(dǎo)致可運(yùn)行的進(jìn)程會(huì)填滿(mǎn)隊(duì)列。隊(duì)列愈大,程序執(zhí)行時(shí)間就愈長(zhǎng)。“load”用來(lái)表示運(yùn)行隊(duì)列,用top命令我們可以看到CPU一分鐘,5分鐘和15分鐘內(nèi)的運(yùn)行隊(duì)列的大小。這個(gè)值越大表明系統(tǒng)負(fù)荷越大。
Linux 測(cè)試cpu性能CPU使用率:
CPU使用率可分為一下幾個(gè)部分
User Time—執(zhí)行用戶(hù)進(jìn)程的時(shí)間百分比;
System Time—執(zhí)行內(nèi)核進(jìn)程和中斷的時(shí)間百分比;
Wait IO—因?yàn)镮O等待而使CPU處于idle狀態(tài)的時(shí)間百分比;
Idle—CPU處于Idle狀態(tài)的時(shí)間百分比。
關(guān)于時(shí)間片和動(dòng)態(tài)優(yōu)先級(jí):
時(shí)間片對(duì)于CPU來(lái)說(shuō)是很關(guān)鍵的參數(shù),如果時(shí)間片太長(zhǎng),就會(huì)使系統(tǒng)的交互性能變差,用戶(hù)感覺(jué)不到并行。如果太短,又會(huì)造成系統(tǒng)頻繁的上下文切換,使性能下降。對(duì)于IO Bound的系統(tǒng)來(lái)講并不需要太長(zhǎng)的時(shí)間片,因?yàn)橄到y(tǒng)主要是IO操作;而對(duì)于CPU Bound的系統(tǒng)來(lái)說(shuō)需要長(zhǎng)的時(shí)間片以保持cache的有效性。每一個(gè)進(jìn)程啟動(dòng)的時(shí)候系統(tǒng)都會(huì)給出一個(gè)默認(rèn)的優(yōu)先級(jí),但在運(yùn)行過(guò)程中,系統(tǒng)會(huì)根據(jù)進(jìn)程的運(yùn)行狀況不斷調(diào)整優(yōu)先級(jí),內(nèi)核會(huì)升高或降低進(jìn)程的優(yōu)先級(jí)(每次增加或降低5),判斷標(biāo)準(zhǔn)是根據(jù)進(jìn)程處于sleep狀態(tài)的時(shí)間。IO Bound進(jìn)程大部分時(shí)間在sleep狀態(tài),所以?xún)?nèi)核會(huì)調(diào)高它的優(yōu)先級(jí),CPU Bound進(jìn)程會(huì)被內(nèi)核懲罰降低優(yōu)先級(jí)。因此,如果一個(gè)系統(tǒng)上即運(yùn)行IO Bound進(jìn)程,又運(yùn)行CPU Bound進(jìn)程,我們會(huì)發(fā)現(xiàn),IO Bound進(jìn)程的性能不會(huì)下降,而CPU Bound進(jìn)程性能會(huì)不斷下降。
我們運(yùn)行一個(gè)CPU Bound的程序:cpu-hog。用ps命令可以看出它的優(yōu)先級(jí)在不斷下降。
- 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
我們運(yùn)行find命令,是一個(gè)IO Bound的程序,可以觀察到它的優(yōu)先級(jí)不斷提高。
- 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
正如我們之前討論的任何系統(tǒng)的性能比較都是基于基線的,并且監(jiān)控CPU的性能就是以上3點(diǎn),運(yùn)行隊(duì)列、CPU使用率和上下文切換。以下是一些對(duì)于CPU很普遍的性能要求:
1. 對(duì)于每一個(gè)CPU來(lái)說(shuō)運(yùn)行隊(duì)列不要超過(guò)3,例如,如果是雙核CPU就不要超過(guò)6;
2. 如果CPU在滿(mǎn)負(fù)荷運(yùn)行,應(yīng)該符合下列分布,
a) User Time:65%~70%
b) System Time:30%~35%
c) Idle:0%~5%
3. 對(duì)于上下文切換要結(jié)合CPU使用率來(lái)看,如果CPU使用滿(mǎn)足上述分布,大量的上下文切換也是可以接受的。
常用的監(jiān)視工具有,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表示運(yùn)行隊(duì)列的大小,
b表示由于IO等待而block的線程數(shù)量,
in表示中斷的數(shù)量,
cs表示上下文切換的數(shù)量,
us表示用戶(hù)CPU時(shí)間,
sys表示系統(tǒng)CPU時(shí)間,
wa表示由于IO等待而是CPU處于idle狀態(tài)的時(shí)間,
id表示CPU處于idle狀態(tài)的總時(shí)間。
總結(jié)的說(shuō),Linux 測(cè)試CPU性能監(jiān)控包含以下方面:
檢查系統(tǒng)的運(yùn)行隊(duì)列,確保每一個(gè)CPU的運(yùn)行隊(duì)列不大于3.
確保CPU使用分布滿(mǎn)足70/30原則(用戶(hù)70%,系統(tǒng)30%)。
如果系統(tǒng)時(shí)間過(guò)長(zhǎng),可能是因?yàn)轭l繁的調(diào)度和改變優(yōu)先級(jí)。
CPU Bound進(jìn)程總是會(huì)被懲罰(降低優(yōu)先級(jí))而IO Bound進(jìn)程總會(huì)被獎(jiǎng)勵(lì)(提高優(yōu)先級(jí))。
【編輯推薦】
























