[正文開始]
好久沒有寫内容翔實的文章了,最近我和Lee.MaRs都比較忙,公司的項目都很緊啊:)
首先先恭喜一下linux大棚,訂閱人數已經達到了988人。我很期待1000時代的到來!

===
言歸正傳,今天為大家介紹一個好朋友,名字叫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三者的綜合。
正文就到這裡了,内容不少了,夠大家咀嚼一陣的了:)