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-1
,ldavg-5
,ldavg-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
:和-b
的tps
含義一樣,都表示每秒鍾加到物理設備上的傳輸總量
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/s
和txkB/s
之和作為接口速度的百分比計算。對於全雙工,這是rxkB/s
或txkB/s
中的較大值。