Linux下效能除錯工具運維筆記

散盡浮華發表於2018-01-04

 

作為一名資深的linux運維工程師,為方便了解和追求伺服器的高效能,如cpu、記憶體、io、網路等等使用情況,要求運維工程師必須要熟練運用一些必要的系統效能除錯工具,liunx下提供了眾多命令方便檢視各種資源的使用情況。經常用的有ps、top、free、mpstat、iostat、vmstat、netstat。。下面簡單介紹下這幾個工具的使用:

一、top
top是Linux下常用的效能分析工具,能夠實時顯示系統中各個程式的資源佔用狀況,類似於Windows的工作管理員。top顯示系統當前的程式和其他狀況,是一個動態顯示過程,即可以通過使用者按鍵來不斷重新整理當前狀態。如果在前臺執行該命令,它將獨佔前臺,直到使用者終止該程式為止。 比較準確的說,top命令提供了實時的對系統處理器的狀態監視。它將顯示系統中CPU最“敏感”的任務列表,該命令可以按CPU使用,記憶體使用和執行時間對任務進行排序;而且該命令的很多特性都可以通過互動式命令或者在個人定製檔案中進行設定.

命令使用
top使用格式
top [-] [d] [p] [q] [c] [C] [S] [s] [n]

引數說明
d   指定每兩次螢幕資訊重新整理之間的時間間隔。當然使用者可以使用s互動命令來改變之。
p   通過指定監控程式ID來僅僅監控某個程式的狀態。
q   該選項將使top沒有任何延遲的進行重新整理。如果呼叫程式有超級使用者許可權,那麼top將以儘可能高的優先順序執行。
S  指定累計模式
s  使top命令在安全模式中執行。這將去除互動命令所帶來的潛在危險。
i   使top不顯示任何閒置或者僵死程式。
c  顯示整個命令列而不只是顯示命令名

[root@jumpserver01 ~]# top -c
top - 15:41:05 up 38 days, 14 min,  4 users,  load average: 29.03, 29.03, 29.00
Tasks: 897 total,  30 running, 867 sleeping,   0 stopped,   0 zombie
Cpu(s): 71.8%us,  0.8%sy,  0.0%ni, 27.4%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  65724264k total, 37654212k used, 28070052k free,   371320k buffers
Swap: 32767996k total,        0k used, 32767996k free, 31845892k cached

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               
 22107 duanjunf  20   0  360m  37m 4768 R 100.0  0.1  28162:37 python /data/jumpserver/connect.py                                    
 38740 sunyuanc  20   0  360m  36m 4768 R 100.0  0.1  24262:12 python /data/jumpserver/connect.py                                    
 38766 sunyuanc  20   0  360m  36m 4768 R 100.0  0.1  24261:54 python /data/jumpserver/connect.py                                    
 68261 xieyidan  20   0  360m  36m 4768 R 100.0  0.1  19655:44 python /data/jumpserver/connect.py                                    
 97841 sunyuanc  20   0  360m  37m 4768 R 100.0  0.1  44953:16 python /data/jumpserver/connect.py                                    
104229 wangbinr  20   0  360m  36m 4768 R 100.0  0.1  44451:25 python /data/jumpserver/connect.py                                    
115357 shanghai  20   0  360m  37m 4768 R 100.0  0.1  13165:59 python /data/jumpserver/connect.py                                    
115545 shanghai  20   0  360m  36m 4768 R 100.0  0.1  13160:54 python /data/jumpserver/connect.py                                    
115582 shanghai  20   0  360m  37m 4768 R 100.0  0.1  13160:10 python /data/jumpserver/connect.py                                    
128364 duanjunf  20   0  360m  37m 4768 R 100.0  0.1  41810:20 python /data/jumpserver/connect.py                                    
141827 sunyuanc  20   0  360m  36m 4768 R 100.0  0.1  40111:40 python /data/jumpserver/connect.py                                    
170184 duanjunf  20   0  360m  36m 4768 R 100.0  0.1  34627:54 python /data/jumpserver/connect.py                                    
180787 sunyuanc  20   0  360m  36m 4768 R 100.0  0.1  33316:45 python /data/jumpserver/connect.py                                    
 11168 xieyidan  20   0  360m  36m 4768 R 99.7  0.1  29940:19 python /data/jumpserver/connect.py                                     
 46745 wangbinr  20   0  360m  37m 4768 R 99.7  0.1  22848:20 python /data/jumpserver/connect.py                                     
 50740 wangbinr  20   0  360m  37m 4768 R 99.7  0.1  22601:23 python /data/jumpserver/connect.py                                     
 62308 xieyidan  20   0  360m  37m 4768 R 99.7  0.1  20280:22 python /data/jumpserver/connect.py                                     
 73232 xieyidan  20   0  360m  35m 4768 R 99.7  0.1  18553:01 python /data/jumpserver/connect.py                                     
 93496 chengjun  20   0  360m  36m 4768 R 99.7  0.1  14455:38 python /data/jumpserver/connect.py                                     
 93799 chengjun  20   0  360m  37m 4768 R 99.7  0.1  14417:51 python /data/jumpserver/connect.py


以上指令資訊解釋:
統計資訊區前五行是系統整體的統計資訊。
1)第一行是任務佇列資訊,同 uptime 命令的執行結果。內容如下:
15:41:05               當前時間
up 38 days, 14 min     系統執行時間,格式為時:分
4 users                當前登入使用者數
load average: 29.03, 29.03, 29.00    系統負載,即任務佇列的平均長度。三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。

2)第二、三行為程式和CPU的資訊。當有多個CPU時,這些內容可能會超過兩行。內容如下:(top命令回車後,按數字"1"就會顯示cpu的核數,前提是當前螢幕足夠大,能夠全部顯示cpu核數)
total 程式總數
running 正在執行的程式數
sleeping 睡眠的程式數
stopped 停止的程式數
zombie 殭屍程式數
Cpu(s): 
71.8% us 使用者空間佔用CPU百分比
0.8% sy 核心空間佔用CPU百分比
0.0% ni 使用者程式空間內改變過優先順序的程式佔用CPU百分比
27.4% id 空閒CPU百分比
0.0% wa 等待輸入輸出的CPU時間百分比
0.0%hi:硬體CPU中斷佔用百分比
0.0%si:軟中斷佔用百分比
0.0%st:虛擬機器佔用百分比

3)最後兩行為記憶體資訊。內容如下:
Mem:
65724264k total    實體記憶體總量
37653788k used    使用的實體記憶體總量
28070476k free    空閒記憶體總量
371320k buffers    用作核心快取的記憶體量
Swap: 
32767996k total    交換區總量
0k used            使用的交換區總量
32767996k free    空閒交換區總量
31845892k cached    緩衝的交換區總量,記憶體中的內容被換出到交換區,而後又被換入到記憶體,但使用過的交換區尚未被覆蓋,該數值即為這些內容已存在於記憶體中的交換區的大小,相應的記憶體再次被換出時可不必再對交換區寫入。

4)程式資訊區統計資訊區域的下方顯示了各個程式的詳細資訊。
 列名    含義
 PID     程式id
 PPID    父程式id
 RUSER   Real user name
 UID     程式所有者的使用者id
 USER    程式所有者的使用者名稱
 GROUP   程式所有者的組名
 TTY     啟動程式的終端名。不是從終端啟動的程式則顯示為 ?
 PR      優先順序
 NI      nice值。負值表示高優先順序,正值表示低優先順序
 P       最後使用的CPU,僅在多CPU環境下有意義
 %CPU    上次更新到現在的CPU時間佔用百分比
 TIME    程式使用的CPU時間總計,單位秒
 TIME+   程式使用的CPU時間總計,單位1/100秒
 %MEM    程式使用的實體記憶體百分比
 VIRT    程式使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES
 SWAP    程式使用的虛擬記憶體中,被換出的大小,單位kb。
 RES     程式使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA
 CODE    可執行程式碼佔用的實體記憶體大小,單位kb
 DATA    可執行程式碼以外的部分(資料段+棧)佔用的實體記憶體大小,單位kb
 SHR     共享記憶體大小,單位kb
 nFLT    頁面錯誤次數
 nDRT    最後一次寫入到現在,被修改過的頁面數。
 S       程式狀態(D=不可中斷的睡眠狀態,R=執行,S=睡眠,T=跟蹤/停止,Z=殭屍程式)
 COMMAND 命令名/命令列
 WCHAN   若該程式在睡眠,則顯示睡眠中的系統函式名
 Flags   任務標誌,參考 sched.h


預設情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。

從使用角度來看,熟練的掌握這些命令比掌握選項還重要一些。這些命令都是單字母的,如果在命令列選項中使用了s選項,則可能其中一些命令會被遮蔽掉。
------------------------------------------------------------------------------------------------------------------------------------------
Ctrl+L   擦除並且重寫螢幕。 
h或者?   顯示幫助畫面,給出一些簡短的命令總結說明。 
k        終止一個程式。系統將提示使用者輸入需要終止的程式PID,以及需要傳送給該程式什麼樣的訊號。一般的終止程式可以使用15訊號;如果不能正常結束那就使用訊號9強制結束該程式。預設值是訊號15。在安全模式中此命令被遮蔽。 
i   忽略閒置和僵死程式。這是一個開關式命令。 
q   退出程式。 
r   重新安排一個程式的優先順序別。系統提示使用者輸入需要改變的程式PID以及需要設定的程式優先順序值。輸入一個正值將使優先順序降低,反之則可以使該程式擁有更高的優先權。預設值是10。 
S   切換到累計模式。 
s   改變兩次重新整理之間的延遲時間。系統將提示使用者輸入新的時間,單位為s。如果有小數,就換算成m s。輸入0值則系統將不斷重新整理,預設值是5 s。需要注意的是如果設定太小的時間,很可能會引起不斷重新整理,從而根本來不及看清顯示的情況,而且系統負載也會大大增加。 
l   切換顯示平均負載和啟動時間資訊。 
m   切換顯示記憶體資訊。 
t   切換顯示程式和CPU狀態資訊。 
c   切換顯示命令名稱和完整命令列。 
M   根據駐留記憶體大小進行排序。 
P   根據CPU使用百分比大小進行排序。 
T   根據時間/累計時間進行排序。 
W   將當前設定寫入~/.toprc檔案中。這是寫top配置檔案的推薦方法。
f或者F    從當前顯示中新增或者刪除專案。 按 f 鍵之後會顯示列的列表,按 a-z 即可顯示或隱藏對應的列,最後按Enter鍵確定。
o或者O    改變顯示專案的順序。 按小寫的 a-z 可以將相應的列向右移動,而大寫的 A-Z 可以將相應的列向左移動。最後按Enter鍵確定。
按大寫的M   可以降序顯示記憶體使用率
按大寫的P   可以降序顯示CPU使用率

---------------------------------------------------------------------------------------------------------------------------------------
常用操作命令:
# top          //每隔5秒顯式所有程式的資源佔用情況
# top -d 2         //每隔2秒顯式所有程式的資源佔用情況
# top -c           //每隔5秒顯式程式的資源佔用情況,並顯示程式的命令列引數(預設只有程式名)
# top -p 12345 -p 6789        //每隔5秒顯示pid是12345和pid是6789的兩個程式的資源佔用情況
# top -d 2 -c -p 123456       //每隔2秒顯示pid是12345的程式的資源使用情況,並顯式該程式啟動的命令列引數

二、sar
sar(System Activity Reporter系統活動情況報告)是目前Linux上最為全面的系統效能分析工具之一,它將指定的作業系統狀態計數器顯示到標準輸出裝置,可以從多方面對系統的活動進行報告,包括:檔案的讀寫情況、 系統呼叫的使用情況、磁碟I/O、CPU效率、記憶體使用狀況、程式活動及IPC有關的活動等。sar工具將對系統當前的狀態進行取樣,然後通過計算資料和比例來表達系統的當前執行狀態。它的特點是可以連續對系統取樣,獲得大量的取樣資料。取樣資料和分析的結果都可以存入檔案,使用它時消耗的系統資源很小。

sar命令常用格式
sar [options] [-A] [-o file] t [n]

其中:
t為取樣間隔,n為取樣次數,預設值是1;
-o file表示將命令結果以二進位制格式存放在檔案中,file 是檔名。
options 為命令列選項

sar命令常用選項如下:

[root@jumpserver01 ~]# sar --help
用法: sar [ 選項 ] [ <時間間隔> [ <次數> ] ]
Options are:
[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ] [ -R ]
[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]
[ -j { ID | LABEL | PATH | UUID | ... } ] [ -n { <keyword> [,...] | ALL } ]
[ -o [ <filename> ] | -f [ <filename> ] ] [ --legacy ]
[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]

-A:所有報告的總和
-u:輸出CPU使用情況的統計資訊
-v:輸出inode、檔案和其他核心表的統計資訊
-d:輸出每一個塊裝置的活動資訊
-r:輸出記憶體和交換空間的統計資訊
-b:顯示I/O和傳送速率的統計資訊
-a:檔案讀寫情況
-c:輸出程式統計資訊,每秒建立的程式數
-R:輸出記憶體頁面的統計資訊
-y:終端裝置活動情況
-w:輸出系統交換活動資訊

使用案例:
1)CPU資源監控
例如,每10秒取樣一次,連續取樣3次,觀察CPU 的使用情況,並將取樣結果以二進位制形式存入當前目錄下的檔案test中,需鍵入如下命令:

[root@jumpserver01 ~]# sar -u -o test 10 3
Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)

00:09:49        CPU     %user     %nice   %system   %iowait    %steal     %idle
00:09:59        all      0.00      0.00      0.03      0.05      0.00     99.92
00:10:09        all      0.05      0.00      0.08      0.10      0.00     99.77
00:10:19        all      0.00      0.00      0.00      0.05      0.00     99.95
Average:        all      0.02      0.00      0.03      0.07      0.00     99.88

[root@jumpserver01 ~]# ll test
-rw-r--r--. 1 root root 42632 Jan  4 00:10 test

輸出項說明:
CPU:all 表示統計資訊為所有 CPU 的平均值。
%user:顯示在使用者級別(application)執行使用 CPU 總時間的百分比。
%nice:顯示在使用者級別,用於nice操作,所佔用 CPU 總時間的百分比。
%system:在核心級別(kernel)執行所使用 CPU 總時間的百分比。
%iowait:顯示用於等待I/O操作佔用 CPU 總時間的百分比。
%steal:管理程式(hypervisor)為另一個虛擬程式提供服務而等待虛擬 CPU 的百分比。
%idle:顯示 CPU 空閒時間佔用 CPU 總時間的百分比。

1. 若 %iowait 的值過高,表示硬碟存在I/O瓶頸
2. 若 %idle 的值高但系統響應慢時,有可能是 CPU 等待分配記憶體,此時應加大記憶體容量
3. 若 %idle 的值持續低於1,則系統的 CPU 處理能力相對較低,表明系統中最需要解決的資源是 CPU 。

如果要檢視二進位制檔案test中的內容,需鍵入如下sar命令:
[root@jumpserver01 ~]# sar -u -f test
Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)

00:09:49        CPU     %user     %nice   %system   %iowait    %steal     %idle
00:09:59        all      0.00      0.00      0.03      0.05      0.00     99.92
00:10:09        all      0.05      0.00      0.08      0.10      0.00     99.77
00:10:19        all      0.00      0.00      0.00      0.05      0.00     99.95
Average:        all      0.02      0.00      0.03      0.07      0.00     99.88

2)inode、檔案和其他核心表監控
例如,每10秒取樣一次,連續取樣3次,觀察核心表的狀態,需鍵入如下命令:

[root@jumpserver01 ~]# sar -v 10 3
Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)

00:13:17    dentunusd   file-nr  inode-nr    pty-nr
00:13:27       106660       960     64780         2
00:13:37       106660       960     64780         2
00:13:47       106660       960     64780         2
Average:       106660       960     64780         2

輸出項說明:
dentunusd:目錄快取記憶體中未被使用的條目數量
file-nr:檔案控制程式碼(file handle)的使用數量
inode-nr:索引節點控制程式碼(inode handle)的使用數量
pty-nr:使用的pty數量

3)記憶體和交換空間監控
例如,每10秒取樣一次,連續取樣3次,監控記憶體分頁

[root@jumpserver01 ~]# sar -r 10 3
Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)

00:14:42    kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
00:14:52       551360   5441372     90.80    142256   4907464    135520      1.12
00:15:02       551360   5441372     90.80    142256   4907464    135520      1.12
00:15:12       551360   5441372     90.80    142260   4907464    135520      1.12
Average:       551360   5441372     90.80    142257   4907464    135520      1.12

輸出項說明:
kbmemfree:這個值和free命令中的free值基本一致,所以它不包括buffer和cache的空間.
kbmemused:這個值和free命令中的used值基本一致,所以它包括buffer和cache的空間.
%memused:這個值是kbmemused和記憶體總量(不包括swap)的一個百分比.
kbbuffers和kbcached:這兩個值就是free命令中的buffer和cache.
kbcommit:保證當前系統所需要的記憶體,即為了確保不溢位而需要的記憶體(RAM+swap).
%commit:這個值是kbcommit與記憶體總量(包括swap)的一個百分比.

4)記憶體分頁監控
例如,每10秒取樣一次,連續取樣3次,監控記憶體分頁:

[root@jumpserver01 ~]# sar -B 10 3
Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)

00:16:29     pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
00:16:39         0.00      0.40      7.21      0.00     12.61      0.00      0.00      0.00      0.00
00:16:49         0.00      0.00      4.30      0.00     12.60      0.00      0.00      0.00      0.00
00:16:59         0.00      0.00      3.40      0.00     12.20      0.00      0.00      0.00      0.00
Average:         0.00      0.13      4.97      0.00     12.47      0.00      0.00      0.00      0.00

輸出項說明:
pgpgin/s:表示每秒從磁碟或SWAP置換到記憶體的位元組數(KB)
pgpgout/s:表示每秒從記憶體置換到磁碟或SWAP的位元組數(KB)
fault/s:每秒鐘系統產生的缺頁數,即主缺頁與次缺頁之和(major + minor)
majflt/s:每秒鐘產生的主缺頁數.
pgfree/s:每秒被放入空閒佇列中的頁個數
pgscank/s:每秒被kswapd掃描的頁個數
pgscand/s:每秒直接被掃描的頁個數
pgsteal/s:每秒鐘從cache中被清除來滿足記憶體需要的頁個數
%vmeff:每秒清除的頁(pgsteal)佔總掃描頁(pgscank+pgscand)的百分比

5)I/O和傳送速率監控
例如,每10秒取樣一次,連續取樣3次,報告緩衝區的使用情況,需鍵入如下命令:

[root@jumpserver01 ~]# sar -b 10 3
Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)

00:18:06          tps      rtps      wtps   bread/s   bwrtn/s
00:18:16         0.00      0.00      0.00      0.00      0.00
00:18:26         0.00      0.00      0.00      0.00      0.00
00:18:36         0.00      0.00      0.00      0.00      0.00
Average:         0.00      0.00      0.00      0.00      0.00

輸出項說明:
tps:每秒鐘物理裝置的 I/O 傳輸總量
rtps:每秒鐘從物理裝置讀入的資料總量
wtps:每秒鐘向物理裝置寫入的資料總量
bread/s:每秒鐘從物理裝置讀入的資料量,單位為 塊/s
bwrtn/s:每秒鐘向物理裝置寫入的資料量,單位為 塊/s 

6)程式佇列長度和平均負載狀態監控
例如,每10秒取樣一次,連續取樣3次,監控程式佇列長度和平均負載狀態:

[root@jumpserver01 ~]# sar -q 10 3
Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)

00:19:25      runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
00:19:35            0       231      0.00      0.20      4.50
00:19:45            0       231      0.00      0.19      4.45
00:19:55            0       231      0.00      0.18      4.40
Average:            0       231      0.00      0.19      4.45

輸出項說明:
runq-sz:執行佇列的長度(等待執行的程式數)
plist-sz:程式列表中程式(processes)和執行緒(threads)的數量
ldavg-1:最後1分鐘的系統平均負載(System load average)
ldavg-5:過去5分鐘的系統平均負載
ldavg-15:過去15分鐘的系統平均負載

7)系統交換活動資訊監控
例如,每10秒取樣一次,連續取樣3次,監控系統交換活動資訊:

[root@jumpserver01 ~]# sar -W 10 3
Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)

00:21:06     pswpin/s pswpout/s
00:21:16         0.00      0.00
00:21:26         0.00      0.00
00:21:36         0.00      0.00
Average:         0.00      0.00

輸出項說明:
pswpin/s:每秒系統換入的交換頁面(swap page)數量
pswpout/s:每秒系統換出的交換頁面(swap page)數量

8)裝置使用情況監控
例如,每10秒取樣一次,連續取樣3次,報告裝置使用情況,需鍵入如下命令:

[root@jumpserver01 ~]# sar -d 10 3 -p
Linux 2.6.32-696.el6.x86_64 (centos6-vm01)  01/04/18    _x86_64_    (4 CPU)

00:24:26          DEV                   tps       rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz  await     svctm     %util
00:24:36          sr0                   0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
00:24:36          vda                   0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
00:24:36    vg_centos6vm01-lv_root      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
00:24:36    vg_centos6vm01-lv_swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
00:24:36    vg_centos6vm01-lv_home      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.0

其中:
引數-p可以列印出sda,hdc等磁碟裝置名稱,如果不用引數-p,裝置節點則有可能是dev8-0,dev22-0
tps:每秒從物理磁碟I/O的次數.多個邏輯請求會被合併為一個I/O磁碟請求,一次傳輸的大小是不確定的.
rd_sec/s:每秒讀扇區的次數.
wr_sec/s:每秒寫扇區的次數.
avgrq-sz:平均每次裝置I/O操作的資料大小(扇區).
avgqu-sz:磁碟請求佇列的平均長度.
await:從請求磁碟操作到系統完成處理,每次請求的平均消耗時間,包括請求佇列等待時間,單位是毫秒(1秒=1000毫秒).
svctm:系統處理每次請求的平均時間,不包括在請求佇列中消耗的時間.
%util:I/O請求佔CPU的百分比,比率越大,說明越飽和.
1)avgqu-sz 的值較低時,裝置的利用率較高。
2)當%util的值接近 1% 時,表示裝置頻寬已經佔滿。

要判斷系統瓶頸問題,有時需幾個 sar 命令選項結合起來:
1)懷疑CPU存在瓶頸,可用 sar -u 和 sar -q 等來檢視
2)懷疑記憶體存在瓶頸,可用 sar -B、sar -r 和 sar -W 等來檢視
3)懷疑I/O存在瓶頸,可用 sar -b、sar -u 和 sar -d 等來檢視

三、free

free命令用於檢測實體記憶體和交換記憶體已使用量和可用量(預設單位為KB)
[root@backup ~]# free -m           //使用-m參數列示以兆位元組為單位顯示記憶體
             total       used       free     shared    buffers     cached
Mem:         64181      44372      19809          3         12        216
-/+ buffers/cache:      44143      20038
Swap:        32767          0      32767

第一部分Mem行解釋:
total:記憶體總數;
used:已經使用的記憶體數;
free:空閒的記憶體數;
shared:當前已經廢棄不用;
buffers Buffer:快取記憶體數;
cached Page:快取記憶體數。
關係:total = used + free

第二部分(-/+ buffers/cache)解釋:
(-buffers/cache) used記憶體數:第一部分Mem行中的 used – buffers – cached
(+buffers/cache) free記憶體數: 第一部分Mem行中的 free + buffers + cached

可見-buffers/cache反映的是被程式實實在在吃掉的記憶體,而+buffers/cache反映的是可以挪用的記憶體總數。

第三部分是指交換分割槽。

---------------------------------------------------------------------------------------------
以位元組為單位顯示記憶體
加上-b引數的free命令,以位元組為單位顯示記憶體的大小。

[root@backup ~]# free -b
             total       used       free     shared    buffers     cached
Mem:    67299549184 46525181952 20774367232    3272704   12820480  227033088
-/+ buffers/cache: 46285328384 21014220800
Swap:   34359734272          0 34359734272
-------------------------------------------------------------------------------------------
以千位元組為單位顯示記憶體
加上-k引數的free命令(預設單位,所以可以不用使用它),以(KB)千位元組為單位顯示記憶體大小。
[root@backup ~]# free -k
             total       used       free     shared    buffers     cached
Mem:      65722216   45435760   20286456       3196      12520     221712
-/+ buffers/cache:   45201528   20520688
Swap:     33554428          0   33554428
-------------------------------------------------------------------------------------------
以千兆位元組為單位顯示記憶體
使用-g為引數,將會以GB(千兆位元組)為單位顯示記憶體大小。
[root@backup ~]# free -g
             total       used       free     shared    buffers     cached
Mem:            62         43         19          0          0          0
-/+ buffers/cache:         43         19
Swap:           31          0         31
------------------------------------------------------------------------------------------
定期時間間隔更新記憶體狀態
-s選項加上一個整數,用來在定期時間間隔內更新free命令。舉個例子,下面的命令將會在每5秒更新一個free命令。
[root@backup ~]# free -s 5
             total       used       free     shared    buffers     cached
Mem:      65722216   45436660   20285556       3196      12712     222096
-/+ buffers/cache:   45201852   20520364
Swap:     33554428          0   33554428

             total       used       free     shared    buffers     cached
Mem:      65722216   45436592   20285624       3196      12720     222096
-/+ buffers/cache:   45201776   20520440
Swap:     33554428          0   33554428

四、mpstat(用於獲取CPU相關統計資訊)
mpstat是 Multiprocessor Statistics的縮寫,是實時系統監控工具。其報告與CPU的一些統計資訊,這些資訊存放在/proc/stat檔案中。在多CPU系統裡,其不但能檢視所有CPU的平均狀況資訊,而且能夠檢視特定CPU的資訊。

mpstat的語法如下
# mpstat [-P {cpu|ALL}] [internal [count]]

其中,各引數含義如下:
-P {cpu l ALL}     表示監控哪個CPU, cpu在[0,cpu個數-1]中取值
internal           相鄰的兩次取樣的間隔時間
count              取樣的次數,count只能和delay一起使用

[root@kevin ~]# yum install -y sysstat"     #安裝mpstat

[root@kevin ~]# mpstat 
Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_  (2 CPU)

02:28:57 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
02:28:57 PM  all    0.17    0.00    0.15    0.32    0.00    0.00    0.01    0.00   99.36

當mpstat不帶引數時,輸出為從系統啟動以來的平均值。

[root@kevin ~]# mpstat -P ALL 
Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_  (2 CPU)

02:29:36 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
02:29:36 PM  all    0.17    0.00    0.15    0.32    0.00    0.00    0.01    0.00   99.36
02:29:36 PM    0    0.18    0.00    0.18    0.59    0.00    0.00    0.01    0.00   99.04
02:29:36 PM    1    0.15    0.00    0.11    0.05    0.00    0.00    0.01    0.00   99.69

每5秒產生一個報告,總共產生2個。
[root@kevin ~]# mpstat -P ALL 5 2
Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_  (2 CPU)

02:30:27 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
02:30:32 PM  all    0.20    0.00    0.40    0.51    0.00    0.00    0.00    0.00   98.89
02:30:32 PM    0    0.20    0.00    0.80    0.80    0.00    0.00    0.00    0.00   98.20
02:30:32 PM    1    0.20    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.59

02:30:32 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
02:30:37 PM  all    0.20    0.00    0.40    0.40    0.00    0.00    0.00    0.00   98.99
02:30:37 PM    0    0.20    0.00    0.40    0.80    0.00    0.00    0.00    0.00   98.59
02:30:37 PM    1    0.20    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.59

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
Average:     all    0.20    0.00    0.40    0.45    0.00    0.00    0.00    0.00   98.94
Average:       0    0.20    0.00    0.60    0.80    0.00    0.00    0.00    0.00   98.40
Average:       1    0.20    0.00    0.20    0.00    0.00    0.00    0.00    0.00   99.59


解釋:
%user         表示處理使用者程式所使用 CPU 的百分比。
%nice         表示使用 nice 命令對程式進行降級時 CPU 的百分比。nice 命令更改程式的優先順序。 
%system       表示核心程式使用的 CPU 百分比  
%iowait       表示等待進行 I/O 所使用的 CPU 時間百分比  
%irq          表示用於處理系統中斷的 CPU 百分比  
%soft         表示用於軟體中斷的 CPU 百分比  
%idle         顯示 CPU 的空閒時間

五、iostat(檢視IO效能是否存在瓶頸)
效能評估的一個主要部分就是磁碟效能,iostat 命令提供了儲存介面的效能指標,iostat是檢視Linux系統io是否存在瓶頸的一個命令。

安裝iostat
[root@kevin ~]# yum install -y sysstat

iostat 主要有三個操作箱,options 操作項,interval指定統計時間間隔,count總共輸出次數

-------------------------------------
-c 引數,可以用來插卡部分cpu狀態資訊
[root@kevin ~]# iostat -c
Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_ (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.17    0.00    0.15    0.32    0.01   99.36

------------------------------------
-k 引數,某些使用block為單位的列強制使用Kilobytes為單位。如下,每1秒鐘列印一次,列印2份。
[root@kevin ~]# iostat -k 1 2
Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_ (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.17    0.00    0.15    0.32    0.01   99.36

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
scd0              0.00         0.00         0.00        356          0
vda               1.08         0.45        11.45    4340748  109945327
dm-0              2.84         0.41        11.34    3907333  108884164
dm-1              0.04         0.04         0.11     423580    1054548
dm-2              0.00         0.00         0.00       1701       1084
vdb               0.00         0.00         0.00       6671      10681

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.50    0.00    0.00    0.00    0.00   99.50

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
scd0              0.00         0.00         0.00          0          0
vda               0.00         0.00         0.00          0          0
dm-0              0.00         0.00         0.00          0          0
dm-1              0.00         0.00         0.00          0          0
dm-2              0.00         0.00         0.00          0          0
vdb               0.00         0.00         0.00          0          0

---------------------------------
-d 引數,顯示裝置(磁碟)使用狀態
[root@kevin ~]# iostat -d 1 2
Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_ (2 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.00         0.00         0.00        712          0
vda               1.08         0.90        22.89    8681496  219893230
dm-0              2.84         0.81        22.67    7814666  217770904
dm-1              0.04         0.09         0.22     847160    2109096
dm-2              0.00         0.00         0.00       3402       2168
vdb               0.00         0.00         0.00      13342      21363

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.00         0.00         0.00          0          0
vda               7.00         0.00       208.00          0        208
dm-0             26.00         0.00       208.00          0        208
dm-1              0.00         0.00         0.00          0          0
dm-2              0.00         0.00         0.00          0          0
vdb               0.00         0.00         0.00          0          0

==============================================================================
解釋:
tps        每秒的傳輸數量,例如,每秒的 I/O 運算元。注:這只是 I/O 操作的數量;每個操作可能非常大,也可能非常小。
Blk_read/s 每秒從該裝置讀取的塊數。通常,塊的大小為 512 位元組。這是一個磁碟利用率較好的值。
Blk_wrtn/s 每秒寫入該裝置的塊數
Blk_read   到目前為止從該裝置讀取的塊數。注意,這並不是正在發生的情況。很多塊已經從該裝置讀取。可能現在什麼也沒有讀取。觀察一段時間,看是否有變化。
Blk_wrtn   寫入該裝置的塊數。
==============================================================================

--------------------------------
-x 引數,輸出更多詳細資訊
[root@kevin ~]# iostat -x 1 2
Linux 2.6.32-696.el6.x86_64 (ceph-node1)  07/02/2018  _x86_64_ (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.17    0.00    0.15    0.32    0.01   99.36

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
scd0              0.00     0.00    0.00    0.00     0.00     0.00    18.26     0.00    0.23    0.23    0.00   0.23   0.00
vda               0.01     1.79    0.01    1.07     0.90    22.89    21.98     0.04   37.78    2.15   38.14  11.05   1.20
dm-0              0.00     0.00    0.01    2.83     0.81    22.67     8.26     0.29  100.64    2.84  101.02   4.20   1.20
dm-1              0.00     0.00    0.01    0.03     0.09     0.22     8.00     0.01  242.26    0.70  339.63   0.56   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00     7.99     0.00    9.69    1.44   22.66   2.92   0.00
vdb               0.00     0.00    0.00    0.00     0.00     0.00    21.33     0.00    1.10    0.29   15.04   1.05   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.00    0.00    0.50    9.55    0.00   89.95

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
vda               0.00    26.00    0.00    7.00     0.00   264.00    37.71     0.34   49.00    0.00   49.00  37.71  26.40
dm-0              0.00     0.00    0.00   33.00     0.00   264.00     8.00     1.15   34.94    0.00   34.94   8.00  26.40
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
vdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

==============================================================================
解釋一下 -x引數輸出列意思
rrqm/s:每秒這個裝置相關的讀取請求有多少被Merge了(當系統呼叫需要讀取資料的時候,VFS將請求發到各個FS,如果FS發現不同的讀取請求讀取的是相同Block的資料,FS會將這個請求合併Merge);
wrqm/s:每秒這個裝置相關的寫入請求有多少被Merge了。

rsec/s:每秒讀取的扇區數;wsec/:每秒寫入的扇區數。
r/s:The number of read requests that were issued to the device per second;
w/s:The number of write requests that were issued to the device per second;

await:每一個IO請求的處理的平均時間(單位是毫秒)。這裡可以理解為IO的響應時間,一般地系統IO響應時間應該低於5ms,如果大於10ms就比較大了。

%util:在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該裝置有0.8秒在處理IO,而0.2秒閒置,那麼該裝置的%util = 0.8/1 = 80%,所以該引數暗示了裝置的繁忙程度。
一般地,如果該引數是100%表示裝置已經接近滿負荷執行了(當然如果是多磁碟,即使%util是100%,因為磁碟的併發能力,所以磁碟使用未必就到了瓶頸)。
==============================================================================

-----------------------------------
iostat的常見用法
# iostat -d -k 1 10         #檢視TPS和吞吐量資訊
# iostat -d -x -k 1 10      #檢視裝置使用率(%util)、響應時間(await)
# iostat -c 1 10            #檢視cpu狀態

使用例項
1)檢視指定磁碟吞吐量和速率
[root@kevin ~]# iostat -d -d 1 1
Linux 2.6.32-573.el6.x86_64 (localhost)         06/30/2017      _x86_64_        (4 CPU)

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.14         0.08         3.31    1939830   83482716
dm-0              0.42         0.07         3.30    1872538   83282120
dm-1              0.00         0.00         0.00      39840     124112
dm-2              0.00         0.00         0.00       2002      76424
dm-3              0.00         0.01         0.00     254810      14320
#從結果看到平均傳輸次數0.14,每秒讀取0.08M,每秒寫3.31M

2)磁碟效能統計
[root@kevin ~]# iostat -x -k 1 1
Linux 2.6.32-573.el6.x86_64 (localhost)         06/30/2017      _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.02    0.00    0.00    0.00    0.00   99.98

Device:         rrqm/s   wrqm/s     r/s     w/s       rkB/s    wkB/s  avgrq-sz avgqu-sz   await    r_await  w_await  svctm  %util
sda               0.00     0.27         0.00   0.14     0.04     1.65    23.78       0.00         0.31    1.51            0.29   0.16   0.00

六、vmstat(主要用它來看CPU的一個負載情況)
vmstat(VirtualMeomoryStatistics,虛擬記憶體統計)是Linux中監控記憶體的常用工具,可對作業系統的虛擬記憶體、程式、CPU等的整體情況進行監視。該命令可以顯示關於系統各種資源之間相關效能的簡要資訊,這裡主要用它來看CPU的一個負載情況。vmstat 命令報告關於核心執行緒、虛擬記憶體、磁碟、陷阱和 CPU 活動的統計資訊。由 vmstat 命令生成的報告可以用於平衡系統負載活動。系統範圍內的這些統計資訊(所有的處理器中)都計算出以百分比表示的平均值。

命令格式:
# vmstat (選項) (引數)

選項
-a:顯示活動內頁;
-f:顯示啟動後建立的程式總數;
-m:顯示slab資訊;
-n:頭資訊僅顯示一次;
-s:以表格方式顯示事件計數器和記憶體狀態;
-d:報告磁碟狀態;
-p:顯示指定的硬碟分割槽狀態;
-S:輸出資訊的單位。

引數
事件間隔:狀態資訊重新整理的時間間隔;
次數:顯示報告的次數。

例項:
[root@kevin ~]# vmstat 
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 484628 215084  75336 523748    0    0     0     6    1    0  0  0 99  0  0 

[root@kevin ~]# vmstat 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 482584 212000  75572 524464    0    0     0     6    1    0  0  0 99  0  0 
 1  0 482584 211984  75576 524468    0    0     0    31 1285 2485  0  0 99  1  0 
 0  0 482584 212124  75576 524484    0    0     0     7 1315 2586  0  0 99  0  0 
 0  0 482584 211844  75588 524496    0    0     0    56 1385 2614  2  1 96  1  0 
 0  0 482584 212108  75588 524504    0    0     0     0 1309 2556  0  0 100  0  0   
 0  0 482584 211920  75588 524512    0    0     0    92 1348 2616  1  0 98  1  0 
 0  0 482584 212124  75592 524516    0    0     0    29 1275 2483  0  0 98  2  0 
 0  0 482584 211984  75592 524528    0    0     0     4 1335 2593  1  0 99  0  0

 欄位說明:

Procs(程式)

r: 執行佇列中程式數量,這個值也可以判斷是否需要增加CPU。(長期大於1)
b: 等待IO的程式數量。
Memory(記憶體)

swpd: 使用虛擬記憶體大小,如果swpd的值不為0,但是SI,SO的值長期為0,這種情況不會影響系統效能。
free: 空閒實體記憶體大小。
buff: 用作緩衝的記憶體大小。
cache: 用作快取的記憶體大小,如果cache的值大的時候,說明cache處的檔案數多,如果頻繁訪問到的檔案都能被cache處,那麼磁碟的讀IO bi會非常小。
Swap

si: 每秒從交換區寫到記憶體的大小,由磁碟調入記憶體。
so: 每秒寫入交換區的記憶體大小,由記憶體調入磁碟。
注意:記憶體夠用的時候,這2個值都是0,如果這2個值長期大於0時,系統效能會受到影響,磁碟IO和CPU資源都會被消耗。有些朋友看到空閒記憶體(free)很少的或接近於0時,
就認為記憶體不夠用了,不能光看這一點,還要結合si和so,如果free很少,但是si和so也很少(大多時候是0),那麼不用擔心,系統效能這時不會受到影響的。

IO(現在的Linux版本塊的大小為1kb)

bi: 每秒讀取的塊數
bo: 每秒寫入的塊數
注意:隨機磁碟讀寫的時候,這2個值越大(如超出1024k),能看到CPU在IO等待的值也會越大。

system(系統)

in: 每秒中斷數,包括時鐘中斷。
cs: 每秒上下文切換數。
注意:上面2個值越大,會看到由核心消耗的CPU時間會越大。

CPU(以百分比表示)

us: 使用者程式執行時間百分比(user time)
us的值比較高時,說明使用者程式消耗的CPU時間多,但是如果長期超50%的使用,那麼我們就該考慮優化程式演算法或者進行加速。

sy: 核心系統程式執行時間百分比(system time)
sy的值高時,說明系統核心消耗的CPU資源多,這並不是良性表現,我們應該檢查原因。

wa: IO等待時間百分比
wa的值高時,說明IO等待比較嚴重,這可能由於磁碟大量作隨機訪問造成,也有可能磁碟出現瓶頸(塊操作)。

id: 空閒時間百分比

相關文章