Linux下性能調試工具運維筆記

 

做爲一名資深的linux運維工程師,爲方便了解和追求服務器的高性能,如cpu、內存、io、網絡等等使用狀況,要求運維工程師必需要熟練運用一些必要的系統性能調試工具,liunx下提供了衆多命令方便查看各類資源的使用狀況。常常用的有ps、top、free、mpstat、iostat、vmstat、netstat。。下面簡單介紹下這幾個工具的使用:node

1、top
top是Linux下經常使用的性能分析工具,可以實時顯示系統中各個進程的資源佔用情況,相似於Windows的任務管理器。top顯示系統當前的進程和其餘情況,是一個動態顯示過程,便可以經過用戶按鍵來不斷刷新當前狀態。若是在前臺執行該命令,它將獨佔前臺,直到用戶終止該程序爲止。 比較準確的說,top命令提供了實時的對系統處理器的狀態監視。它將顯示系統中CPU最「敏感」的任務列表,該命令能夠按CPU使用,內存使用和執行時間對任務進行排序;並且該命令的不少特性均可以經過交互式命令或者在我的定製文件中進行設定.python

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

參數說明
d   指定每兩次屏幕信息刷新之間的時間間隔。固然用戶可使用s交互命令來改變之。
p   經過指定監控進程ID來僅僅監控某個進程的狀態。
q   該選項將使top沒有任何延遲的進行刷新。若是調用程序有超級用戶權限,那麼top將以儘量高的優先級運行。
S  指定累計模式
s  使top命令在安全模式中運行。這將去除交互命令所帶來的潛在危險。
i   使top不顯示任何閒置或者僵死進程。
c  顯示整個命令行而不僅是顯示命令名ios

[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)第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 便可顯示或隱藏對應的列,最後按回車鍵肯定。
o或者O    改變顯示項目的順序。 按小寫的 a-z 能夠將相應的列向右移動,而大寫的 A-Z 能夠將相應的列向左移動。最後按回車鍵肯定。
按大寫的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的進程的資源使用狀況,並顯式該進程啓動的命令行參數

2、sar
sar(System Activity Reporter系統活動狀況報告)是目前Linux上最爲全面的系統性能分析工具之一,它將指定的操做系統狀態計數器顯示到標準輸出設備,能夠從多方面對系統的活動進行報告,包括:文件的讀寫狀況、 系統調用的使用狀況、磁盤I/O、CPU效率、內存使用情況、進程活動及IPC有關的活動等。sar工具將對系統當前的狀態進行取樣,而後經過計算數據和比例來表達系統的當前運行狀態。它的特色是能夠連續對系統取樣,得到大量的取樣數據。取樣數據和分析的結果均可以存入文件,使用它時消耗的系統資源很小。算法

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

其中:
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中,需鍵入以下命令:bash

[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 等來查看

3、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

4、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 的空閒時間

5、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

6、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: 空閒時間百分比
相關文章
相關標籤/搜索