分析linux系统的运行性能,Linux系统如何分析CPU的性能瓶颈
以下內容來自轉載和自己的初用體驗。
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中運行的序列是連續的大于在系統中的CPU的個數表示系統現在運行比較慢,有多數的進程等待CPU。
如果r的輸出數大于系統中可用CPU個數的4倍的話,則系統面臨著CPU短缺的問題,或者是CPU的速率過低,系統中有多數的進程在等待CPU,造成系統中進程運行過慢。
SYSTEM
in: 每秒產生的中斷次數
cs: 每秒產生的上下文切換次數
上面2個值越大,會看到由內核消耗的CPU時間會越大
CPU
us:用戶進程消耗的CPU時間百分比,其中us值比較高時,說明用戶進程消耗的CPU時間多;如果長期超50%的使用,那么我們該考慮優化程序算法或者進行加速
sy: 內核進程消耗的CPU時間百分比(sy的值高時,說明系統內核消耗的CPU資源多,并不是良性表現,我們應該檢查原因)
wa:IO等待消耗的CPU時間百分比(值高時,說明IO等待比較嚴重,這可能由于磁盤大量作隨機訪問造成,也可能磁盤出現瓶頸,如塊操作)
id: CPU處于空閑狀態的百分比,如果空閑時間持續為0并且系統時間是用戶時間的兩倍,那么系統則面臨CPU資源的短缺
解決方法:
當發生以上問題的時候請先調整應用程序對CPU的占用情況,使得應用程序能夠更有效的使用CPU,同時可以考慮增加更多的CPU,關于CPU的使用情況還可以結合mpstat、ps
aux 、top、mpstat
-a等等一些相應的命令來綜合考慮關于具體的CPU的使用情況,和那些進程在占用大量的CPU時間,一般情況下,應用程序的問題會比較大一些。
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兩個參數組合起來定義采樣間隔和次數,t為采樣間隔,是必須有的參數,n為采樣次數,是可選的,默認值為1, -o
file表示將命令的結果以二進制格式存放
在文件中,options為命令可選項:
-A:所有報告的總和。
-u:CPU利用率
-v:進程、I節點、文件和鎖表狀態。
-d:硬盤使用報告。
-r:內存和交換空間的使用統計。
-g:串口I/O的情況。
-b:緩沖區使用情況。
-a:文件讀寫情況。
-c:系統調用情況。
-q:報告隊列長度和系統平均負載
-R:進程的活動情況。
-y:終端設備活動情況。
-w:系統交換活動。
-x { pid | SELF | ALL
}:報告指定進程ID的統計信息,SELF關鍵字是sar進程本身的統計,ALL關鍵字是所有系統進程的統計。
用sar進行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
在顯示內容包括:
%user:CPU處在用戶模式下的時間百分比
%nice:CPU處在帶NICE值的用戶模式下的時間百分比
%system:CPU處在系統模式下的時間百分比
%iowait:CPU等待輸入輸出完成時間的百分比
%steal:管理程序維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比
%idle:CPU空閑時間百分比
在所有的顯示中,我們應該主要注意%iowait和%idle,
%iowait的值過高,表示硬盤存在I/O瓶頸,%idle值高,表示CPU較空閑。
如果%idle值高但系統響應慢時,有可能是CPU等待分配內存,此時應加大內存容量。反之如果持續低于10,那么系統的CPU處理能力相對較低,表明系統中最需要解決的資源是CPU。
用sar進行運行進程隊列長度分析:
[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:準備運行的進程運行隊列
plist-sz:進程隊列里的進程和線程的數量
ldavg-1:前一分鐘的系統平均負載(load average)
ldavg-5:前五分鐘的系統平均負載
ldavg-15:前15分鐘的系統平均負載
順便說一下load average的含義
load avarage可以理解為每秒鐘CPU等待運行的進程個數。
在liunx系統中,有很多命令都會有系統平均負載load average的輸出,那么什么是系統負載呢?
定義:在特定時間間隔內運行隊列中的平均任務數。如果一個進程滿足以下條件則其就會位于運行隊列中:
1、它沒有在等待I/O操作的結果
2、它沒有主動進入等待狀態(也就是wait)
3、沒有被停止
例如:
[root@master ~]# uptime
09:34:05 up 69 days,? 4:00,? 1 user,? load
average: 0.08, 0.02, 0.01
命令輸出的最后內容表示在過去的1、5、15分鐘內運行隊列中的平均進程數量。
一般來說只要每個CPU的當前活動進程數不大于3那么系統的性能就是良好的,如果每個CPU的任務數大于5,那么就表示這臺機器的性能有嚴重問題。
對于上面的例子來說,假設系統有兩個CPU,那么其每個CPU的當前任務數為:0.08/2=0.04,這表示該系統的性能是可以接受的。
這里有個思考問題,就是當CPU是支持超線程的時候,那么這時候是除以物理個數,還是邏輯個數?????
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的縮寫,是實時系統監控工具。其報告與CPU的一些統計信息,這些信息存放在/proc/stat文件中。
在多CPU系統里,其不但能查看看到所有CPU的平均狀況信息,而且能夠查看特定的CPU的信息。
mpstat語法如下:
Usage: mpstat [ options... ] [ [ ]
]
Options are:
[ -P { | ALL } ] [ -V ]
參數含義如下:
-P {| ALL} 表示監控哪個CPU,cpu在[0,cpu個數-1]中取值
internal 相鄰的兩次采樣的間隔時間
count 采樣的次數,count只能和delay一起使用
當沒有參數時,則顯示系統啟動以后所有信息的平均值。(參數解釋從/proc/stat獲得數據)
[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
補充說明下,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 : 代表執行者的身份
PID : 代表這個進程的代號
PPID :代表這個進程是由哪個進程發展衍生而來的,亦即父進程的代號
PRI :代表這個進程可被執行的優先級,其值越小越早被執行
NI :代表這個進程的nice值
這里的前面的三個信息,我們都是比較好容易理解的,但是后面的兩個奇怪的信息,一個是PRI,一個是NI,這到底是什么東西?相對而言,PRI也還是比較好理解的,即進程的優先級,或者通俗點說就是程序被CPU執行的先后順序,此值越小進程的優先級別越高。那NI呢?就是我們所要說的nice值了,其表示進程可被執行的優先級的修正數值。如前面所說,PRI值越小越快被執行,那么加入nice值后,將會使得PRI變為:PRI(new)=PRI(old)+nice。這樣,當nice值為負值的時候,那么該程序將會優先級值將變小,即其優先級會變高,則其越快被執行。
進程在創建時并不是平等的,他們被賦予不同的優先級值,例如有些對計算機本身的操作至關重要的程序必須比其他次要的程序具有更高的優先級(則其有更小的優先級值)。而如前面所說,nice的值是表示進程優先級值可被修正數據值,因此,每個進程都在其計劃執行時被賦予一個系統nice值,這樣系統就可以根據系統的資源以及具體進程的各類資源消耗情況,主動干預進程的優先級值。這個過程,用戶也可手工干預其中,但是要被賦予相應的權限。
在UNIX系統或者LINUX系統中,使用從-20到+19的一個可變數值來表示這個nice值(LINUX和AIX是這種情況,HP-UX系統的值范圍是從0到39),并且在通常情況下,子進程會繼承父進程的系統nice值。具有最高優先級的程序,其nice值最低,所以在UNIX和LINUX系統中,值-20使得一項任務變得非常重要(HP-UX為0);與之相反,如果任務的
nice 為+19(HP-UX為39),則表示它是一個高尚的、無私的任務,允許所有其他任務比自己享有寶貴的 CPU
時間的更大使用份額,這也就是nice的名稱的意會來意。
[root@master ~]# nice
0
root用戶把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用戶就可以給其子進程賦予更小的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
對于后臺進程,其nice會在其被顯示賦予的值過后再加上4。如“nice 12 command
&”命令執行時,則其會以nice=36值來運行程序(HP-UX系統)。這里有個問題,即如果用戶設置的nice值超過了nice的邊界值(LINUX和AIX為-20到19,HP-UX為0到39)會怎樣,則系統就取nice的邊界值作為進程的nice值。
與進程的nice相關的命令有2個,分別是nice和renice。
nice命令就是設置一個要執行command進程的nice值,其命令格式是 nice –n adjustment command
command_option,這里就設置要執行的command的nice,如果這里不指定adjustment,則默認為10。
renice命令就是設置一個已經在運行的進程的nice值,如假設一運行進程本來nice值為0,renice為3后,則這個運行進程的nice值就為3了。renice的執行必須要有相應的權限方可執行。它可以根據用戶、進程ID、進程組來設置進程的nice值。
對nice值一個形象比喻,假設在一個CPU輪轉中,有2個runnable的進程A和B,如果他們的nice值都為0(如果是HP-UX則為20),加上內核會給他們每人分配1k個cpu時間片。但是假設進程A的為0,但是B的值為-10,那么此時CPU則會可能分別給A和B分配1k和1.5k的時間片。故可以形象的理解為,nice的值影響了內核分配給進程的cpu時間片的多少,時間片越多的進程,其優先級越高,其優先級值越低。
從使用top、ps等命令看到的nice值,就是進程所擁有的nice值,使用iostat等看到的%nice,就是用戶進程空間中改變過優先級的進程的占用CPU的百分比,如上例中就說0.5k/2.5k=1/5=20%。
到目前為止,更需要強調一點的是,進程的nice值不是進程的優先級,他們不是一個概念,但是進程nice值會影響到進程的優先級變化。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的分析linux系统的运行性能,Linux系统如何分析CPU的性能瓶颈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 股票分配方案10派4元是什么意思
- 下一篇: linux 时间戳 c语言,c语言中的时