sar`(System Activity Reporter 系統活動情況報告)是目前 Linux 上最為全面的系統性能分析工具之一,可以從多方面對系統的活動進行報告,包括:文件的讀寫情況、系統調用的使用情況、磁盤 I/O、CPU 效率、內存使用狀況、進程活動及 IPC 有關的活動等。
我們可以使用sar
命令來獲得整個系統性能的報告。這有助於我們定位系統性能的瓶頸,並且有助於我們找出這些煩人的性能問題的解決方法。
Linux 內核維護着一些內部計數器,這些計數器包含了所有的請求及其完成時間和 I/O 塊數等信息,sar
命令從所有的這些信息中計算出請求的利用率和比例,以便找出瓶頸所在。
sar命令主要的用途是生成某段時間內所有活動的報告,因此必需確保
sar`命令在適當的時間進行數據采集(而不是在午餐時間或者周末)
命令參數
用法: sar [ 選項 ] [ <時間間隔> [ <次數> ] ]
主選項和報告:
-b I/O 和傳輸速率信息狀況
-B 分頁狀況
-d 塊設備狀況
-I { <中斷> | SUM | ALL | XALL }
中斷信息狀況
-m 電源管理信息狀況
-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)
-q 隊列長度和平均負載
-r 內存利用率
-R 內存狀況
-S 交換空間利用率
-u [ ALL ]
CPU 利用率
-v Kernel table 狀況
-w 任務創建與系統轉換統計信息
-W 交換信息
-y TTY 設備狀況
-o {<文件路徑>}
將命令結果以二進制格式存放在指定文件中
常用命令
sar
命令來自於sysstat
工具包,如果提示sar
命令不存在,需先安裝sysstat
。
網絡統計信息
sar -n <關鍵詞> [ <時間間隔> [ <次數> ] ]
示例:
命令中 1 5 表示每一秒鍾取 1 次值,一共取 5 次。
命令執行后會列出每個網卡這 5 次取值的平均數據,根據實際情況來確定帶寬跑滿的網卡名稱,
CPU 利用率
sar -u [ <時間間隔> [ <次數> ] ]
示例:
root@ubuntu:~# sar -u 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
01:44:59 AM CPU %user %nice %system %iowait %steal %idle
01:45:00 AM all 0.50 0.00 2.50 0.00 0.00 97.00
01:45:01 AM all 1.02 0.00 1.53 0.00 0.00 97.45
01:45:02 AM all 2.01 0.00 3.52 11.56 0.00 82.91
Average: all 1.18 0.00 2.52 3.87 0.00 92.44
root@ubuntu:~#
命令中 1 3 表示每一秒鍾取 1 次值,一共取 3 次。
輸出項說明:
CPU:all 表示統計信息為所有 CPU 的平均值。
%user:顯示在用戶級別(application)運行使用 CPU 總時間的百分比
%nice:顯示在用戶級別,用於nice操作,所占用 CPU 總時間的百分比
即:用戶進程空間內改變過優先級的進程占用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
索引節點,文件和其他內核表的狀態
sar -v [ <時間間隔> [ <次數> ] ]
示例:
root@ubuntu:~# sar -v 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
01:50:30 AM dentunusd file-nr inode-nr pty-nr
01:50:31 AM 10487 7104 28040 2
01:50:32 AM 10487 7104 28040 2
01:50:33 AM 10487 7104 28040 2
Average: 10487 7104 28040 2
root@ubuntu:~#
輸出項說明:
dentunusd:目錄高速緩存中未被使用的條目數量
file-nr:文件句柄(file handle)的使用數量
inode-nr:索引節點句柄(inode handle)的使用數量
pty-nr:使用的 pty 數量
內存利用率
sar -r [ <時間間隔> [ <次數> ] ]
示例:
root@ubuntu:~# sar -r 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
01:51:59 AM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
01:52:00 AM 6829576 7191212 1314884 16.14 77508 494124 2902068 16.58 409396 587336 920
01:52:01 AM 6829576 7191212 1314884 16.14 77508 494124 2902068 16.58 409396 587336 920
01:52:02 AM 6829576 7191212 1314884 16.14 77508 494124 2902068 16.58 409396 587336 932
Average: 6829576 7191212 1314884 16.14 77508 494124 2902068 16.58 409396 587336 924
root@ubuntu:~#
輸出項說明:
kbmemfree:這個值和 free 命令中的 free 值基本一致,所以它不包括 buffer 和 cache 的空間
kbmemused:這個值和 free 命令中的 used 值基本一致,所以它包括 buffer 和 cache 的空間
%memused:這個值是 kbmemused 和內存總量(不包括 swap)的一個百分比
kbbuffers 和 kbcached:這兩個值就是 free 命令中的 buffer 和 cache
kbcommit:保證當前系統所需要的內存,即為了確保不溢出而需要的內存(RAM + swap)
%commit:這個值是 kbcommit 與內存總量(包括 swap)的一個百分比
Kbactive:活動內存量(以千字節計算)(最近使用的內存,通常不會被收回,除非絕對必要)
kbinact:不活動內存量(以千字節計算的內存(最近使用的內存),更有資格被用於其他目的)。
kbdirty:以KB為單位的內存量等待寫入磁盤
內存分頁狀況
sar -B [ <時間間隔> [ <次數> ] ]
示例:
root@ubuntu:~# sar -B 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
01:57:43 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
01:57:44 AM 0.00 0.00 18.00 0.00 4.00 0.00 0.00 0.00 0.00
01:57:45 AM 0.00 0.00 2.00 0.00 2.00 0.00 0.00 0.00 0.00
01:57:46 AM 0.00 0.00 0.00 0.00 3.00 0.00 0.00 0.00 0.00
Average: 0.00 0.00 6.67 0.00 3.00 0.00 0.00 0.00 0.00
root@ubuntu:~#
輸出項說明:
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)的百分比
I/O 和傳輸速率信息狀況
sar -b [ <時間間隔> [ <次數> ] ]
示例:
root@ubuntu:~# sar -b 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
01:59:58 AM tps rtps wtps bread/s bwrtn/s
01:59:59 AM 2.00 0.00 2.00 0.00 128.00
02:00:00 AM 0.00 0.00 0.00 0.00 0.00
02:00:01 AM 0.00 0.00 0.00 0.00 0.00
Average: 0.67 0.00 0.67 0.00 42.67
root@ubuntu:~#
輸出項說明:
tps:每秒鍾物理設備的 I/O 傳輸總量
rtps:每秒鍾從物理設備讀入的數據總量
wtps:每秒鍾向物理設備寫入的數據總量
bread/s:每秒鍾從物理設備讀入的數據量,單位為:塊/s
bwrtn/s:每秒鍾向物理設備寫入的數據量,單位為:塊/s
隊列長度和平均負載
sar -q [ <時間間隔> [ <次數> ] ]
示例:
root@ubuntu:~# sar -q 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
02:01:22 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
02:01:23 AM 0 430 0.15 0.07 0.18 0
02:01:24 AM 0 430 0.15 0.07 0.18 0
02:01:25 AM 0 431 0.15 0.07 0.18 0
Average: 0 430 0.15 0.07 0.18 0
root@ubuntu:~#
輸出項說明:
runq-sz:運行隊列的長度(等待運行的進程數)
plist-sz:進程列表中進程(processes)和線程(threads)的數量
ldavg-1:最后1分鍾的系統平均負載(System load average)
ldavg-5:過去5分鍾的系統平均負載
ldavg-15:過去15分鍾的系統平均負載
blocked:當前阻塞的任務數,等待I / O完成
系統交換信息
sar -q [ <時間間隔> [ <次數> ] ]
示例:
[root@node-1 yum.repos.d]# sar -W 5 3
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld) 09/18/2019 _x86_64_ (8 CPU)
05:19:59 PM pswpin/s pswpout/s
05:20:04 PM 0.00 0.00
05:20:09 PM 0.00 64.00
05:20:14 PM 0.00 0.00
Average: 0.00 21.33
[root@node-1 yum.repos.d]#
輸出項說明:
pswpin/s:每秒系統換入的交換頁面(swap page)數量
pswpout/s:每秒系統換出的交換頁面(swap page)數量
塊設備狀況
sar -d [ <時間間隔> [ <次數> ] ]
示例:
[root@node-1 ~]# sar -d 1 3
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld) 09/18/2019 _x86_64_ (8 CPU)
05:21:21 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:21:22 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:22 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:22 PM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:22 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:22 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:22 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:21:23 PM dev8-0 3.00 0.00 192.00 64.00 0.00 0.00 0.00 0.00
05:21:23 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:23 PM dev253-0 24.00 0.00 192.00 8.00 0.00 0.00 0.00 0.00
05:21:23 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:23 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:23 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:21:24 PM dev8-0 4.00 8.00 160.00 42.00 0.00 0.00 0.00 0.00
05:21:24 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:24 PM dev253-0 18.00 8.00 160.00 9.33 0.00 0.00 0.00 0.00
05:21:24 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:24 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
Average: dev8-0 2.33 2.67 117.33 51.43 0.00 0.00 0.00 0.00
Average: dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev253-0 14.00 2.67 117.33 8.57 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
Average: dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
[root@node-1 ~]#
輸出項說明:
參數-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% 時,表示設備帶寬已經占滿。
輸出統計的數據信息
示例:
[root@node-1 ~]# sar -o sarfile.log -u 1 3
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld) 09/18/2019 _x86_64_ (8 CPU)
05:24:18 PM CPU %user %nice %system %iowait %steal %idle
05:24:19 PM all 16.96 0.00 4.68 0.00 0.00 78.35
05:24:20 PM all 5.68 0.00 1.26 0.00 0.00 93.06
05:24:21 PM all 8.06 0.00 3.53 0.00 0.00 88.41
Average: all 10.23 0.00 3.16 0.00 0.00 86.62
[root@node-1 ~]#
上述示例命令會將sar -u 1 3
采集到的數據以二進制的格式存放到文件sarfile.log
中。
我們還可以通過命令sadf -d sarfile.log
將二進制數據文件轉換成數據庫可讀的格式。
sadf -d sarfile.log | sed 's/;/,/g' > sarfile.csv
也可以將這些數據存儲在一個 csv 文檔中,然后繪制成圖表展示方式,如下所示:
從數據文件讀取信息
sar -f <文件路徑>
示例:
又將之前存儲在二進制文件中的數據給讀取並展示出來。
[root@node-1 ~]# sar -f sarfile.log
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld) 09/18/2019 _x86_64_ (8 CPU)
05:24:18 PM CPU %user %nice %system %iowait %steal %idle
05:24:19 PM all 16.96 0.00 4.68 0.00 0.00 78.35
05:24:20 PM all 5.68 0.00 1.26 0.00 0.00 93.06
05:24:21 PM all 8.06 0.00 3.53 0.00 0.00 88.41
Average: all 10.23 0.00 3.16 0.00 0.00 86.62
[root@node-1 ~]#
性能問題排查技巧
- 懷疑 CPU 存在瓶頸,可用
sar -u
和sar -q
等來查看 - 懷疑內存存在瓶頸,可用
sar -B
、sar -r
和sar -W
等來查看 - 懷疑 I/O 存在瓶頸,可用
sar -b
、sar -u
和sar -d
等來查看