分析linux系统的运行性能,Linux系统如何分析CPU的性能瓶颈
以下內(nèi)容來(lái)自轉(zhuǎn)載和自己的初用體驗(yàn)。
vmstat
[root@master ~]# vmstat -n 3
procs? ?---memory--?? ?--swap--?? ?--io--??--system--????--cpu---
r? b??swpd?? free?? buff? cache???si??so???bi???bo????in
cs??????us sy id wa st
0? 0????? 115516 6043024? 430340??8691840????0??0
2???22????1???1???1? 0 99? 0? 0? 0? 0????115516 6043024
430340??8691840????0???0????0???0???1124??751
0? 0 100? 0? 0 ?0? 0????? 115516 6043148
430344???8691840????0???0????0???25???1070?762
0? 0 100? 0? 0
PROC
如果在processes中運(yùn)行的序列是連續(xù)的大于在系統(tǒng)中的CPU的個(gè)數(shù)表示系統(tǒng)現(xiàn)在運(yùn)行比較慢,有多數(shù)的進(jìn)程等待CPU。
如果r的輸出數(shù)大于系統(tǒng)中可用CPU個(gè)數(shù)的4倍的話(huà),則系統(tǒng)面臨著CPU短缺的問(wèn)題,或者是CPU的速率過(guò)低,系統(tǒng)中有多數(shù)的進(jìn)程在等待CPU,造成系統(tǒng)中進(jìn)程運(yùn)行過(guò)慢。
SYSTEM
in: 每秒產(chǎn)生的中斷次數(shù)
cs: 每秒產(chǎn)生的上下文切換次數(shù)
上面2個(gè)值越大,會(huì)看到由內(nèi)核消耗的CPU時(shí)間會(huì)越大
CPU
us:用戶(hù)進(jìn)程消耗的CPU時(shí)間百分比,其中us值比較高時(shí),說(shuō)明用戶(hù)進(jìn)程消耗的CPU時(shí)間多;如果長(zhǎng)期超50%的使用,那么我們?cè)摽紤]優(yōu)化程序算法或者進(jìn)行加速
sy: 內(nèi)核進(jìn)程消耗的CPU時(shí)間百分比(sy的值高時(shí),說(shuō)明系統(tǒng)內(nèi)核消耗的CPU資源多,并不是良性表現(xiàn),我們應(yīng)該檢查原因)
wa:IO等待消耗的CPU時(shí)間百分比(值高時(shí),說(shuō)明IO等待比較嚴(yán)重,這可能由于磁盤(pán)大量作隨機(jī)訪問(wèn)造成,也可能磁盤(pán)出現(xiàn)瓶頸,如塊操作)
id: CPU處于空閑狀態(tài)的百分比,如果空閑時(shí)間持續(xù)為0并且系統(tǒng)時(shí)間是用戶(hù)時(shí)間的兩倍,那么系統(tǒng)則面臨CPU資源的短缺
解決方法:
當(dāng)發(fā)生以上問(wèn)題的時(shí)候請(qǐng)先調(diào)整應(yīng)用程序?qū)PU的占用情況,使得應(yīng)用程序能夠更有效的使用CPU,同時(shí)可以考慮增加更多的CPU,關(guān)于CPU的使用情況還可以結(jié)合mpstat、ps
aux 、top、mpstat
-a等等一些相應(yīng)的命令來(lái)綜合考慮關(guān)于具體的CPU的使用情況,和那些進(jìn)程在占用大量的CPU時(shí)間,一般情況下,應(yīng)用程序的問(wèn)題會(huì)比較大一些。
sar
Usage: sar [ options... ] [ [ ]
]
Options are:
[ -A ] [ -b ] [ -B ] [ -c ] [ -d ] [ -i ] [ -p ] [
-q ]
[ -r ] [ -R ] [ -t ] [ -u ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
[ -I { | SUM | ALL | XALL } ] [ -P { | ALL
} ]
[ -n { DEV | EDEV | NFS | NFSD | SOCK | ALL } ]
[ -x { | SELF | ALL } ] [ -X { | SELF | ALL
} ]
[ -o [ ] | -f [ ] ]
[ -s [ ] ] [ -e [ ] ]
在命令行中,n和t兩個(gè)參數(shù)組合起來(lái)定義采樣間隔和次數(shù),t為采樣間隔,是必須有的參數(shù),n為采樣次數(shù),是可選的,默認(rèn)值為1, -o
file表示將命令的結(jié)果以二進(jìn)制格式存放
在文件中,options為命令可選項(xiàng):
-A:所有報(bào)告的總和。
-u:CPU利用率
-v:進(jìn)程、I節(jié)點(diǎn)、文件和鎖表狀態(tài)。
-d:硬盤(pán)使用報(bào)告。
-r:內(nèi)存和交換空間的使用統(tǒng)計(jì)。
-g:串口I/O的情況。
-b:緩沖區(qū)使用情況。
-a:文件讀寫(xiě)情況。
-c:系統(tǒng)調(diào)用情況。
-q:報(bào)告隊(duì)列長(zhǎng)度和系統(tǒng)平均負(fù)載
-R:進(jìn)程的活動(dòng)情況。
-y:終端設(shè)備活動(dòng)情況。
-w:系統(tǒng)交換活動(dòng)。
-x { pid | SELF | ALL
}:報(bào)告指定進(jìn)程ID的統(tǒng)計(jì)信息,SELF關(guān)鍵字是sar進(jìn)程本身的統(tǒng)計(jì),ALL關(guān)鍵字是所有系統(tǒng)進(jìn)程的統(tǒng)計(jì)。
用sar進(jìn)行CPU利用率的分析
[root@master ~]# sar -u 2 10
Linux 2.6.18-194.el5 (master)?? 12/13/2012
06:50:01 PM
CPU???? %user
%nice?? %system?? %iowait
%steal???? %idle
06:50:03 PM
all
1.50
0.08
0.58
7.24????? 0.00
90.60
06:50:05 PM
all
3.25
0.17
0.58
6.74????? 0.00
89.26
06:50:07 PM
all
1.33
0.08
0.67
8.01????? 0.00
89.91
06:50:09 PM
all
1.25
0.00
0.67
7.35????? 0.00
90.73
06:50:11 PM
all
1.08
0.25
0.42
7.75????? 0.00
90.50
06:50:13 PM
all
1.33
0.08
0.58
8.00????? 0.00
90.00
06:50:15 PM
all
1.42
0.08
0.42
7.18????? 0.00
90.90
06:50:17 PM
all
1.25
0.08
0.42
8.01????? 0.00
90.24
06:50:19 PM
all
1.33
0.08
0.50
8.17????? 0.00
89.92
06:50:21 PM
all
1.25
0.25
0.42
7.17????? 0.00
90.92
Average:
all
1.50
0.12
0.53
7.56????? 0.00
90.30
在顯示內(nèi)容包括:
%user:CPU處在用戶(hù)模式下的時(shí)間百分比
%nice:CPU處在帶NICE值的用戶(hù)模式下的時(shí)間百分比
%system:CPU處在系統(tǒng)模式下的時(shí)間百分比
%iowait:CPU等待輸入輸出完成時(shí)間的百分比
%steal:管理程序維護(hù)另一個(gè)虛擬處理器時(shí),虛擬CPU的無(wú)意識(shí)等待時(shí)間百分比
%idle:CPU空閑時(shí)間百分比
在所有的顯示中,我們應(yīng)該主要注意%iowait和%idle,
%iowait的值過(guò)高,表示硬盤(pán)存在I/O瓶頸,%idle值高,表示CPU較空閑。
如果%idle值高但系統(tǒng)響應(yīng)慢時(shí),有可能是CPU等待分配內(nèi)存,此時(shí)應(yīng)加大內(nèi)存容量。反之如果持續(xù)低于10,那么系統(tǒng)的CPU處理能力相對(duì)較低,表明系統(tǒng)中最需要解決的資源是CPU。
用sar進(jìn)行運(yùn)行進(jìn)程隊(duì)列長(zhǎng)度分析:
[root@master ~]# sar -q 2 10
Linux 2.6.18-194.el5 (master)?? 12/13/2012
06:57:55 PM?? runq-sz? plist-sz
ldavg-1?? ldavg-5? ldavg-15
06:57:57 PM
0????? 1196
0.63
0.48????? 0.30
06:57:59 PM
0????? 1196
0.63
0.48????? 0.30
06:58:01 PM
0????? 1196
0.58
0.47????? 0.30
06:58:03 PM
0????? 1198
0.58
0.47????? 0.30
06:58:05 PM
0????? 1198
0.61
0.48????? 0.30
runq-sz:準(zhǔn)備運(yùn)行的進(jìn)程運(yùn)行隊(duì)列
plist-sz:進(jìn)程隊(duì)列里的進(jìn)程和線程的數(shù)量
ldavg-1:前一分鐘的系統(tǒng)平均負(fù)載(load average)
ldavg-5:前五分鐘的系統(tǒng)平均負(fù)載
ldavg-15:前15分鐘的系統(tǒng)平均負(fù)載
順便說(shuō)一下load average的含義
load avarage可以理解為每秒鐘CPU等待運(yùn)行的進(jìn)程個(gè)數(shù)。
在liunx系統(tǒng)中,有很多命令都會(huì)有系統(tǒng)平均負(fù)載load average的輸出,那么什么是系統(tǒng)負(fù)載呢?
定義:在特定時(shí)間間隔內(nèi)運(yùn)行隊(duì)列中的平均任務(wù)數(shù)。如果一個(gè)進(jìn)程滿(mǎn)足以下條件則其就會(huì)位于運(yùn)行隊(duì)列中:
1、它沒(méi)有在等待I/O操作的結(jié)果
2、它沒(méi)有主動(dòng)進(jìn)入等待狀態(tài)(也就是wait)
3、沒(méi)有被停止
例如:
[root@master ~]# uptime
09:34:05 up 69 days,? 4:00,? 1 user,? load
average: 0.08, 0.02, 0.01
命令輸出的最后內(nèi)容表示在過(guò)去的1、5、15分鐘內(nèi)運(yùn)行隊(duì)列中的平均進(jìn)程數(shù)量。
一般來(lái)說(shuō)只要每個(gè)CPU的當(dāng)前活動(dòng)進(jìn)程數(shù)不大于3那么系統(tǒng)的性能就是良好的,如果每個(gè)CPU的任務(wù)數(shù)大于5,那么就表示這臺(tái)機(jī)器的性能有嚴(yán)重問(wèn)題。
對(duì)于上面的例子來(lái)說(shuō),假設(shè)系統(tǒng)有兩個(gè)CPU,那么其每個(gè)CPU的當(dāng)前任務(wù)數(shù)為:0.08/2=0.04,這表示該系統(tǒng)的性能是可以接受的。
這里有個(gè)思考問(wèn)題,就是當(dāng)CPU是支持超線程的時(shí)候,那么這時(shí)候是除以物理個(gè)數(shù),還是邏輯個(gè)數(shù)?????
iostat
[root@master ~]# iostat -c 2 10
Linux 2.6.18-194.el5 (master)?? 12/14/2012
avg-cpu:? %user?? %nice %system %iowait
%steal?? %idle
1.08??? 0.15
0.14??? 0.05??? 0.00
98.58
avg-cpu:? %user?? %nice %system %iowait
%steal?? %idle
0.00??? 0.00
0.00??? 0.00??? 0.00? 100.00
avg-cpu:? %user?? %nice %system %iowait
%steal?? %idle
0.42??? 0.25
0.00??? 0.00??? 0.00
99.33
avg-cpu:? %user?? %nice %system %iowait
%steal?? %idle
0.00??? 0.08
0.08??? 0.00??? 0.00
99.83
avg-cpu:? %user?? %nice %system %iowait
%steal?? %idle
0.00??? 0.00
0.00??? 0.00??? 0.00? 100.00
mpstat
是Multiprocessor
Statistics的縮寫(xiě),是實(shí)時(shí)系統(tǒng)監(jiān)控工具。其報(bào)告與CPU的一些統(tǒng)計(jì)信息,這些信息存放在/proc/stat文件中。
在多CPU系統(tǒng)里,其不但能查看看到所有CPU的平均狀況信息,而且能夠查看特定的CPU的信息。
mpstat語(yǔ)法如下:
Usage: mpstat [ options... ] [ [ ]
]
Options are:
[ -P { | ALL } ] [ -V ]
參數(shù)含義如下:
-P {| ALL} 表示監(jiān)控哪個(gè)CPU,cpu在[0,cpu個(gè)數(shù)-1]中取值
internal 相鄰的兩次采樣的間隔時(shí)間
count 采樣的次數(shù),count只能和delay一起使用
當(dāng)沒(méi)有參數(shù)時(shí),則顯示系統(tǒng)啟動(dòng)以后所有信息的平均值。(參數(shù)解釋從/proc/stat獲得數(shù)據(jù))
[root@master ~]# mpstat -P 1 2 3
Linux 2.6.18-194.el5 (master)?? 12/14/2012
09:56:35 AM? CPU?? %user
%nice??? %sys %iowait
%irq?? %soft? %steal
%idle??? intr/s
09:56:37 AM??? 1
0.00??? 0.50
0.00??? 0.00
0.00??? 0.00??? 0.00
99.50????? 0.00
09:56:39 AM??? 1
0.00??? 0.00
0.00??? 0.00
0.00??? 0.00??? 0.00
100.00????? 0.00
09:56:41 AM??? 1
0.00??? 0.50
0.00??? 0.00
0.00??? 0.00??? 0.00
99.50????? 0.00
Average:?????? 1
0.00??? 0.33
0.00??? 0.00
0.00??? 0.00??? 0.00
99.67????? 0.00
補(bǔ)充說(shuō)明下,nice值的含義
[root@master ~]# ps -l
F S
UID?????PID
PPID? C?? PRI
NI??ADDR???????SZ
WCHAN
TTY????????? TIME
CMD
4 S???????0 29493
29491?? 0
75
0?????????? -
16559
wait?? pts/1??? 00:00:00 bash
4 R?????? 0 29871
29493?? 0
77
0?????????? -
15887??????????????-????pts/1
00:00:00 ps
UID : 代表執(zhí)行者的身份
PID : 代表這個(gè)進(jìn)程的代號(hào)
PPID :代表這個(gè)進(jìn)程是由哪個(gè)進(jìn)程發(fā)展衍生而來(lái)的,亦即父進(jìn)程的代號(hào)
PRI :代表這個(gè)進(jìn)程可被執(zhí)行的優(yōu)先級(jí),其值越小越早被執(zhí)行
NI :代表這個(gè)進(jìn)程的nice值
這里的前面的三個(gè)信息,我們都是比較好容易理解的,但是后面的兩個(gè)奇怪的信息,一個(gè)是PRI,一個(gè)是NI,這到底是什么東西?相對(duì)而言,PRI也還是比較好理解的,即進(jìn)程的優(yōu)先級(jí),或者通俗點(diǎn)說(shuō)就是程序被CPU執(zhí)行的先后順序,此值越小進(jìn)程的優(yōu)先級(jí)別越高。那NI呢?就是我們所要說(shuō)的nice值了,其表示進(jìn)程可被執(zhí)行的優(yōu)先級(jí)的修正數(shù)值。如前面所說(shuō),PRI值越小越快被執(zhí)行,那么加入nice值后,將會(huì)使得PRI變?yōu)?#xff1a;PRI(new)=PRI(old)+nice。這樣,當(dāng)nice值為負(fù)值的時(shí)候,那么該程序?qū)?huì)優(yōu)先級(jí)值將變小,即其優(yōu)先級(jí)會(huì)變高,則其越快被執(zhí)行。
進(jìn)程在創(chuàng)建時(shí)并不是平等的,他們被賦予不同的優(yōu)先級(jí)值,例如有些對(duì)計(jì)算機(jī)本身的操作至關(guān)重要的程序必須比其他次要的程序具有更高的優(yōu)先級(jí)(則其有更小的優(yōu)先級(jí)值)。而如前面所說(shuō),nice的值是表示進(jìn)程優(yōu)先級(jí)值可被修正數(shù)據(jù)值,因此,每個(gè)進(jìn)程都在其計(jì)劃執(zhí)行時(shí)被賦予一個(gè)系統(tǒng)nice值,這樣系統(tǒng)就可以根據(jù)系統(tǒng)的資源以及具體進(jìn)程的各類(lèi)資源消耗情況,主動(dòng)干預(yù)進(jìn)程的優(yōu)先級(jí)值。這個(gè)過(guò)程,用戶(hù)也可手工干預(yù)其中,但是要被賦予相應(yīng)的權(quán)限。
在UNIX系統(tǒng)或者LINUX系統(tǒng)中,使用從-20到+19的一個(gè)可變數(shù)值來(lái)表示這個(gè)nice值(LINUX和AIX是這種情況,HP-UX系統(tǒng)的值范圍是從0到39),并且在通常情況下,子進(jìn)程會(huì)繼承父進(jìn)程的系統(tǒng)nice值。具有最高優(yōu)先級(jí)的程序,其nice值最低,所以在UNIX和LINUX系統(tǒng)中,值-20使得一項(xiàng)任務(wù)變得非常重要(HP-UX為0);與之相反,如果任務(wù)的
nice 為+19(HP-UX為39),則表示它是一個(gè)高尚的、無(wú)私的任務(wù),允許所有其他任務(wù)比自己享有寶貴的 CPU
時(shí)間的更大使用份額,這也就是nice的名稱(chēng)的意會(huì)來(lái)意。
[root@master ~]# nice
0
root用戶(hù)把nice加3.
[root@master ~]# nice -n 3 ls
123.txt
Desktop
install.log
jrockit-jdk1.6.0_29-R28.1.5-4.0.1
MySQL-python-1.2.3.tar.gz? Python-2.7.3.tgz
setuptools-0.6c8.tar.gz? vmtouch.c
anaconda-ks.cfg???? file1
install.log.syslog
jrockit-jdk1.6.0_29.tar.gz
part-00000.bz2
root
soft
yum_r.txt
cmake-2.8.7.tar.gz? file2
integer.sh
MySQL-python-1.2.3
Python-2.7.3
setuptools-0.6c8? vmtouch
而root用戶(hù)就可以給其子進(jìn)程賦予更小的nice值,如下:
[root@dbbak root]# nice
0
[root@dbbak root]# nice -n -3 ls
123.txt
Desktop
install.log
jrockit-jdk1.6.0_29-R28.1.5-4.0.1
MySQL-python-1.2.3.tar.gz? Python-2.7.3.tgz
setuptools-0.6c8.tar.gz? vmtouch.c
anaconda-ks.cfg???? file1
install.log.syslog
jrockit-jdk1.6.0_29.tar.gz
part-00000.bz2
root
soft
yum_r.txt
cmake-2.8.7.tar.gz? file2
integer.sh
MySQL-python-1.2.3
Python-2.7.3
setuptools-0.6c8? vmtouch
對(duì)于后臺(tái)進(jìn)程,其nice會(huì)在其被顯示賦予的值過(guò)后再加上4。如“nice 12 command
&”命令執(zhí)行時(shí),則其會(huì)以nice=36值來(lái)運(yùn)行程序(HP-UX系統(tǒng))。這里有個(gè)問(wèn)題,即如果用戶(hù)設(shè)置的nice值超過(guò)了nice的邊界值(LINUX和AIX為-20到19,HP-UX為0到39)會(huì)怎樣,則系統(tǒng)就取nice的邊界值作為進(jìn)程的nice值。
與進(jìn)程的nice相關(guān)的命令有2個(gè),分別是nice和renice。
nice命令就是設(shè)置一個(gè)要執(zhí)行command進(jìn)程的nice值,其命令格式是 nice –n adjustment command
command_option,這里就設(shè)置要執(zhí)行的command的nice,如果這里不指定adjustment,則默認(rèn)為10。
renice命令就是設(shè)置一個(gè)已經(jīng)在運(yùn)行的進(jìn)程的nice值,如假設(shè)一運(yùn)行進(jìn)程本來(lái)nice值為0,renice為3后,則這個(gè)運(yùn)行進(jìn)程的nice值就為3了。renice的執(zhí)行必須要有相應(yīng)的權(quán)限方可執(zhí)行。它可以根據(jù)用戶(hù)、進(jìn)程ID、進(jìn)程組來(lái)設(shè)置進(jìn)程的nice值。
對(duì)nice值一個(gè)形象比喻,假設(shè)在一個(gè)CPU輪轉(zhuǎn)中,有2個(gè)runnable的進(jìn)程A和B,如果他們的nice值都為0(如果是HP-UX則為20),加上內(nèi)核會(huì)給他們每人分配1k個(gè)cpu時(shí)間片。但是假設(shè)進(jìn)程A的為0,但是B的值為-10,那么此時(shí)CPU則會(huì)可能分別給A和B分配1k和1.5k的時(shí)間片。故可以形象的理解為,nice的值影響了內(nèi)核分配給進(jìn)程的cpu時(shí)間片的多少,時(shí)間片越多的進(jìn)程,其優(yōu)先級(jí)越高,其優(yōu)先級(jí)值越低。
從使用top、ps等命令看到的nice值,就是進(jìn)程所擁有的nice值,使用iostat等看到的%nice,就是用戶(hù)進(jìn)程空間中改變過(guò)優(yōu)先級(jí)的進(jìn)程的占用CPU的百分比,如上例中就說(shuō)0.5k/2.5k=1/5=20%。
到目前為止,更需要強(qiáng)調(diào)一點(diǎn)的是,進(jìn)程的nice值不是進(jìn)程的優(yōu)先級(jí),他們不是一個(gè)概念,但是進(jìn)程nice值會(huì)影響到進(jìn)程的優(yōu)先級(jí)變化。
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的分析linux系统的运行性能,Linux系统如何分析CPU的性能瓶颈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 股票分配方案10派4元是什么意思
- 下一篇: linux 时间戳 c语言,c语言中的时