尋找系統瓶頸的利器——sar
一、sar是什麼?
sar是System Activity Reporter(系統活動情況報告)的縮寫。sar工具將對系統當前的狀態進行取樣,然後通過計算數據和比例來表達系統的當前運行狀態。它的特點是可以連續對系統取樣,獲得大量的取樣數據;取樣數據和分析的結果都可以存入文件,所需的負載很小。sar是目前Linux上最爲全面的系統性能分析工具之一,可以從14個大方面對系統的活動進行報告,包括文件的讀寫情況、系統調用的使用情況、串口、CPU效率、內存使用狀況、進程活動及IPC有關的活動等,使用也是較爲複雜。
二、sar能做什麼?
- 查看CPU使用率
- 查看平均負載
- 查看內存使用狀況
- 查看I/O設備情況
- 查看網絡情況
- 查看頁面交換髮生狀況
- ……
三、sar怎麼使用?
用法: sar [ 選項 ] [ <時間間隔> [ <次數> ] ]
選項:
[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ] [ -R ]
[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
[ -I { <中斷> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]
[ -n { <關鍵詞> [,...] | ALL } ]
[ -o [ <文件名> ] | -f [ <文件名> ] ]
[ -i <時間間隔> ] [ -s [ <時:分:秒> ] ] [ -e [ <時:分:秒> ] ]
參數說明
-A 彙總所有的報告
-a 報告文件讀寫使用情況
-B 報告附加的緩存的使用情況
-b 報告緩存的使用情況
-c 報告系統調用的使用情況
-d 報告磁盤的使用情況
-g 報告串口的使用情況
-h 報告關於buffer使用的統計數據
-m 報告IPC消息隊列和信號量的使用情況
-n 報告命名cache的使用情況
-p 報告調頁活動的使用情況
-q 報告運行隊列和交換隊列的平均長度
-R 報告進程的活動情況
-r 報告沒有使用的內存頁面和硬盤塊
-u 報告CPU的利用率
-v 報告進程、i節點、文件和鎖表狀態
-w 報告系統交換活動狀況
-y 報告TTY設備活動狀況
1、查看CPU使用率
使用-u選項,sar輸出整體CPU的使用情況,不加選項時,默認使用的就是-u選項。以下命令顯示採樣時間爲1s,採樣次數爲2次,整體CPU的使用情況。
$ sar 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
15時08分13秒 CPU %user %nice %system %iowait %steal %idle
15時08分14秒 all 1.02 0.00 0.76 0.00 0.00 98.22
15時08分15秒 all 1.01 0.00 1.01 0.00 0.00 97.98
平均時間: all 1.01 0.00 0.89 0.00 0.00 98.10
$ sar -u 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
14時36分02秒 CPU %user %nice %system %iowait %steal %idle
14時36分03秒 all 0.76 0.00 0.76 0.00 0.00 98.48
14時36分04秒 all 1.27 0.00 0.76 0.00 0.00 97.97
平均時間: all 1.01 0.00 0.76 0.00 0.00 98.23
“-P ALL”選項指示對每個內核輸出統計信息,其中”CPU”列輸出0,1,2,3,4指示對應的cpu核。也可針對單獨一個內核顯示,“-P 1”指示顯示第二個內核的統計信息。
$ sar -P ALL 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
14時35分54秒 CPU %user %nice %system %iowait %steal %idle
14時35分55秒 all 1.01 0.00 0.76 0.00 0.00 98.23
14時35分55秒 0 1.01 0.00 1.01 0.00 0.00 97.98
14時35分55秒 1 1.03 0.00 0.00 0.00 0.00 98.97
14時35分55秒 2 1.01 0.00 1.01 0.00 0.00 97.98
14時35分55秒 3 1.01 0.00 1.01 0.00 0.00 97.98
14時35分55秒 CPU %user %nice %system %iowait %steal %idle
14時35分56秒 all 1.26 0.00 0.76 0.00 0.00 97.98
14時35分56秒 0 1.01 0.00 1.01 0.00 0.00 97.98
14時35分56秒 1 1.01 0.00 2.02 0.00 0.00 96.97
14時35分56秒 2 1.02 0.00 0.00 0.00 0.00 98.98
14時35分56秒 3 1.01 0.00 0.00 0.00 0.00 98.99
平均時間: CPU %user %nice %system %iowait %steal %idle
平均時間: all 1.14 0.00 0.76 0.00 0.00 98.10
平均時間: 0 1.01 0.00 1.01 0.00 0.00 97.98
平均時間: 1 1.02 0.00 1.02 0.00 0.00 97.96
平均時間: 2 1.02 0.00 0.51 0.00 0.00 98.48
平均時間: 3 1.01 0.00 0.51 0.00 0.00 98.48
$ sar -P 1 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
15時12分53秒 CPU %user %nice %system %iowait %steal %idle
15時12分54秒 1 1.02 0.00 1.02 0.00 0.00 97.96
15時12分55秒 1 0.00 0.00 1.01 0.00 0.00 98.99
平均時間: 1 0.51 0.00 1.02 0.00 0.00 98.48
- %user :用戶模式下CPU時間佔用比例;
- %nice :通過nice改變了進程調度優先級的進程,在用戶模式下CPU時間佔用比例
- %system :系統模式下CPU時間佔用比例;
- %iowait :CPU等待磁盤I/O導致空閒狀態CPU時間佔用比例;
- %steal :當hypervisor服務另一個虛擬處理器的時候,虛擬CPU等待實際CPU的時間的百分比(如果此值過大,說明主機分配的虛擬機數量過多)
- %idle :CPU空閒時間佔用比例;
2、查看平均負載
使用-q選項,就能查看運行隊列中的進程數、系統上的進程和線程數、平均負載等
$ sar -q 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
15時22分35秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
15時22分36秒 0 503 0.00 0.00 0.00
15時22分37秒 0 503 0.00 0.00 0.00
平均時間: 0 503 0.00 0.00 0.00
- runq-sz :運行隊列的長度(等待運行的進程數)
- plist-sz :進程列表中進程(processes)和線程(threads)的數量
- ldavg-1 :最近1分鐘的系統平均負載
- ldavg-5 :最近5分鐘的系統平均負載
- ldavg-15 :最近15分鐘的系統平均負載
3、查看內存使用狀況
使用-r選項,可查看物理內存使用狀況。
$ sar -r 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
15時16分36秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
15時16分37秒 1251336 6811288 84.48 173712 5114880 5148236 42.00
15時16分38秒 1251336 6811288 84.48 173712 5114880 5148236 42.00
平均時間: 1251336 6811288 84.48 173712 5114880 5148236 42.00
$ free
total used free shared buffers cached
Mem: 8062624 6811016 1251608 0 173712 5114880
-/+ buffers/cache: 1522424 6540200
Swap: 4194296 756656 3437640
- 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、查看I/O設備情況
使用-b選項,查看I/O和傳輸速率統計。
$ sar -b 1 10
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16時52分34秒 tps rtps wtps bread/s bwrtn/s
16時52分35秒 0.00 0.00 0.00 0.00 0.00
16時52分36秒 0.00 0.00 0.00 0.00 0.00
16時52分37秒 0.00 0.00 0.00 0.00 0.00
16時52分38秒 2.02 0.00 2.02 0.00 24.24
16時52分39秒 1.02 0.00 1.02 0.00 8.16
16時52分40秒 0.00 0.00 0.00 0.00 0.00
16時52分41秒 0.00 0.00 0.00 0.00 0.00
16時52分42秒 0.00 0.00 0.00 0.00 0.00
16時52分43秒 0.00 0.00 0.00 0.00 0.00
16時52分44秒 5.10 0.00 5.10 0.00 89.80
平均時間: 0.81 0.00 0.81 0.00 12.18
- tps :磁盤每秒鐘的IO總數
- rtps :每秒鐘從磁盤讀取的IO總數
- wtps :每秒鐘從寫入到磁盤的IO總數
- bread/s :每秒鐘從磁盤讀取的塊總數
- bwrtn/s :每秒鐘此寫入到磁盤的塊總數
使用-d選項,查看每個塊設備的活動。DEV 磁盤設備的名稱,如果不加-p,會顯示類似“dev11-0”的設備名稱,因此加上-p顯示的名稱更爲直觀。
$ sar -d 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16時47分23秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
16時47分24秒 dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16時47分24秒 dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16時47分24秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
16時47分25秒 dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16時47分25秒 dev8-0 4.04 0.00 48.48 12.00 0.00 0.00 0.00 0.00
平均時間: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
平均時間: dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均時間: dev8-0 2.02 0.00 24.24 12.00 0.00 0.00 0.00 0.00
$ iostat -d 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
scd0 0.00 0.00 0.00 2000 0
sda 3.28 87.98 202.59 1984979076 4570968384
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
scd0 0.00 0.00 0.00 0 0
sda 0.00 0.00 0.00 0 0
$ sar -d -p 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16時48分10秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
16時48分11秒 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16時48分11秒 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16時48分11秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
16時48分12秒 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16時48分12秒 sda 3.03 0.00 32.32 10.67 0.00 0.00 0.00 0.00
平均時間: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
平均時間: scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均時間: sda 1.53 0.00 16.33 10.67 0.00 0.00 0.00 0.00
- tps :每秒I/O的傳輸總數
- rd_sec/s :每秒讀取的扇區的總數
- wr_sec/s :每秒寫入的扇區的總數
- avgrq-sz :平均每次磁盤I/O操作的數據大小(扇區)
- avgqu-sz :磁盤請求隊列的平均長度
- await :從請求磁盤操作到系統完成處理,每次請求的平均消耗時間,包括請求隊列等待時間,單位是毫秒(1秒等於1000毫秒),等於尋道時間+隊列時間+服務時間
- svctm :I/O的服務處理時間,即不包括請求隊列中的時間
- %util :I/O請求佔用的CPU百分比,值越高,說明I/O越慢
5、查看網絡情況
使用-n選項,結合關鍵詞,查看網絡相關情況。
【用法】:sar [ -n { <關鍵詞> [,…] | ALL } ]
關鍵詞
DEV 網卡
EDEV 網卡 (錯誤)
NFS NFS 客戶端
NFSD NFS 服務器
SOCK Sockets (套接字) (v4)
IP IP 流 (v4)
EIP IP 流 (v4) (錯誤)
ICMP ICMP 流 (v4)
EICMP ICMP 流 (v4) (錯誤)
TCP TCP 流 (v4)
ETCP TCP 流 (v4) (錯誤)
UDP UDP 流 (v4)
SOCK6 Sockets (套接字) (v6)
IP6 IP 流 (v6)
EIP6 IP 流 (v6) (錯誤)
ICMP6 ICMP 流 (v6)
EICMP6 ICMP 流 (v6) (錯誤)
UDP6 UDP 流 (v6)
$ sar -n DEV 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16時06分16秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
16時06分17秒 lo 13.13 13.13 1.57 1.57 0.00 0.00 0.00
16時06分17秒 eth0 13.13 106.06 0.80 6.40 0.00 0.00 0.00
16時06分17秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
16時06分18秒 lo 13.27 13.27 1.58 1.58 0.00 0.00 0.00
16時06分18秒 eth0 14.29 110.20 1.09 6.98 0.00 0.00 0.00
平均時間: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
平均時間: lo 13.20 13.20 1.57 1.57 0.00 0.00 0.00
平均時間: eth0 13.71 108.12 0.94 6.69 0.00 0.00 0.00
- IFACE :本地網卡接口的名稱
- rxpck/s :每秒鐘接受的數據包
- txpck/s :每秒鐘發送的數據庫
- rxKB/S :每秒鐘接受的數據包大小,單位爲KB
- txKB/S :每秒鐘發送的數據包大小,單位爲KB
- rxcmp/s :每秒鐘接受的壓縮數據包
- txcmp/s :每秒鐘發送的壓縮包
- rxmcst/s :每秒鐘接收的多播數據包
$ sar -n EDEV 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16時08分16秒 IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
16時08分17秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16時08分17秒 eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16時08分17秒 IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
16時08分18秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16時08分18秒 eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均時間: IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
平均時間: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均時間: eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- IFACE :網卡名稱
- rxerr/s :每秒鐘接收到的損壞的數據包
- txerr/s :每秒鐘發送的數據包錯誤數
- coll/s :當發送數據包時候,每秒鐘發生的衝撞(collisions)數,這個是在半雙工模式下才有
- rxdrop/s :當由於緩衝區滿的時候,網卡設備接收端每秒鐘丟掉的網絡包的數目
- txdrop/s :當由於緩衝區滿的時候,網絡設備發送端每秒鐘丟掉的網絡包的數目
- txcarr/s :當發送數據包的時候,每秒鐘載波錯誤發生的次數
- rxfram/s :在接收數據包的時候,每秒鐘發生的幀對其錯誤的次數
- rxfifo/s :在接收數據包的時候,每秒鐘緩衝區溢出的錯誤發生的次數
- txfifo/s 在發生數據包 的時候,每秒鐘緩衝區溢出的錯誤發生的次數
$ sar -n TCP 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16時12分15秒 active/s passive/s iseg/s oseg/s
16時12分16秒 0.00 0.00 6.06 9.09
16時12分17秒 0.00 0.00 2.02 2.02
平均時間: 0.00 0.00 4.04 5.56
- active/s :新的主動連接
- passive/s :新的被動連接
- iseg/s :接受的段
- oseg/s :輸出的段
$ sar -n SOCK 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16時13分59秒 totsck tcpsck udpsck rawsck ip-frag tcp-tw
16時14分00秒 434 26 19 1 0 0
16時14分01秒 434 26 19 1 0 0
平均時間: 434 26 19 1 0 0
- totsck :當前被使用的socket總數
- tcpsck :當前正在被使用的TCP的socket總數
- udpsck :當前正在被使用的UDP的socket總數
- rawsck :當前正在被使用於RAW的skcket總數
- if-frag :當前的IP分片的數目
- tcp-tw :TCP套接字中處於TIME-WAIT狀態的連接數量
6、查看頁面交換髮生狀況
$ sar -W 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
15時51分29秒 pswpin/s pswpout/s
15時51分30秒 0.00 0.00
15時51分31秒 0.00 0.00
平均時間: 0.00 0.00
- pswpin/s:每秒系統換入的交換頁面(swap page)數量
- pswpout/s:每秒系統換出的交換頁面(swap page)數量
四、總結
懷疑CPU存在瓶頸,可用 sar -u 和 sar -q 等來查看
懷疑內存存在瓶頸,可用sar -B、sar -r 和 sar -W 等來查看
懷疑I/O存在瓶頸,可用 sar -b、sar -u 和 sar -d 等來查看