工作中總會碰到幾次要分析機器曆史問題的需求,之前沒有系統化的整理過,也沒有深入的去了解那些排查系統性能工具的名額輸出,導緻在遇上這種需求的時候,總是心虛,能搪塞過去就搪塞過去,不過随着工作年限的增加,遇到這種需求,再說不出個123來,就配不上工牌上那“進階運維工程師”幾個字了。這篇文章,就來拆解下這個linux曆史問題排查神器-sar指令 。
如果你的系統沒有安裝sysstat這個包,那麼是沒有sar指令的,也不會有可分析的檔案,需要執行指令yum -y install sysstat去安裝,安裝完成後,就有sar指令了。同時也會自動生成相關目錄及計劃任務/etc/cron.d/sysstat。
sar常用指令
假設你要全面的分析系統名額,又沒有足夠的耐心将這篇文章看完,想着現學現賣,那麼直接執行下面的指令,然後去看系統輸出的各項名額吧,看不懂的,就來這個頁面搜尋下名額名稱,就可以找到對應的解釋,如果文章中沒有解釋,那就需要去文章開頭附的參考資料中尋找答案了。
萬能的sar指令如下:
# 輸出26日的20:00:01到23:00:01之間的所有報告
$ sar -f sa26 -A -s 20:00:01 -e 23:00:01 | less
# 每隔3s列印下目前系統的所有性能名額并輸出到/tmp/sar_3.log檔案中
$ sar -A 3 >> /tmp/sar_3.log
各選項如下:
-f:指定要分析的檔案sa檔案,預設保留近三十天的,檔案名格式:sa[日期],如1号的就是sa1,15号的就是sa15,不過建議使用stat指令查一下檔案最近改動時間,比如sa15,查出來的可能是上個月15号的日志,等到這個月16号,再看sa15這個檔案,那麼檔案最近改動時間,就是當月的15号了,上月的已經被删除了。在分析之前,一定要先确認自己分析的檔案沒錯哦,别分析了半天,看的不是你想看的那天的,那就尴尬了。
-A:輸出全部的性能名額,包括磁盤、系統平均負載、記憶體、網卡流量等等,如果想單獨輸出某方面的名額,需要加其他選項,這個後面細說。
-s:指定要輸出的報告起始時間,上面的指令是輸出20:00:01之後的。
-e:指定要輸出的報告截止時間,上面的指令是輸出23:00:01之前的。
-u:輸出CPU使用情況的統計資訊
-v:輸出inode、檔案和其他核心表的統計資訊
-d:輸出每一個塊裝置的活動資訊
-r:輸出記憶體和交換空間的統計資訊
-b:顯示I/O和傳送速率的統計資訊
-a:檔案讀寫情況
-c:輸出程序統計資訊,每秒建立的程序數
-R:輸出記憶體頁面的統計資訊
-y:終端裝置活動情況
-w:輸出系統交換活動資訊
CPU相關名額
# 輸出26号,20:00:00到22:00:00,CPU相關的名額(-P ALL:輸出每個核心的詳細名額資訊)
$ sar -f sa26 -u -P ALL -u ALL -s 20:00:00 -e 22:00:00
輸出的各項名額含義如下:
- CPU:表示目前是哪個CPU,all表示所有cpu的名額平均值。
- %usr:CPU在使用者模式下,執行程序的時間百分比 。
- %nice:CPU處在帶NICE值的使用者模式下的時間百分比。
- %system: CPU處在系統模式(核心态)下,執行程序的時間百分比。
- %iowait:CPU用于等待I/O操作完成(等待輸入輸出完成),占用CPU總時間的百分比,如果此值過高,表示硬碟存在I/O瓶頸 。
- %steal:管理程式為另一個虛拟程序提供服務而等待虛拟CPU的百分比。
- %irq:CPU服務硬體中斷(簡稱硬中斷)所花費的時間百分比。
- %soft:CPU服務軟體中斷(簡稱軟中斷)所花費的時間百分比。
- %guest:CPU運作虛拟處理器所花費的時間百分比。
- %gnice:Percentage of time spent by the CPU or CPUs to run a niced guest.
- %idle:CPU空閑時間百分比,如果此值過高,表示CPU較空閑。如果此值高但系統響應慢時,有可能是 CPU 等待配置設定記憶體,此時應檢視記憶體使用,必要時需要加大記憶體容量 ,如果此值持續低于10,則系統的 CPU 處理能力相對較低,表明系統中最需要解決的資源是 CPU。
任務建立和系統切換活動相關
# 輸出26号,20:00:00到22:00:00,任務建立和系統切換活動相關名額
$ sar -f sa26 -w -s 20:00:00 -e 22:00:00
各項名額解釋如下:
proc/s:每秒建立的總任務數
cswch/s:每秒上下文切換的總數。
系統負載相關
# 輸出26号,20:00:00到22:00:00,程序隊列長度和平均負載狀态的名額
$ sar -f sa26 -q -s 20:00:00 -e 22:00:00
輸出的各項名額含義如下:
runq-sz :運作隊列的長度,等待運作的程序數量
plist-sz:程序清單中程序和線程的數量
ldavg-1 :最後1分鐘的系統平均負載
ldavg-5 :過去5分鐘的系統平均負載
ldavg-15:過去15分鐘的系統平均負載
blocked:目前阻塞的等待I/O完成的任務數。
記憶體統計資訊相關
# 輸出26号,20:00:00到22:00:00,記憶體統計資訊相關的名額
$ sar -f sa26 -R -s 20:00:00 -e 22:00:00
輸出的各項名額含義如下:
frmpg/s:系統每秒釋放的記憶體頁數。負數表示系統配置設定的頁面數。注意,根據機器的體系結構,頁面的大小為4 kB或8 kB。
bufpg/s:每秒系統用作緩沖區的額外記憶體頁數。負值意味着系統使用更少的頁作為緩沖區。
campg/s:系統每秒緩存的額外記憶體頁數。負值意味着緩存中的頁面更少。
記憶體和交換空間相關
# 輸出26号,20:00:00到22:00:00,記憶體和交換空間相關的名額
$ sar -f sa26 -r -u ALL -s 20:00:00 -e 22:00:00
輸出的各項名額含義如下:
kbmemfree:空閑的記憶體數量(機關為KB),這個值和free指令中的free值基本一緻,不包括buffer和cache的空間。
kbmemused:已使用的記憶體數量,不包含核心使用的記憶體(機關為KB)。這個值和free指令中的used值基本一緻,是以它包括buffer和cache的空間。
%memused:已使用記憶體的百分數。實體記憶體使用率,這個值是kbmemused和記憶體總量(不包括swap)的一個百分比。
kbbuffers:核心緩沖區buffer,使用的記憶體數量(機關為KB)。這個值就是free指令中的buffer。
kbcached:核心高速緩存cache資料使用的記憶體數量(機關為KB)。這個值就是free指令中的cache。
kbcommit:保證目前系統所需要的記憶體,即為了確定不溢出而需要的記憶體(RAM+swap)。
%commit:這個值是kbcommit與記憶體總量(包括swap)的一個百分比。
kbactive:以KB為機關的活動記憶體數量(最近使用的記憶體,除非絕對必要,通常不會回收)。
kbinact:非活動記憶體的數量(以KB為機關)(最近使用較少的記憶體)。
kbdirty:等待“寫回磁盤”的以KB為機關的記憶體量。
系統交換活動相關資訊
# 輸出26号,20:00:00到22:00:00,系統交換活動相關的名額
$ sar -f sa26 -W -s 20:00:00 -e 22:00:00
輸出的各項名額含義如下:
pswpin/s:每秒系統換入的交換頁面(swap page)數量
pswpout/s:每秒系統換出的交換頁面(swap page)數量
記憶體分頁相關
# 輸出26号,20:00:00到22:00:00,記憶體和交換空間相關的名額
$ sar -f sa26 -B -s 20:00:00 -e 22:00:00
輸出的各項名額含義如下:
pgpgin/s:每秒從磁盤空間或交換空間置換到記憶體的位元組數(機關為KB)。
pgpgout/s:每秒從記憶體置換到磁盤空間或交換空間的位元組數(機關為KB)。
fault/s:每秒鐘系統産生的缺頁數(主缺頁加次缺頁)。
majflt/s:每秒鐘産生的主缺頁數。
pgfree/s:每秒被放入空閑隊列中的頁個數。
pgscank/s:每秒被kswapd掃描的頁個數。
pgscand/s:每秒直接被掃描的頁個數。
pgsteal/s:每秒鐘從cache中被清除來滿足記憶體需要的頁個數。
%vmeff:每秒清除的頁占總掃描頁的百分比。
網絡裝置統計相關
# 輸出26号,20:00:00到22:00:00,eth0這塊網卡的網絡裝置統計相關的名額
# 省略egrep的話,輸出所有網卡,也可以egrep中填入多塊網卡名稱,| 分隔即可
$ sar -f sa26 -n DEV -s 20:00:00 -e 22:00:00 | egrep 'eth0|IFACE'
輸出的各項名額含義如下:
IFACE:網絡裝置名。
rxpck/s:每秒接收的包數量。
txpck/s:每秒傳輸的包數量。
rxbyt/s:每秒接收的位元組數(機關為byte)。
txbyt/s:每秒傳輸的位元組數(機關為byte)。
rxkB/s:每秒收的資料量(機關為kB)。
txkB/s:每秒發的資料量(機關為kB)。
rxcmp/s:每秒接收壓縮包的數量。
txcmp/s:每秒傳輸壓縮包的數量。
rxmcst/s:每秒接收的多點傳播(multicast)包的總數排查網絡裝置故障。
網絡裝置故障相關
# 輸出26号,20:00:00到22:00:00,eth0這塊網卡的故障相關的名額(省略egrep的話,輸出所有網卡,也可以egrep中填入多塊網卡名稱,| 分隔即可)
$ sar -f sa26 -n EDEV -s 20:00:00 -e 22:00:00 | egrep 'eth0|IFACE'
輸出的各項名額含義如下:
IFACE:網絡裝置名。
rxerr/s:每秒接收的壞包數量。
txerr/s:傳輸包時每秒發生錯誤的數量。
coll/s:傳輸包時每秒發生沖突的數量。
rxdrop/s:接收包時,每秒丢棄的包的數量(缺乏緩存導緻)。
txdrop/s:傳輸包時,每秒丢棄的包的數量(缺乏緩存導緻)。
txcarr/s:傳輸包時,每秒發生的傳輸錯誤的數量。
rxfram/s:接收包時,每秒發生幀校驗錯誤的數量。
rxfifo/s:接收包時,每秒鐘緩沖區溢出錯誤的數量。
txfifo/s:傳輸包時,每秒鐘緩沖區溢出錯誤的數量。
I/O和傳送速率
# 輸出26号,20:00:00到22:00:00,機器上所有I/O和傳送速率相關名額
$ sar -f sa26 -b -s 20:00:00 -e 22:00:00
輸出的各項名額含義如下:
tps:每每秒向磁盤裝置請求資料的次數,包括讀、寫請求,其為rtps與wtps的和。每一次IO下發後會先将多個請求合并為一個I/O磁盤請求,這裡tps指請求合并後的請求計數
rtps:每秒向磁盤裝置的讀請求次數
wtps:每秒向磁盤裝置的寫請求次數
bread/s:每秒鐘從實體裝置讀入的資料量,機關為 塊/s
bwrtn/s:每秒鐘向實體裝置寫入的資料量,機關為 塊/s
磁盤相關
# 輸出26号,20:00:00到22:00:00,機器上所有磁盤的使用相關名額
$ sar -f sa26 -d -p -s 20:00:00 -e 22:00:00
# -p:列印裝置的名字。此選項與選項-d一起使用。預設不加-p的話情況下,名稱列印為dev m-n,
# 其中m和n為裝置的主号碼和副号碼。使用-p選項将顯示裝置名,易讀性更高。
# 裝置的主号碼和副号碼可以通過lsblk指令(輸出的MAJ:MIN列,就是主号碼和副号碼)檢視。
輸出的各項名額含義如下:
DEV:磁盤裝置,加上用參數-p可以列印出sda等磁盤裝置名稱;如不加參數-p,裝置則顯示為dev253-0等。
tps:每秒向磁盤裝置請求資料的次數,包括讀、寫請求,其為rtps與wtps的和。
每一次IO下發後會先将多個請求合并為一個I/O磁盤請求,這裡tps指請求合并後的請求計數。rd_sec/s:每秒讀扇區的次數。
wr_sec/s:每秒寫扇區的次數。
avgrq-sz:平均每次裝置I/O操作的資料大小(扇區)。
avgqu-sz:磁盤請求隊列的平均長度。
await:從請求磁盤到系統處理完,每次請求的平均消耗時間,包括請求隊列等待時間(機關是毫秒)。
svctm:系統處理每次請求的平均時間,不包括在請求隊列中消耗的時間。man手冊中提示該字段将在将來的sysstat版本中删除。不要相信這個名額了。
%util:I/O請求占CPU的百分比。man手冊解釋:Percentage of elapsed time during which I/O requests were issued to the device (bandwidth utilization for the device). Device saturation occurs when this value is close to 100%.