sar命令詳解


sar是強大的linux系統活動狀況收集、報告命令。可以收集CPU,內存,磁盤I/O,網絡等諸多數據。對於性能分析是個可靠的利器,本文介紹sar命令的各種用法。

安裝

sar命令是sysstat下的一個工具,所以安裝sar需要首先安裝sysstat命令,可以考慮yum安裝或者使用源碼包編譯安裝等。yum 安裝十分便捷,不需要任何復雜的調試就可以使用

#ubuntu
sudo apt-get install -y sysstat

#centos
sudo yum install -y sysstat

yum倉庫目前安裝的版本為10.1.5,相對於最新版12.3.1要舊很多,所以新的特性可能會無法使用,我推薦下載最新版本源碼包編譯。

#安裝gcc等重要環境
sudo yum install -y gcc gcc-c++ #centos
sudo apt-get install -y gcc gcc-c++ #ubuntu

#下載安裝包至/tmp目錄
wget http://pagesperso-orange.fr/sebastien.godard/sysstat-12.3.1.tar.gz -O /tmp

#進入/tmp目錄並解壓
cd /tmp && tar -xzvf sysstat-12.3.1.tar.gz

#進入解壓目錄編譯安裝
cd sysstat-12.3.1 && ./configure && make && make install

#最后查看任一命令的版本即可得到sysstat版本
Ξ (bochs) /tmp/sysstat-12.3.1 → mpstat -V
sysstat version 12.3.1
(C) Sebastien Godard (sysstat <at> orange.fr)

初次使用sar命令會遇到如下報錯

Ξ (bochs) ~ → sar
Cannot open /var/log/sa/sa29: No such file or directory
Please check if data collecting is enabled

這是因為sar找不到記錄數據的源文件,這時只需要使用-o參數生成即可sar -o 2 3

常用用法

sar [command] 2 5 : 每2秒輸出一次sar [command],總計輸入五次,省略5表示持續輸出

sar -n DEV 1 -e 22:26:00 >/tmp/123 &:每秒采樣一次網絡情況直到22:26並把采樣數據輸出到/tmp/123

sar -f /var/log/sa/sa27 -s 23:00:00 -e 00:00:00 -r:本月27日23點至0點的內存數據,需要通過crontab設置定時任務

CPU篇

-p

-P {CPU_LIST | ALL}:用於分析多核CPU的性能狀況,可以使用CPU_LIST分析指定核心的CPU狀態,可以使用離散值和連續值,也可以使用ALL分析所有CPU核心狀態。

Ξ (bochs) ~ → sar -P 0 1 3  
Linux 4.15.0-87-generic (test)  02/29/20        _x86_64_        (1 CPU)

16:31:33        CPU     %user     %nice   %system   %iowait    %steal     %idle
16:31:34          0      0.00      0.00      0.00      0.00      0.00    100.00
16:31:35          0      0.00      0.00      0.00      0.00      0.00    100.00
16:31:36          0      0.00      0.00      0.00      0.00      0.00    100.00
Average:          0      0.00      0.00      0.00      0.00      0.00    100.00

表示每秒采集0號CPU狀態,總共采樣3次。

前兩列不必多言,%user指運行非特權用戶進程時間百分率

%nice是指運行特權用戶進程時間百分率

%system是指運行內核進程時間,這個時間包括了CPU處理軟硬中斷的時間

%iowait是指等待I/O完成的時間

%steal是指運行虛擬機的時間百分率,steal意味着被偷走的時間

%idle是指cpu空閑時間百分率,我的機器上並未運行任何程序,所以此列一直為100%

-u

-u[ALL]:報告cpu使用情況,與-p不同的是,-u只能報告所有cpu。ALL選項輸出詳細信息

Ξ (bochs) ~ → sar -u ALL 1 3
Linux 4.15.0-87-generic (test)  02/29/20        _x86_64_        (1 CPU)

17:23:29        CPU      %usr     %nice      %sys   %iowait    %steal      %irq     %soft    %guest    %gnice     %idle
17:23:30        all      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00    100.00
17:23:31        all      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00    100.00
17:23:32        all      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00    100.00
Average:        all      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00    100.00

這里的%usr和-P的%user的區別在於%usr不包括虛擬機運行的時間

這里的%sys和-P的%system的區別在於%sys不包括各種軟硬中斷時間

%irq是指處理硬中斷的cpu時間百分率

%soft是指處理軟中斷的cpu時間百分率

%guest%gnice分別指運行普通虛擬程序和特權虛擬程序的時間百分率

-q

-q:用於報告隊列長度以及平均負載

Ξ (bochs) ~ → sar -q 1 3
Linux 4.15.0-87-generic (test)  02/29/20        _x86_64_        (1 CPU)

16:46:47      runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
16:46:48            0       126      0.00      0.00      0.00         0
16:46:49            0       126      0.00      0.00      0.00         0
16:46:50            0       126      0.00      0.00      0.00         0
Average:            0       126      0.00      0.00      0.00         0

runq-sz:等待cpu調度的任務數

plist-sz :處於任務列表的任務總數

ldavg-1ldavg-5ldavg-15分別指1分鍾,5分鍾,15分鍾內cpu的負載

blocked:表示等待I/O完成而被阻塞的任務總數,不為0則需要留意I/O是否存在性能瓶頸

-w

-w:報告進程上下文切換的次數

Ξ (bochs) ~ → sar -w 1 3 
Linux 4.15.0-87-generic (test)  02/29/20        _x86_64_        (1 CPU)

17:39:43       proc/s   cswch/s
17:39:44         0.00     83.00
17:39:45         0.00    103.00
17:39:46         0.00     96.00
Average:         0.00     94.00

proc/s:指每秒創建的進程數

cswch/s:指每秒自願上下文切換的次數,是指進程無法獲取所需資源,導致的上下文切換。比如說, I/O、內存等系統資源不足時,就會發生自願上下文切換。

還有一個非自願的上下文切換次數nvcswch/s表示則是指進程由於時間片已到等原因,被系統強制調度,進而發生的上下文切換。非自願次數明顯升高意味着cpu產生了性能瓶頸。非自願上下文切換可以使用pidstat加上-w選項來輸出

內存篇

-r

-r [-h]:輸出內存使用率統計信息,-h輸出更加利於閱讀的結果

Ξ (bochs) ~ → sar -r -h 1 3
Linux 4.15.0-87-generic (test)  02/29/20        _x86_64_        (1 CPU)

21:58:21    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
21:58:22       602.6M      1.6G    165.3M      8.3%    196.8M    878.7M    743.3M     37.3%    830.7M    379.7M      4.0k
21:58:23       602.6M      1.6G    165.3M      8.3%    196.8M    878.7M    743.3M     37.3%    830.7M    379.7M      4.0k
21:58:24       602.6M      1.6G    165.3M      8.3%    196.8M    878.7M    743.3M     37.3%    830.7M    379.7M      4.0k
Average:       602.6M      1.6G    165.3M      8.3%    196.8M    878.7M    743.3M     37.3%    830.7M    379.7M      4.0k

kbmemfree:剩余內存總量

kbavail:可用內存總量,可用內存≈剩余內存+buffer+cache

kbmemused:使用的內存總量,使用量=總內存-剩余內存-buffer-cache-slab

kbbuffers:被內核用來作為buffer的內存量

kbcached:被內核用來作為cache的內存量

kbcommit:當前工作負載下,可以保證不出現內存不足的內存量

%commit:指kbcommit占內存/swap的百分率

kbactive:當前活躍內存量。除非萬不得已,這部分內存才會被回收

kbinact:當前非活躍內存總量,當內存不足時,這部分內存最容易被內核收回

kbdirty:臟頁大小,臟頁指的是暫存於內存還沒來得及持久化到硬盤的數據。可以使用sync刷入硬盤

-B

-B:報告系統中分頁統計信息

λ bochs ~ → sar -B 1 3
Linux 4.4.213-1.el7.elrepo.x86_64 (bochs)       03/02/2020      _x86_64_        (1 CPU)

10:43:36 PM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
10:43:37 PM      0.00     60.00     18.00      0.00      5.00      0.00      0.00      0.00      0.00
10:43:38 PM      0.00     20.00    158.00      0.00    153.00      0.00      0.00      0.00      0.00
10:43:39 PM      0.00     60.00     53.00      0.00     71.00      0.00      0.00      0.00      0.00
Average:         0.00     46.67     76.33      0.00     76.33      0.00      0.00      0.00      0.00

pgpgin/s:表示每秒從磁盤中換入內存的字節數

pgpgout/s:表示每秒從內存換出到磁盤的字節數

fault/s:表示系統每秒產生的缺頁異常(報告主缺頁和次缺頁),這不是產生I/O的缺頁中斷的次數,因為部分缺頁中斷不需要I/O就能處理

majflt/s:表示每秒產生的主缺頁異常

pgfree/s:每秒被系統放到空閑列表的分頁數量

pgscank/s:每秒被內核線程[kswapd]掃描的分頁數量

pgscand/s:每秒被直接掃描的數量

pgsteal/s:系統為滿足其內存需求聲明每秒從cache(分頁緩存和swap緩存)回收的頁的數量

%vmeff:這個指標由pgsteal/(pgscand+pgscank)得到,這是一個衡量頁面回收效率的指標

-S

-s [h]:輸出swap空間的使用率統計信息

Ξ (bochs) ~ → sar -S 1 1
Linux 4.15.0-87-generic (test)  02/29/20        _x86_64_        (1 CPU)

22:20:48    kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
22:20:49            0         0      0.00         0      0.00
Average:            0         0      0.00         0      0.00

我的這台機器上未開啟swap,所有的統計信息均為0

kbswpfree:未使用的swap量

kbswpused:使用中的swap內存量

%swpused:使用中的swap內存量占總swap的百分率

kbswpcad:被swap緩存的內存量,這部分內存曾經被換出,現在又被換入但仍然位於swap空間

%swpcad:kbswpcad占kbswpused的百分率

-W

-W統計輸出swap換入換出信息

Ξ (bochs) ~ → sar -W 1 2
Linux 4.15.0-87-generic (test)  02/29/20        _x86_64_        (1 CPU)

22:43:36     pswpin/s pswpout/s
22:43:37         0.00      0.00
22:43:38         0.00      0.00
Average:         0.00      0.00

pswpin/s:每秒換入swap的內存量

pswpout/s:每秒換出swap的內存量

若這兩項數值很高,表示內存短缺導致需要頻繁換入換出。

I/O篇

-b

-b:報告I/O及傳輸速率統計信息

Ξ (bochs) ~ → sar -b 1 3
Linux 4.4.213-1.el7.elrepo.x86_64 (bochs)       03/03/2020      _x86_64_        (1 CPU)

12:52:28 PM       tps      rtps      wtps      dtps   bread/s   bwrtn/s   bdscd/s
12:52:29 PM     10.00      0.00     10.00      0.00      0.00    280.00      0.00
12:52:30 PM     18.00      0.00     18.00      0.00      0.00    256.00      0.00
12:52:31 PM      9.00      0.00      9.00      0.00      0.00    144.00      0.00
Average:        12.33      0.00     12.33      0.00      0.00    226.67      0.00

tps:每秒鍾加到物理設備上的傳輸總量。一次傳輸就是加到物理設備的一次I/O請求,由於多次邏輯請求可以合並為單次的I/O請求,所以一次傳輸的大小是不確定的

rtps:每秒加到物理設備的讀請求總數

wtps:每秒加到物理設備上的寫請求總數

dtps:每秒丟棄的請求總數

bread/s:以塊為單位每秒鍾從磁盤讀取的數據總量,塊的大小等同於一個扇區的大小,512字節

bwrtn/s:以塊為單位每秒鍾寫入磁盤的數據總量

bdscd/s以塊為單位丟棄的數據總量

-d

-d -h[--dev=dev_list]:報告塊設備的活動情況

Ξ (bochs) ~ → sar -d 1 1 
Linux 4.4.213-1.el7.elrepo.x86_64 (bochs)       03/03/2020      _x86_64_        (1 CPU)

08:06:35 PM       DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
08:06:36 PM       vda      9.00      0.00    100.00      0.00     11.11      0.02      1.89      1.70

tps:和-btps含義一樣,都表示每秒鍾加到物理設備上的傳輸總量

rkB/s:每秒從設備讀到的字節數

wkB/s:每秒寫入設備的字節數

areq-sz:加到設備上I/O請求平均大小(以字節為大小)

aqu-sz:加到設備上請求長度的平均值

await:加到設備上I/O請求的平均響應時間,這個時間包括了請求處於等待隊列中的時間

%util:加到設備上I/O請求所用的時間百分比,對於串行設備,接近100%意味着設備出現了性能瓶頸,但是對於並行設備比如RAID或者SSD,這個值實際上並不能反映出設備的極限

-v

-v:報告inode,文件以及其他內核表狀態

Ξ (bochs) ~ → sar -v 1 1
Linux 4.4.213-1.el7.elrepo.x86_64 (bochs)       03/03/2020      _x86_64_        (1 CPU)

08:35:59 PM dentunusd   file-nr  inode-nr    pty-nr
08:36:00 PM      1692      1504      9458         1
Average:         1692      1504      9458         1

dentunusd:目錄緩存中未使用的緩存項數。

file-nr:系統使用的文件句柄數,查看目前使用的文件句柄數lsof|awk '{print $2}'|wc -l

inode-nr:系統使用的inode處理程序數

pty-nr:打開的偽終端數,即幾個人登陸了系統

網絡篇

-n

-n DEV [--iface=face_list]

Ξ (bochs) ~ → sar -n DEV 1 1
Linux 4.4.213-1.el7.elrepo.x86_64 (bochs)       03/03/2020      _x86_64_        (1 CPU)

09:04:07 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
09:04:08 PM        lo     20.00     20.00      1.19      1.19      0.00      0.00      0.00      0.00
09:04:08 PM   docker0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:04:08 PM br-f3a0301d37ae      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:04:08 PM docker_gwbridge      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
09:04:08 PM      eth0      9.00      7.00      0.68      0.78      0.00      0.00      0.00      0.00

IFACE:網絡接口

rxpck/s:每秒接收的報文數

txpck/s:每秒發送的報文數

rxkB/s:每秒接收的字節數,``rxkB/s*1024/rxpck/s`<60B,意味着收到的是小包

txkB/s:每秒發送的字節數

rxcmp/s:每秒接收的壓縮數據包數

txcmp/s:每秒發送的壓縮數據包數

rxmcst/s:每秒接收的多播數據包數

%ifutil:網絡接口的利用率百分比,對於半雙工接口,利用率使用rxkB/stxkB/s之和作為接口速度的百分比計算。對於全雙工,這是rxkB/stxkB/s中的較大值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM