簡介
sar
(System Activity Reporter 系統活動情況報告)是目前 Linux 上最為全面的系統性能分析工具之一,可以從多方面對系統的活動進行報告,包括:文件的讀寫情況、系統調用的使用情況、磁盤 I/O、CPU 效率、內存使用狀況、進程活動及 IPC 有關的活動等。
我們可以使用sar
命令來獲得整個系統性能的報告。這有助于我們定位系統性能的瓶頸,并且有助于我們找出這些煩人的性能問題的解決方法。
Linux 內核維護著一些內部計數器,這些計數器包含了所有的請求及其完成時間和 I/O 塊數等信息,sar
命令從所有的這些信息中計算出請求的利用率和比例,以便找出瓶頸所在。
性能問題排查技巧:
- 懷疑 CPU 存在瓶頸,可用
sar -u
和sar -q
等來查看。 - 懷疑 內存存在瓶頸,可用
sar -B
、sar -r
和sar -W
等來查看。 - 懷疑 I/O 存在瓶頸,可用
sar -b
、sar -u
和sar -d
等來查看。
安裝
sar
命令來自于sysstat
工具包,如果提示sar
命令不存在,需先安裝sysstat
。
yum install systat
語法
語法:sar [選項] [參數]選項:-A:顯示所有的報告信息;-b:顯示I/O速率;-B:顯示換頁狀態;-c:顯示進程創建活動;-d:顯示每個塊設備的狀態;-e:設置顯示報告的結束時間;-f:從指定文件提取報告;-i:設狀態信息刷新的間隔時間;-n:網絡統計信息;-R:顯示內存狀態;-P:報告每個CPU的狀態;-u:顯示CPU整體的利用率;-v:顯示索引節點,文件和其他內核表的狀態;-w:顯示交換分區狀態;-x:顯示給定進程的狀態。參數:間隔時間:每次報告的間隔時間(秒);次數:顯示報告的次數。
示例
常用用法
-
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核心狀態。
[fenglepeng@centos]# sar -P 0 1 3 # 表示每秒采集0號CPU狀態,總共采樣3次。
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:15:32 AM CPU %user %nice %system %iowait %steal %idle
11:15:33 AM 0 2.97 0.00 0.99 0.00 0.00 96.04
11:15:34 AM 0 1.02 0.00 1.02 0.00 0.00 97.96
11:15:35 AM 0 2.00 0.00 2.00 0.00 0.00 96.00
Average: 0 2.01 0.00 1.34 0.00 0.00 96.66
CPU
:0 表示采集的是 0 號CPU,all 表示統計信息為所有 CPU 的平均值。%user
:指運行非特權用戶進程時間百分率。%nice
:是指運行特權用戶進程時間百分率。%system
:是指運行內核進程時間,這個時間包括了CPU處理軟硬中斷的時間。%iowait
:是指等待I/O完成的時間。%steal
:是指運行虛擬機的時間百分率,steal意味著被偷走的時間。%idle
:是指cpu空閑時間百分率,我的機器上并未運行任何程序,所以此列一直為100%。
注意說明:
- 若 %iowait 的值過高,表示硬盤存在I/O瓶頸。
- 若 %idle 的值高但系統響應慢時,有可能是 CPU 等待分配內存,此時應加大內存容量。
- 若 %idle 的值持續低于1,則系統的 CPU 處理能力相對較低,表明系統中最需要解決的資源是 CPU。
-u
-u[ALL]
:報告cpu使用情況,與-p
不同的是,-u
只能報告所有cpu。ALL
選項輸出詳細信息。
[fenglepeng@centos]# sar -u 1 3
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:18:56 AM CPU %user %nice %system %iowait %steal %idle
11:18:57 AM all 0.75 0.00 0.50 0.00 0.00 98.74
11:18:58 AM all 0.75 0.00 1.00 0.00 0.00 98.25
11:18:59 AM all 1.00 0.00 1.00 0.00 0.00 97.99
Average: all 0.84 0.00 0.84 0.00 0.00 98.33
%usr
:和-P的%user的區別在于%usr不包括虛擬機運行的時間。%sys
:和-P的%system的區別在于%sys不包括各種軟硬中斷時間。%irq
:是指處理硬中斷的cpu時間百分率。%soft
:是指處理軟中斷的cpu時間百分率。%guest
和%gnice
:分別指運行普通虛擬程序和特權虛擬程序的時間百分率
-q
-q
:用于報告隊列長度以及平均負載。
[fenglepeng@centos]# sar -q 1 3
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:21:52 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
11:21:53 AM 1 274 0.01 0.05 0.05 0
11:21:54 AM 2 274 0.01 0.05 0.05 0
11:21:55 AM 1 274 0.01 0.05 0.05 0
Average: 1 274 0.01 0.05 0.05 0
runq-sz
:等待cpu調度的任務數。plist-sz
:處于任務列表的任務總數。ldavg-1
,ldavg-5
,ldavg-15
:分別指1分鐘,5分鐘,15分鐘內cpu的負載。blocked
:表示等待I/O完成而被阻塞的任務總數,不為0則需要留意I/O是否存在性能瓶頸。
-w
-w
:報告進程上下文切換的次數。
[fenglepeng@centos]# sar -w 1 3
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:22:40 AM proc/s cswch/s
11:22:41 AM 1.00 470.00
11:22:42 AM 0.00 554.00
11:22:43 AM 1.00 576.00
Average: 0.67 533.33
proc/s
:指每秒創建的進程數。cswch/s
:指每秒自愿上下文切換的次數,是指進程無法獲取所需資源,導致的上下文切換。比如說, I/O、內存等系統資源不足時,就會發生自愿上下文切換。
還有一個非自愿的上下文切換次數nvcswch/s
表示則是指進程由于時間片已到等原因,被系統強制調度,進而發生的上下文切換。非自愿次數明顯升高意味著cpu產生了性能瓶頸。非自愿上下文切換可以使用pidstat加上-w
選項來輸出。
內存狀態統計
-r
-r [-h]
:輸出內存使用率統計信息,-h輸出更加利于閱讀的結果。
[fenglepeng@centos]# sar -r 1 3
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:25:33 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
11:25:34 AM 267436 7722624 96.65 8 5884448 2678356 26.55 4260324 2498512 52
11:25:35 AM 267452 7722608 96.65 8 5884448 2678356 26.55 4260324 2498512 52
11:25:36 AM 267452 7722608 96.65 8 5884448 2678356 26.55 4260328 2498512 52
Average: 267447 7722613 96.65 8 5884448 2678356 26.55 4260325 2498512 52
kbmemfree
:剩余內存總量。kbavail
:可用內存總量,可用內存≈剩余內存+buffer+cache。kbmemused
:使用的內存總量,使用量=總內存-剩余內存-buffer-cache-slab。kbbuffers
:被內核用來作為buffer的內存量。kbcached
:被內核用來作為cache的內存量。kbcommit
:當前工作負載下,可以保證不出現內存不足的內存量。%commit
:指kbcommit
占內存/swap的百分率。kbactive
:當前活躍內存量。除非萬不得已,這部分內存才會被回收。kbinact
:當前非活躍內存總量,當內存不足時,這部分內存最容易被內核收回。kbdirty
:臟頁大小,臟頁指的是暫存于內存還沒來得及持久化到硬盤的數據。可以使用sync
刷入硬盤。
-B
-B
:報告系統中分頁統計信息。
[fenglepeng@centos]#sar -B 1 3
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:26:53 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
11:26:54 AM 0.00 0.00 37.00 0.00 108.00 0.00 0.00 0.00 0.00
11:26:55 AM 0.00 9.00 33.00 0.00 50.00 0.00 0.00 0.00 0.00
11:26:56 AM 0.00 9.00 23.00 0.00 63.00 0.00 0.00 0.00 0.00
Average: 0.00 6.00 31.00 0.00 73.67 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空間的使用率統計信息。
[fenglepeng@centos]# sar -S 1 3
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:28:03 AM kbswpfree kbswpused %swpused kbswpcad %swpcad
11:28:04 AM 2097148 0 0.00 0 0.00
11:28:05 AM 2097148 0 0.00 0 0.00
11:28:06 AM 2097148 0 0.00 0 0.00
Average: 2097148 0 0.00 0 0.00
kbswpfree
:未使用的swap量。kbswpused
:使用中的swap內存量。%swpused
:使用中的swap內存量占總swap的百分率。kbswpcad
:被swap緩存的內存量,這部分內存曾經被換出,現在又被換入但仍然位于swap空間。%swpcad:
kbswpcad占kbswpused的百分率。
-W
-W
統計輸出swap換入換出信息。
[fenglepeng@centos]#sar -W 1 3
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:28:52 AM pswpin/s pswpout/s
11:28:53 AM 0.00 0.00
11:28:54 AM 0.00 0.00
11:28:55 AM 0.00 0.00
Average: 0.00 0.00
pswpin/s
:每秒換入swap的內存量。pswpout/s
:每秒換出swap的內存量。
若這兩項數值很高,表示內存短缺導致需要頻繁換入換出。
I/O篇狀態統計
-b
-b
:報告I/O及傳輸速率統計信息。
[fenglepeng@centos]#sar -b 1 3
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:29:34 AM tps rtps wtps bread/s bwrtn/s
11:29:35 AM 0.00 0.00 0.00 0.00 0.00
11:29:36 AM 0.00 0.00 0.00 0.00 0.00
11:29:37 AM 5.00 0.00 5.00 0.00 87.00
Average: 1.67 0.00 1.67 0.00 29.00
tps
:每秒鐘加到物理設備上的傳輸總量。一次傳輸就是加到物理設備的一次I/O請求,由于多次邏輯請求可以合并為單次的I/O請求,所以一次傳輸的大小是不確定的。rtps
:每秒加到物理設備的讀請求總數。wtps
:每秒加到物理設備上的寫請求總數。dtps
:每秒丟棄的請求總數。bread/s
:以塊為單位每秒鐘從磁盤讀取的數據總量,塊的大小等同于一個扇區的大小,512字節。bwrtn/s
:以塊為單位每秒鐘寫入磁盤的數據總量。bdscd/s
以塊為單位丟棄的數據總量。
-d
-d -h[--dev=dev_list]
:報告塊設備的活動情況。
[fenglepeng@centos]#sar -d 1 1
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:30:26 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
11:30:27 AM dev2-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11:30:27 AM dev8-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11:30:27 AM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11:30:27 AM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11:30:27 AM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: dev2-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
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,文件以及其他內核表狀態。
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:31:03 AM dentunusd file-nr inode-nr pty-nr
11:31:04 AM 259766 2112 252444 1
Average: 259766 2112 252444 1
dentunusd
:目錄緩存中未使用的緩存項數。file-nr
:系統使用的文件句柄數,查看目前使用的文件句柄數lsof|awk '{print $2}'|wc -l
。inode-nr
:系統使用的inode處理程序數。pty-nr
:打開的偽終端數,即幾個人登陸了系統。
網絡篇狀態統計
-n
sar -n { DEV | EDEV | NFS | NFSD | SOCK | ALL }
,sar 提供六種不同的語法選項來顯示網絡信息。
- DEV顯示網絡接口信息。
- EDEV顯示關于網絡錯誤的統計數據。
- NFS統計活動的NFS客戶端的信息。
- NFSD統計NFS服務器的信息。
- SOCK顯示套接字信息。
- ALL顯示所有5個開關。它們可以單獨或者一起使用。
如果你使用DEV關鍵字,那么sar將匯報和網絡設備相關的信息,如lo,ens160等,例如:
[fenglepeng@centos]# sar -n DEV 1 1
Linux 3.10.0-1160.11.1.el7.x86_64 (template-centos7) 12/21/2022 _x86_64_ (4 CPU)11:31:48 AM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
11:31:49 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11:31:49 AM ens160 13.00 2.00 1.24 0.35 0.00 0.00 0.00Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: ens160 13.00 2.00 1.24 0.35 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
中的較大值。。