天天看點

《sar訪談》-linux指令五分鐘系列之二十九

[正文開始]

好久沒有寫内容翔實的文章了,最近我和Lee.MaRs都比較忙,公司的項目都很緊啊:)

首先先恭喜一下linux大棚,訂閱人數已經達到了988人。我很期待1000時代的到來!

《sar訪談》-linux指令五分鐘系列之二十九

===

言歸正傳,今天為大家介紹一個好朋友,名字叫sar,它的腦子裡全是機器系統性能的資訊,你隻要和它搞好關系,以後想獲得任何這方面的資訊,可就不愁了!

1 sar是做什麼的?

主要負責收集、彙報與存儲系統運作資訊的。

2 sar怎麼控制資訊輸出的時間間隔和次數?

有兩個參數非常非常常用,就是“時間間隔”和“輸出次數”。

時間間隔表示兩次資訊輸出之間的時間間隔,機關是秒。如果這個值被設定為0,則表示所輸出的資訊是從開機到現在為止的資訊平均值。如果不是0,sar計算就都是從目前開始的資訊的平均值。

輸出次數表示輸出系統資訊的次數,預設是1次。如果這個值被設定為0,則會永遠的輸出下去。

比如:sar 60 5 表示每60秒輸出一次,共輸出5次。(如果你腦子夠快的話,會發現這個指令将曆時300秒,因為每一次資訊輸出前會先停頓60秒的。)

3 怎麼把sar輸出的這些有用資訊存到檔案中去呢?

sar專門提供了一個選項-o filename,你隻要使用它,就可以喽!

比如 sar 5 6 -o sys_info

不過,不幸的是,當你用cat看sys_info時發現全都是亂碼,呵呵,别着急,sar為你準備了-f filename選項,你隻要用-f設定要讀取的資訊存儲檔案,就可以清晰地讀出資訊了。

比如sar -f sys_info。

如果你覺得這種格式有些不利于處理,試試加上-h選項,你将獲得不一樣的體驗。:D

4 如果我使用-o時,竟然忘了輸入檔案名,sar會抱怨麼?

如果你隻寫了-o,沒寫具體檔案名,那麼sar會自動把輸出資訊更記錄在/var/log/saDD檔案裡,其中DD表示當天的日期數字。

比如sar 2 2 -o

那麼輸出資訊會記錄在/var/log/sa/sa17檔案裡,因為今天是2009年10月17日。

5 如果我的CPU是多核處理器,那麼sar能知道某一個核的運作資訊麼?

完全沒問題的。有一個選項-P,就是用來為多核處理器而設計的。

當在使用sar指令而沒有設定-P選項時,sar會根據所有核給出一個宏觀彙報,也就是平均的值。

如果使用了-P選項來指定某一個核,那麼就會針對這個單獨的核給出具體性能資訊。

當使用-P ALL時,sar就會根據每一個核都給出其具體性能資訊,然後再給出一個總的性能資訊。

比如,我這裡有一個至強處理器的CPU,是八核CPU,看看-P的使用方法吧:

$ sar -P ALL 1 1
Linux 2.6.9    10/16/2009

10:59:38 PM       CPU     %user     %nice   %system   %iowait     %idle
10:59:39 PM       all      2.12      0.00      2.87      0.00     95.01
10:59:39 PM         0      0.00      0.00      1.98      0.00     98.02
10:59:39 PM         1      9.00      0.00      7.00      0.00     84.00
10:59:39 PM         2      0.00      0.00      1.98      0.00     98.02
10:59:39 PM         3      7.00      0.00      1.00      0.00     92.00
10:59:39 PM         4      0.00      0.00      3.03      0.00     96.97
10:59:39 PM         5      0.00      0.00      1.00      0.00     99.00
10:59:39 PM         6      0.00      0.00      3.96      0.00     96.04
10:59:39 PM         7      0.99      0.00      1.98      0.00     97.03

Average:          CPU     %user     %nice   %system   %iowait     %idle
Average:          all      2.12      0.00      2.87      0.00     95.01
Average:            0      0.00      0.00      1.98      0.00     98.02
Average:            1      9.00      0.00      7.00      0.00     84.00
Average:            2      0.00      0.00      1.98      0.00     98.02
Average:            3      7.00      0.00      1.00      0.00     92.00
Average:            4      0.00      0.00      3.03      0.00     96.97
Average:            5      0.00      0.00      1.00      0.00     99.00
Average:            6      0.00      0.00      3.96      0.00     96.04
Average:            7      0.99      0.00      1.98      0.00     97.03      

看,sar會根據處理器的每一個核給出性能資訊。當我們想檢視第6個核的資訊時,其輸出如下:

$ sar -P 5 1 1
Linux 2.6.9      10/16/2009

11:01:16 PM       CPU     %user     %nice   %system   %iowait     %idle
11:01:17 PM         5      0.00      0.00      2.00      0.00     98.00

Average:          CPU     %user     %nice   %system   %iowait     %idle
Average:            5      0.00      0.00      2.00      0.00     98.00      

6 好像sar隻會輸出CPU資訊,如何檢視記憶體資訊、網絡資訊或者IO資訊呢?

是這樣的,sar指令在預設情況下是輸出CPU資訊的,隻有當使用者專門使用選項來設定要檢視網絡資訊時,sar才會輸出網絡的目前資訊,記憶體資訊和IO資訊也是同樣道理。

常用的選項包括:

-b:報告I/O使用情況以及傳輸速率。(隻适用于2.5及之前的核心,是以新核心有可能不支援這個選項)

-B:報告“頁”使用情況

-c:報告程序建立情況

-d:報告每一個塊裝置的使用情況
(當你使用時,你會發現在DEV列有類似dev1-7格式的字元串,
其中1代表裝置的主序号,n代表裝置的從序号,
而且rd_sec/s列和wr_sec/s列的機關都是512bytes,也就是512B,也就是0.5KB)

-I:彙報中斷情況

-n:彙報網絡情況

-P:設定CPU

-q:彙報隊列長度和負載資訊

-r:彙報記憶體和交換區使用情況

-R:彙報記憶體情況

-u:彙報CPU使用情況

-v:彙報i節點、檔案和其他核心表資訊

-w:彙報系統上下文切換情況

-x:可以針對某個特定PID給出統計資訊,
可以直接指定程序ID号;
也可以指定為SELF,這樣就是檢測sar程序本身;
如果設定為ALL,則表示彙報所有系統程序資訊。

-X:彙報特定PID的子程序的資訊

-y:設定TTY裝置的資訊。      

7 這麼一堆指代某項性能的選項,我懶得使用,我想一下輸出最全最全的資訊!

sar提供了一個無敵選項,即-A,它代表all,而且還是大寫的,可見其威力無敵:D

這個-A就相當于-bBcdqrRuvwWy -I SUM -n FULL -P ALL這麼一堆選項了,擦亮眼睛看看每一個選項,熟不熟~~

不過,話說回來,-A輕易不要用,否則一大坨資訊輸出到螢幕上,刷屏就要刷N年,你不暈菜才怪。

8 我想利用sar來做個背景監控程式,可以實時彙報機器性能情況。sar能放背景運作麼?

當然可以,隻要借助linux的背景符就可以了,别忘了把标準輸出重定向哦,方法是這樣的:

sar -o monitor.res interval count >/dev/null 2>&1 &      

記得把interval和count都替換為你想要的間隔和次數。這樣所有的性能資訊就全都存入二進制格式的資料檔案monitor.res裡了。當讀取時使用-f就可以了。

9 我不想使用“間隔和次數”的方法來指定彙報時間,我想讓sar在某個特定時間結束,有方法沒?

可以實作,使用-e hh:mm:ss選項就可以了,設定好你的結束時間,sar就會乖乖的在這個時間結束喽。

預設的結束時間是18:00:00,也就是說如果你使用-e但沒有指定具體時間,sar就會用在晚上6點結束。

需要注意的一點是,-e選項隻能用在讀取(-f)或寫入(-o)資訊檔案時才可用哦。

10 我覺得-o存儲的檔案的内容不利于我提取有效資訊,怎麼辦呢?

sar想到了這一點,它提供了一個-h選項,就是用于當你使用-f選項讀取檔案時,以一種特殊格式輸出,這種格式很利于awk等文本處理工具來提取相應資訊,你可以試試看:)

11 選項很多,字段很多,背景知識也很多,搞得我快昏了,能不能給一些簡潔明了的例子呢?

這麼多資訊想立刻掌握,并非易事,結合例子,或許效果更好些,例子如下:

sar -u 2 5 :每個兩秒報告一次CPU使用情況,共報告5次

sar -I 14 -o sys_info 2 10 :彙報IRQ14的資訊,每兩秒一次,共10次,所有輸出資訊存入sys_info中去。

sar -r -n DEV -f sys_net :顯示記憶體使用情況、交換區使用情況以及網絡情況,所有輸出資訊存入sys_net檔案中。

12 我對網絡監控這塊比較感興趣,能詳細說說麼?

sar指令使用-n選項可以彙報網絡相關資訊,可用的參數包括:DEV、EDEV、SOCK和FULL。

如果你使用DEV關鍵字,那麼sar将彙報和網絡裝置相關的資訊,如lo,eth0或eth1等,例如:

$ sar -n DEV 1 2
Linux 2.6.9      10/17/2009

12:10:49 AM     IFACE   rxpck/s   txpck/s   rxbyt/s   txbyt/s   rxcmp/s   txcmp/s  rxmcst/s
12:10:50 AM      eth0     63.64      0.00   4072.73      0.00      0.00      0.00      0.00
12:10:50 AM      eth1     30.30     13.13   2907.07   1234.34      0.00      0.00      0.00
12:10:50 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      

IFACE:就是網絡裝置的名稱;

rxpck/s:每秒鐘接收到的包數目

txpck/s:每秒鐘發送出去的包數目

rxbyt/s:每秒鐘接收到的位元組數

txbyt/s:每秒鐘發送出去的位元組數

rxcmp/s:每秒鐘接收到的壓縮包數目

txcmp/s:每秒鐘發送出去的壓縮包數目

txmcst/s:每秒鐘接收到的多點傳播包的包數目

如果你使用EDEV關鍵字,那麼會針對網絡裝置彙報其失敗情況,例如:

$ sar -n EDEV 1 3
Linux 2.6.9     10/17/2009

12:15:06 AM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
12:15:07 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:15:07 AM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
12:15:07 AM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      

rxerr/s:每秒鐘接收到的損壞的包的數目

txerr/s:當發送包時,每秒鐘發生的錯誤數

coll/s:當發送包時,每秒鐘發生的沖撞(collisions)數(這個是在半雙工模式下才有)

rxdrop/s:由于緩沖區滿,網絡裝置接收端,每秒鐘丢掉的網絡包的數目

txdrop/s:由于緩沖區滿,網絡裝置發送端,每秒鐘丢掉的網絡包的數目

txcarr/s:當發送資料包時,每秒鐘載波錯誤發生的次數

rxfram/s:在接收資料包時,每秒鐘發生的幀對齊錯誤的次數

rxfifo/s:在接收資料包時,每秒鐘緩沖區溢出錯誤發生的次數

txfifo/s:在發送資料包時,每秒鐘緩沖區溢出錯誤發生的次數

如果你使用SOCK關鍵字,則會針對socket連接配接進行彙報,例如:

$ sar -n SOCK 1 3
Linux 2.6.9       10/17/2009

12:27:29 AM    totsck    tcpsck    udpsck    rawsck   ip-frag
12:27:30 AM        90        41         4         0         0
12:27:31 AM        90        41         4         0         0
12:27:32 AM        90        41         4         0         0
Average:           90        41         4         0         0      

totsck:被使用的socket的總數目

tcpsck:目前正在被使用于TCP的socket數目

udpsck:目前正在被使用于UDP的socket數目

rawsck:目前正在被使用于RAW的socket數目

ip-frag:目前的IP分片的數目

如果你使用FULL關鍵字,相當于上述DEV、EDEV和SOCK三者的綜合。

正文就到這裡了,内容不少了,夠大家咀嚼一陣的了:)

繼續閱讀