linuxr下sar調優工具的深入分析
阿新 • • 發佈:2019-02-13
一)關於CPU資源的監控
sar 1(將所有CPU合併到一起進行監控)
sar -P ALL 1 100(可以顯示每個CPU現在的負載)
如下:
sar -p 1
Linux 2.6.32-16-generic (ubuntu) 03/23/2011
_x86_64_
(1 CPU)
10:34:49 AM CPU %user %nice %system %iowait %steal %idle
10:34:50 AM all 0.00 0.00 0.00 0.00 0.00 100.00
10:34:51 AM all 0.67 0.00 1.33 0.00 0.33 97.67
10:34:52 AM all 0.00 0.00 0.66 5.96 0.00 93.38
10:34:53 AM all 2.00 0.00 1.33 0.00 0.33 96.33
10:34:54 AM all 0.00 0.00 0.00 0.00 0.00 100.00
10:34:55 AM all 0.67 0.00 0.67 0.00 0.00 98.67
10:34:56 AM all 0.33 0.00 0.00 0.00 0.00 99.67
10:34:57 AM all 0.00 0.00 0.00 0.00 0.00 100.00
10:34:58 AM all 0.00 0.00 0.33 0.00 0.33 99.34
10:34:59 AM all 0.00 0.00 0.00 0.00 0.00 100.00
10:35:00 AM all 3.67 0.00 9.67 0.00 0.00 86.67
10:35:01 AM all 11.67 0.00 28.67 0.00 0.33 59.33
10:35:02 AM all 11.96 0.00 28.24 0.00 0.66 59.14
10:35:03 AM all 16.67 0.00 30.00 0.00 4.67 48.67
10:35:04 AM all 23.84 0.00 34.44 11.26 11.92 18.54
10:35:05 AM all 16.56 0.00 34.11 1.99 2.98 44.37
10:35:06 AM all 8.33 0.00 18.67 0.67 0.67 71.67
10:35:07 AM all 0.00 0.00 0.33 0.00 0.00 99.67
sar -P ALL 1 100
Linux 2.6.18-6-amd64 (192.168.6.184) 03/23/2011
_x86_64_
12:52:20 PM CPU %user %nice %system %iowait %steal %idle
12:52:21 PM all 0.00 0.00 0.25 0.00 0.00 99.75
12:52:21 PM 0 0.00 0.00 0.99 0.00 0.00 99.01
12:52:21 PM 1 0.00 0.00 0.00 0.00 0.00 100.00
12:52:21 PM 2 0.00 0.00 0.00 0.00 0.00 100.00
12:52:21 PM 3 0.00 0.00 0.00 0.00 0.00 100.00
12:52:21 PM CPU %user %nice %system %iowait %steal %idle
12:52:22 PM all 0.00 0.00 0.00 0.00 0.00 100.00
12:52:22 PM 0 0.00 0.00 0.00 0.00 0.00 100.00
12:52:22 PM 1 0.00 0.00 0.00 0.00 0.00 100.00
12:52:22 PM 2 0.00 0.00 0.00 0.00 0.00 100.00
12:52:22 PM 3 0.00 0.00 0.00 0.00 0.00 100.00
注:
%user,%system,%iowait,%idle分別表示使用者態程序佔用CPU百分比,系統態程序佔用CPU百分比,CPU等待IO百分比,CPU空閒百分比
重點說%nice和%steal,這是vmstat所沒有了.
%nice:如果一個程式在執行時用nice調整它的優先順序,且優先順序在1-19之間,並且是使用者態的程序,這時%nice才會體現出來,如下:
例如用下面的程式:
# include <stdio.h>
# include <math.h>
int main (void)
{
double pi=M_PI;
double pisqrt;
long i;
for (i=0;i<10000000000;++i){
pisqrt=sqrt(pi);
}
return 0;
}
gcc sqrt.c -o sqrt -lm
nice 10 ./sqrt
在另一個終端觀察,此時我們看到%user沒有變化,而%nice的CPU利用率達到了100%左右,如下:
12:52:20 PM CPU %user %nice %system %iowait %steal %idle
01:14:54 PM all 1.00 4.00 0.00 0.00 0.00 95.00
01:14:55 PM all 0.00 100.00 0.00 0.00 0.00 0.00
01:14:56 PM all 0.00 99.00 1.00 0.00 0.00 0.00
01:14:57 PM all 0.00 97.03 2.97 0.00 0.00 0.00
01:14:58 PM all 0.00 100.00 0.00 0.00 0.00 0.00
01:14:59 PM all 0.00 100.00 0.00 0.00 0.00 0.00
01:15:00 PM all 0.00 98.99 1.01 0.00 0.00 0.00
01:15:01 PM all 1.96 93.14 4.90 0.00 0.00 0.00
01:15:02 PM all 0.00 82.00 0.00 0.00 0.00 18.00
01:15:03 PM all 0.00 0.00 0.99 0.00 0.00 99.01
01:15:04 PM all 0.00 0.00 1.00 0.00 0.00 99.00
%steal:一般在執行虛擬機器的宿主機還用到,比如xen,QEMU,Bochs等等.
如下:
12:52:20 PM CPU %user %nice %system %iowait %steal %idle
01:42:03 PM all 4.67 0.00 10.00 0.00 0.67 84.67
01:42:04 PM all 5.32 0.00 14.95 0.00 6.64 73.09
01:42:05 PM all 9.93 0.00 25.17 0.66 11.26 52.98
01:42:06 PM all 1.00 0.00 2.34 0.00 0.33 96.32
01:42:07 PM all 0.66 0.00 1.32 0.00 0.33 97.68
01:42:08 PM all 0.00 0.00 0.67 0.00 0.00 99.33
01:42:09 PM all 0.33 0.00 0.00 1.33 0.00 98.34
二)關於記憶體資源的監控
sar -r 1
Linux 2.6.32-16-generic (ubuntu) 03/23/2011
_x86_64_
(1 CPU)
01:46:21 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
01:46:22 PM 76084 429612 84.95 7160 32024 554500 38.96
01:46:23 PM 76068 429628 84.96 7160 32024 554500 38.96
01:46:24 PM 76068 429628 84.96 7160 32024 554500 38.96
01:46:25 PM 76068 429628 84.96 7160 32024 554500 38.96
01:46:26 PM 76068 429628 84.96 7160 32024 554500 38.96
01:46:27 PM 76068 429628 84.96 7160 32024 554500 38.96
01:46:28 PM 76068 429628 84.96 7160 32024 554500 38.96
注:
kbmemfree:這個值和free命令中的free值基本一致,所以它不包括buffer和cache的空間.
kbmemused:這個值和free命令中的used值基本一致,所以它包括buffer和cache的空間.
%memused:這個值是kbmemused和記憶體總量(不包括swap)的一個百分比.
kbbuffers和kbcached:這兩個值就是free命令中的buffer和cache.
kbcommit:保證當前系統所需要的記憶體,即為了確保不溢位而需要的記憶體(RAM+swap).
%commit:這個值是kbcommit與記憶體總量(包括swap)的一個百分比.
下面我們重點來研究一下kbcommit.
首先編譯執行下面的程式:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int
main (int argc, char *argv[])
{
if (argc != 2)
exit (0);
size_t mb = strtoul(argv[1],NULL,0);
size_t nbytes = mb * 0x100000;
char *ptr = (char *) malloc(nbytes);
if (ptr == NULL){
perror("malloc");
exit (EXIT_FAILURE);
}
size_t i;
const size_t stride = sysconf(_SC_PAGE_SIZE);
for (i = 0;i < nbytes; i+= stride) {
ptr[i] = 0;
}
printf("allocated %d mb\n", mb);
pause();
return 0;
}
gcc hog.c -o hog
./hog 100
allocated 100 mb
同樣在另一個終端檢視當前記憶體的變化,如下:
sar -r 1
Linux 2.6.32-16-generic (ubuntu) 03/23/2011
_x86_64_
(1 CPU)
10:48:28 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
10:48:29 AM 109928 395768 78.26 64592 198608 247156 17.37
10:48:30 AM 109928 395768 78.26 64592 198608 247156 17.37
10:48:31 AM 109920 395776 78.26 64592 198608 247156 17.37
10:48:32 AM 88212 417484 82.56 64592 198608 349664 24.57
10:48:33 AM 7192 498504 98.58 64592 198608 349664 24.57
10:48:34 AM 7192 498504 98.58 64592 198608 349664 24.57
10:48:35 AM 109404 396292 78.37 64592 198608 247172 17.37
10:48:36 AM 109424 396272 78.36 64592 198608 247172 17.37
10:48:37 AM 109424 396272 78.36 64592 198608 247172 17.37
10:48:38 AM 109424 396272 78.36 64592 198608 247172 17.37
注:我們看到kbcommit由247156kb變成了349664kb,在程式中停止後,kbcommit又恢復到了247156kb.
說明在分配了100MB的記憶體後,系統對當前需要的記憶體也隨之提高.
三)關於記憶體分頁的監控
sar -B 1
03:12:27 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
03:12:28 PM 0.00 0.00 63.64 0.00 64.65 0.00 0.00 0.00 0.00
03:12:29 PM 0.00 0.00 35.64 0.00 62.38 0.00 0.00 0.00 0.00
03:12:30 PM 0.00 0.00 30.00 0.00 62.00 0.00 0.00 0.00 0.00
03:12:31 PM 0.00 0.00 30.00 0.00 65.00 0.00 0.00 0.00 0.00
03:12:32 PM 0.00 0.00 30.00 0.00 62.00 0.00 0.00 0.00 0.00
03:12:33 PM 0.00 0.00 30.00 0.00 64.00 0.00 0.00 0.00 0.00
注:
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)的百分比
我們檢視一下當前記憶體:
free
total used free shared buffers cached
Mem: 505696 117228 388468 0 488 11232
-/+ buffers/cache: 105508 400188
Swap: 917496 0 917496
執行hog程式:
./hog 100
這裡故意以小於空閒記憶體進行分配,這裡我們分配了100MB.
同時執行sar -B 1,如下:
sar -B 1
Linux 2.6.32-16-generic (ubuntu) 03/23/2011
_x86_64_
(1 CPU)
03:29:52 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
03:29:53 PM 0.00 0.00 32.67 0.00 62.38 0.00 0.00 0.00 0.00
03:29:54 PM 8.00 0.00 11044.00 1.00 114.00 0.00 0.00 0.00 0.00
03:29:55 PM 0.00 0.00 14835.00 0.00 63.00 0.00 0.00 0.00 0.00
03:29:56 PM 0.00 0.00 30.00 0.00 64.00 0.00 0.00 0.00 0.00
03:29:57 PM 0.00 0.00 30.00 0.00 63.00 0.00 0.00 0.00 0.00
03:29:58 PM 0.00 0.00 29.70 0.00 63.37 0.00 0.00 0.00 0.00
03:29:59 PM 0.00 0.00 64.00 0.00 25749.00 0.00 0.00 0.00 0.00
注:這裡我們看到fault/s由32.67/s漲到14835.00/s,說明產生了大量的缺頁,而主缺頁(majflt/s)為0,說明沒有從磁碟(swap)讀資料到記憶體,
pgpgin/s和pgpgout/s都是0,說明沒有產生到swap空間的輸入/輸出,說明我們在這裡並沒有用到swap分割槽.
最後pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff的輸出都是0,說明實體記憶體夠用,而系統沒有必要對cache進行清理,以釋放空間和對swap掃描以置換空間.
我們下面再看一個例子,根據上面的情況我們知道還剩下400M左右的實體記憶體,我們這裡一次性佔用掉400M記憶體,然後再申請50MB的記憶體,如下:
./hog 400&
[1] 5234
allocated 400 mb
./hog 50&
allocated 50 mb
同時執行sar -B 1(我們忽略掉每一次申請400MB記憶體時的監控輸出),如下:
sar -B 1
03:42:40 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
03:43:09 PM 0.00 27.72 2615.84 0.00 2273.27 475.25 1964.36 2161.39 88.60
03:43:10 PM 0.00 232.00 4836.00 0.00 4999.00 1312.00 4864.00 4875.00 78.93
03:43:11 PM 0.00 12316.83 3586.14 0.00 6685.15 3516.83 3485.15 3555.45 50.78
03:43:12 PM 0.00 7352.00 2040.00 0.00 4303.00 2336.00 1728.00 2222.00 54.68
03:43:13 PM 128.00 0.00 54.00 4.00 62.00 0.00 0.00 0.00 0.00
03:43:14 PM 0.00 0.00 29.70 0.00 64.36 0.00 0.00 0.00 0.00
03:43:15 PM 0.00 0.00 30.00 0.00 63.00 0.00 0.00 0.00 0.00
03:43:16 PM 456.00 0.00 37.00 6.00 65.00 0.00 0.00 0.00 0.00
03:43:17 PM 432.00 0.00 94.00 7.00 12926.00 0.00 0.00 0.00 0.00
注:我們以第三條輸出為例,在這個例子中pgpgout/s迅速漲到12316/s,說明產生了大量的swap寫入操作.
而為了分配更多的實體記憶體給當前的請求,pgsteal/s也漲到了3555/s,說明系統的空閒記憶體已經無法滿足程式hog對50MB記憶體的請求,
所以這裡開始回收cache所佔用的記憶體空間給當前程式,而同時系統為了給hog提供記憶體空間,它對swap和實體記憶體進行掃描,以獲得更多的記憶體,
所以這裡pgscank/s漲到3516/s,pgscand/s漲到3485/s,回收cache和系統需求的比率為50%,說明實體記憶體已經不能滿足需要,這裡就要動用swap,來分配記憶體了.
pgfree/s代表已經釋放到空閒佇列的記憶體總量.
如果我們在這裡申請200MB呢,如下:
./hog 200&
同時執行sar -B 1,如下:
sar -B 1
Linux 2.6.32-16-generic (ubuntu) 03/23/2011
_x86_64_
(1 CPU)
10:54:34 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
10:54:35 AM 0.00 444.00 5948.00 0.00 6179.00 1152.00 4224.00 5153.00 95.85
10:54:36 AM 0.00 552.00 7020.00 0.00 7164.00 992.00 4576.00 5411.00 97.18
10:54:37 AM 0.00 12640.82 6293.88 0.00 9745.92 4146.94 5518.37 5390.82 55.77
10:54:38 AM 0.00 18019.80 5787.13 0.00 10540.59 4499.01 5924.75 5198.02 49.87
10:54:39 AM 54.90 17003.92 1207.63 0.44 2696.95 1394.99 43894.77 1295.86 2.86
注:這裡出現了非常極端的情況,在第5條輸出的時候,pgfree/s已經明顯小於pgscank/s和pgscand/s,而%vmeff的比例也從49.87%到了2.86%,
說明系統無法迅速釋放記憶體來滿足要求,從而進入無盡的SWAP置換.
四)關於I節點,檔案和其它核心表的監控
sar -v 1
Linux 2.6.32-16-generic (ubuntu) 03/24/2011 _x86_64_ (1 CPU)
01:16:52 AM dentunusd file-nr inode-nr pty-nr
01:16:53 AM 4357 2464 5975 10
01:16:54 AM 4357 2464 5975 10
01:16:55 AM 4357 2464 5975 10
01:16:56 AM 4357 2464 5975 10
01:16:57 AM 4357 2464 5975 10
dentunusd:在緩衝目錄條目中沒有使用的條目數量.
file-nr:被系統使用的檔案控制代碼數量.
inode-nr:使用的索引節點數量.
pty-nr:使用的pty數量.
1)dentunusd
dentunusd資料的資料來源是/proc/sys/fs/dentry-state的第二項資料.
要弄明白它的意義,我們首先要弄明白dcache(目錄快取記憶體),因為系統中所有的inode都是通過檔名來訪問的,而為了解決檔名到inode轉換的時間,就引入了dcache.
它是VFS層為當前活動和最近使用的名字維護的一個cache.
dcache中所有處於unused狀態和negative(消極)狀態的dentry物件都通鏈入到dentry_unused連結串列中,這種dentry物件在回收記憶體時可能會被釋放.
如果我們在系統中執行ls -ltR /etc/會看到dentunusd的數量會多起來.
而通過mount -o remount /dev/sda1會看到dentunusd會迅速會回收.
2)file-nr
file-nr的的資料來源是/proc/sys/fs/file-nr檔案的第一項資料.
實際上file-nr不是一個準確的值,file-nr每次增加的步長是64(64位系統),例如現在file-nr為2528,實際上可能只打開了2527個檔案,而此時你開啟兩個檔案後,它就會變成2592,而不是2530.
3)inode-nr
inode-nr的資料來源是/proc/sys/fs/inode-nr檔案的第一項資料減去第二項資料的值.
inode-nr檔案的第一項資料是已經分配過的INODE節點.第二項資料是空閒的INODE節點.
例如,inode-nr檔案裡的值為:13720 7987
我們新建一個檔案file1,此時inode-nr第一項資料會加1,就是13721,表示系統裡建立了這麼多的inode.
我們再刪除掉file1,此時就會變成13720.
空閒的INODE節點表示我們已經裡這麼多的INODE節點曾經有過被利用,但沒有被釋放.
所以INODE節點總數減去空閒的INODE,就是正在被用的INODE.
最後通過使用mount -o remount /dev/sda1命令,空閒節點會被重新整理,所以inode-nr的值會有所變化.
4)pty-nr
pty-nr的資料來源是/proc/sys/kernel/pty/nr
表示登陸過的終端總數,如果我們登入過10回,退出了3回,最後的結果還是10回.
五)關於中斷的監控
sar -I ALL 1
Linux 2.6.32-16-generic (ubuntu) 03/24/2011 _x86_64_ (1 CPU)
01:14:27 AM INTR intr/s
01:14:28 AM 0 82.18
01:14:28 AM 1 0.00
01:14:28 AM 2 0.00
01:14:28 AM 3 0.00
01:14:28 AM 4 0.00
01:14:28 AM 5 0.00
01:14:28 AM 6 0.00
01:14:28 AM 7 0.00
01:14:28 AM 8 0.00
01:14:28 AM 9 0.00
01:14:28 AM 10 2.97
01:14:28 AM 11 0.00
01:14:28 AM 12 0.00
01:14:28 AM 13 0.00
01:14:28 AM 14 0.00
01:14:28 AM 15 22.77
01:14:28 AM INTR intr/s
01:14:29 AM 0 81.00
01:14:29 AM 1 0.00
01:14:29 AM 2 0.00
01:14:29 AM 3 0.00
01:14:29 AM 4 0.00
01:14:29 AM 5 0.00
01:14:29 AM 6 0.00
01:14:29 AM 7 0.00
01:14:29 AM 8 0.00
01:14:29 AM 9 0.00
01:14:29 AM 10 4.00
01:14:29 AM 11 0.00
01:14:29 AM 12 0.00
01:14:29 AM 13 0.00
01:14:29 AM 14 0.00
01:14:29 AM 15 0.00
注:INTR表示中斷號,中斷號代表的意義可以到/proc/interrupts查詢.
intr/s表示每秒的中斷次數.
六)關於平均負載和佇列的監控
sar -q 1
Linux 2.6.32-16-generic (ubuntu) 03/24/2011 _x86_64_ (1 CPU)
01:25:39 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
01:25:40 AM 0 203 0.00 0.00 0.00
01:25:41 AM 0 203 0.00 0.00 0.00
01:25:42 AM 0 203 0.00 0.00 0.00
01:25:43 AM 0 203 0.00 0.00 0.00
注:
runq-sz:處於執行或就緒的程序數量
plist-sz:現在程序的總數(包括執行緒).
ldavg-1:最近一分鐘的負載.
ldavg-5:最近五分鐘的負載.
ldavg-15:最近十分鐘的負載.
平均負載和佇列的資料來源於/proc/loadavg
七)關於網路裝置的監控
sar -n DEV 1 1000
Linux 2.6.32-16-generic (ubuntu) 03/24/2011
_x86_64_
(1 CPU)
12:25:55 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
12:25:56 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
12:25:56 PM eth0 5.05 1.01 0.73 0.18 0.00 0.00 0.00
12:25:56 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
12:25:57 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
12:25:57 PM eth0 1.00 1.00 0.06 0.38 0.00 0.00 0.00
rxpck/s:每秒鐘收到資料包的數量.
txpck/s:每秒鐘傳送資料包的數量.
rxkB/s:每秒鐘接收的位元組(KB).
txkB/s:每秒鐘傳送的位元組(KB).
rxcmp/s:每秒收到的壓縮包的數量
txcmp/s:每秒發出的壓縮包的數量
rxmcst/s:每秒收到的廣播包的數量
網路裝置的資料來源於/proc/net/dev.
我這裡嘗試用ssh的壓縮功能進行傳輸,結果也沒看到壓縮包的數量有變化.
嘗試傳送或接收廣播包/組播包時rxmcst/s也不會有變化.
八)關於NFS的監控
1)關於NFS客戶端的監控
在NFS客戶端用下面的命令監控:
sar -n NFS 1
02:57:45 AM call/s retrans/s read/s write/s access/s getatt/s
02:57:46 AM 0.00 0.00 0.00 0.00 0.00 0.00
02:57:47 AM 0.00 0.00 0.00 0.00 0.00 0.00
02:57:48 AM 0.00 0.00 0.00 0.00 0.00 0.00
02:57:49 AM 0.00 0.00 0.00 0.00 0.00 0.00
call/s:每秒成功的RPC呼叫都會使call/s的值增長,比如對NFS的一次讀/寫.
retrans/s:每秒重傳的RPC次數,比如因為伺服器的問題,產生timeout,這時客戶端需要重新傳輸.
read/s:每秒從NFS服務端讀取的次數.
write/s:每秒寫入到NFS服務端的次數.
access/s:每秒訪問NFS的次數,比如從NFS服務端COPY檔案.
getatt/s:每秒獲取NFS服務端檔案屬性的次數,比如ls -l /NFSSERVER/,如果NFSSERVER有300個檔案,將產生300次這樣的請求.
我們對以上幾次監控資料進行演示:
用dd命令寫300M的資料到NFS服務端:
dd if=/dev/zero of=/mnt/test bs=1M count=300
300+0 records in
300+0 records out
314572800 bytes (315 MB) copied, 29.3891 s, 10.7 MB/s
在另一個終端檢視NFS的監控輸出:
sar -n NFS 1
03:10:06 AM call/s retrans/s read/s write/s access/s getatt/s
03:10:21 AM 196.00 0.00 0.00 192.00 1.00 1.00
03:10:22 AM 773.00 0.00 0.00 768.00 0.00 0.00
03:10:23 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:10:24 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:10:25 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:10:26 AM 705.00 0.00 0.00 704.00 0.00 0.00
03:10:27 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:10:28 AM 195.00 0.00 0.00 192.00 0.00 0.00
03:10:29 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:10:30 AM 516.00 0.00 0.00 512.00 0.00 0.00
03:10:31 AM 129.00 0.00 0.00 128.00 0.00 0.00
03:10:32 AM 65.00 0.00 0.00 64.00 0.00 0.00
03:10:33 AM 259.00 0.00 0.00 256.00 0.00 0.00
03:10:34 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:10:35 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:10:36 AM 1142.00 0.00 0.00 1140.00 0.00 0.00
03:10:37 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:10:38 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:10:39 AM 873.00 0.00 0.00 845.00 0.00 0.00
我們看到call/s基本上是其它資料之和,因為我們是向NFS服務端寫資料,所以write/s會有變化,而access/s只是第一次開啟檔案時用到,getatt/s同樣是這樣.
用dd命令從NFS服務端讀300M的資料到本地:
dd if=/mnt/test of=/tmp/test bs=1M count=300
在另一個終端檢視NFS的監控輸出:
sar -n NFS 1
03:33:43 AM 212.00 0.00 210.00 0.00 1.00 1.00
03:33:44 AM 300.00 0.00 300.00 0.00 0.00 0.00
03:33:45 AM 285.00 0.00 285.00 0.00 0.00 0.00
03:33:46 AM 285.00 0.00 285.00 0.00 0.00 0.00
03:33:47 AM 281.00 0.00 281.00 0.00 0.00 0.00
03:33:48 AM 270.00 0.00 270.00 0.00 0.00 0.00
03:33:49 AM 285.00 0.00 285.00 0.00 0.00 0.00
03:33:50 AM 315.00 0.00 315.00 0.00 0.00 0.00
03:33:51 AM 249.00 0.00 249.00 0.00 0.00 0.00
03:33:52 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:33:53 AM 0.00 0.00 0.00 0.00 0.00 0.00
注:我們看到寫NFS的實驗中,資料是不連續的,而讀NFS的實驗中資料是連線的,原因是寫的時候我們直接從/dev/zero讀取再寫入,而由於網路的瓶頸,所以是不連續的,
而讀NFS的實驗我們是從物理檔案中讀取,由於它不像/dev/zero讀取那樣快,所以輸出是連續的.
下面我們看一下access/s和getatt/s
mount -t 10.1.6.81:/etc /mnt/
ls -ltR /mnt/
在另一個終端檢視NFS的監控輸出:
sar -n NFS 1
03:10:06 AM call/s retrans/s read/s write/s access/s getatt/s
03:26:55 AM 13.00 0.00 0.00 0.00 1.00 1.00
03:26:56 AM 221.00 0.00 0.00 0.00 9.00 9.00
03:26:57 AM 14.00 0.00 0.00 0.00 2.00 2.00
03:26:58 AM 4.00 0.00 0.00 0.00 1.00 1.00
03:26:59 AM 214.00 0.00 0.00 0.00 20.00 20.00
03:27:00 AM 180.00 0.00 0.00 0.00 34.00 34.00
03:27:01 AM 159.00 0.00 0.00 0.00 49.00 48.00
03:27:02 AM 176.00 0.00 0.00 0.00 48.00 56.00
03:27:03 AM 128.00 0.00 0.00 0.00 41.00 41.00
03:27:04 AM 469.00 0.00 0.00 0.00 48.00 48.00
03:27:05 AM 9.00 0.00 0.00 0.00 3.00 3.00
03:27:06 AM 78.00 0.00 0.00 0.00 26.00 26.00
注意我們第一次讀取的時,access/s和getatt/s基本一致,而它們的和與call/s大相徑庭,我們再做一次ls -ltR /mnt的操作,再次檢視NFS監控輸出:
03:44:51 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:44:52 AM 129.00 0.00 0.00 0.00 0.00 129.00
03:44:53 AM 442.00 0.00 0.00 0.00 0.00 442.00
03:44:54 AM 278.00 0.00 0.00 0.00 0.00 278.00
03:44:55 AM 473.00 0.00 0.00 0.00 0.00 473.00
03:44:56 AM 295.00 0.00 0.00 0.00 0.00 295.00
03:44:57 AM 827.00 0.00 0.00 0.00 0.00 827.00
03:44:58 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:44:59 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:45:00 AM 47.00 0.00 0.00 0.00 0.00 47.00
03:45:01 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:45:02 AM 0.00 0.00 0.00 0.00 0.00 0.00
03:45:03 AM 0.00 0.00 0.00 0.00 0.00 0.00
這裡access/s與getatt/s不一致,而它們的和與call/s基本相同了,原因是第一次訪問時系統對access/s做了檔案系統快取(cache),所以第二次訪問直接讀取了記憶體,而getatt(獲取屬性)卻不能這樣做.
我們清理cache,再看一下:
echo 3 > /proc/sys/vm/drop_caches
ls -ltR /mnt/
輸出如下:
03:48:22 AM 13.00 0.00 0.00 0.00 1.00 1.00
03:48:23 AM 171.29 0.00 0.00 0.00 8.91 7.92
03:48:24 AM 48.00 0.00 0.00 0.00 0.00 1.00
03:48:25 AM 91.00 0.00 0.00 0.00 23.00 23.00
03:48:26 AM 141.00 0.00 0.00 0.00 0.00 0.00
03:48:27 AM 69.00 0.00 0.00 0.00 3.00 3.00
03:48:28 AM 51.00 0.00 0.00 0.00 14.00 14.00
03:48:29 AM 142.00 0.00 0.00 0.00 43.00 43.00
03:48:30 AM 410.00 0.00 0.00 0.00 121.00 129.00
03:48:31 AM 440.00 0.00 0.00 0.00 39.00 38.00
03:48:32 AM 15.00 0.00 0.00 0.00 5.00 5.00
03:48:33 AM 72.00 0.00 0.00 0.00 24.00 24.00
03:48:34 AM 0.00 0.00 0.00 0.00 0.00 0.00
我們看到又恢復到第一次查詢時的狀態.
本項輸出的資料來源於/proc/net/rpc/nfs
2)關於NFS服務端的監控
這裡要在NFS服務端進行監控.
以下是模擬對NFS伺服器進行大量寫入操作的例子.
sar -n NFSD 1 1000
02:05:41 PM scall/s badcall/s packet/s udp/s tcp/s hit/s miss/s sread/s swrite/s saccess/s sgetatt/s
02:05:42 PM 332.65 0.00 332.65 332.65 0.00 1.02 327.55 0.00 327.55 2.04 0.00
02:05:43 PM 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:05:44 PM 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
以下是用UDP模試掛載NFS,再次模擬對NFS伺服器進行大量寫入操作的例子.
05:10:51 PM scall/s badcall/s packet/s udp/s tcp/s hit/s miss/s sread/s swrite/s saccess/s sgetatt/s
02:04:30 PM 1.01 0.00 1.01 1.01 0.00 0.00 0.00 0.00 0.00 1.01 0.00
02:04:31 PM 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
02:04:32 PM 333.00 0.00 333.00 333.00 0.00 1.00 323.00 0.00 321.00 1.00 3.00
02:04:33 PM 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
注:以上的兩個例子我們分別用TCP(預設)/UDP兩種模試進行模擬測試.
用指定TCP的方式掛載NFS:
mount -t nfs -o tcp,remount ip:/tmp /mnt/
用指定UDP的方式掛載NFS
mount -t nfs -o udp,remount ip:/tmp /mnt/
hit/s和miss/s代表每秒快取命中和快取未命中的次數,這個在寫NFS服務端會有變化.
其餘各列資料與NFS客戶端一致,在則不進行重複.
本項輸出的資料來源於/proc/net/rpc/nfsd
八)關於套接字的監控
sar -n SOCK 1 1000
02:21:28 PM totsck tcpsck udpsck rawsck ip-frag
02:21:29 PM 112 11 12 0 0
02:21:30 PM 112 11 12 0 0
02:21:31 PM 112 11 12 0 0
02:21:32 PM 112 11 12 0 0
02:21:33 PM 112 11 12 0 0
02:21:34 PM 112 11 12 0 0
02:21:35 PM 112 11 12 0 0
02:21:36 PM 112 11 12 0 0
注:
totsck:代表現在有多少個SOCKET連線,比如進行一次ssh連線,totsck將加1,同樣斷開連線相應的也會減少.
tcpsck:代表現在有多少個處在監聽狀態的TCP套接字.如下:
netstat -tlnp|grep LISTEN
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 2228/hpiod
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1937/portmap
tcp 0 0 192.168.27.130:22 0.0.0.0:* LISTEN 3001/sshd
tcp 0 0 0.0.0.0:886 0.0.0.0:* LISTEN 1976/rpc.statd
tcp 0 0 0.0.0.0:791 0.0.0.0:* LISTEN 2732/rpc.mountd
tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN 2286/xinetd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2250/cupsd
tcp 0 0 0.0.0.0:763 0.0.0.0:* LISTEN 2703/rpc.rquotad
tcp 0 0 0.0.0.0:57500 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN 2233/python
tcp 0 0 ::1:631 :::* LISTEN 2250/cupsd
在這裡最後一個SOCK套接字將不會統計在tcpsck裡,因為它的listen呼叫沒有繫結具體的IP地址.
udpsck:代表現在有多少個處在監聽狀態的UDP套接字.
rawsck:代表原始套接字,原始套接字可以接收本機網絡卡上的資料幀或者資料包,對與監聽網路的流量和分析是很有作用的.
if-frag:代表IP分片次數.
九)關於I/O及速率的監控
sar -b 1 100
07:17:58 AM tps rtps wtps bread/s bwrtn/s
07:17:59 AM 7.00 0.00 7.00 0.00 368.00
07:18:00 AM 0.00 0.00 0.00 0.00 0.00
07:18:01 AM 0.00 0.00 0.00 0.00 0.00
07:18:02 AM 0.00 0.00 0.00 0.00 0.00
07:18:03 AM 0.00 0.00 0.00 0.00 0.00
07:18:04 AM 0.00 0.00 0.00 0.00 0.00
注:
tps:每秒從物理磁碟I/O的次數.多個邏輯請求會被合併為一個I/O磁碟請求,一次傳輸的大小是不確定的.
rtps:每秒的讀請求數
wtps:每秒的寫請求數
bread/s:每秒讀磁碟的資料塊數(in blocks 1 block = 512B, 2.4以後核心)
bwrtn/s:每秒寫磁碟的資料塊數(in blocks 1 block = 512B, 2.4以後核心)
一般情況下tps=(rtps+wtps)
先收回cache.
echo 3 > /proc/sys/vm/drop_caches
dd if=/tmp/tmp of=/tmp/tmp1 bs=1M
再觀察sar的輸出:
07:25:22 AM tps rtps wtps bread/s bwrtn/s
07:25:23 AM 250.50 162.38 88.12 45100.99 24475.25
07:25:24 AM 305.00 203.00 102.00 90976.00 24640.00
07:25:25 AM 116.00 15.00 101.00 5488.00 24864.00
07:25:26 AM 0.00 0.00 0.00 0.00 0.00
07:25:27 AM 0.00 0.00 0.00 0.00 0.00
07:25:28 AM 117.17 0.00 117.17 0.00 33785.86
十)關於塊裝置活動狀況的監控
先清理cache.
echo 3 > /proc/sys/vm/drop_caches
dd if=/tmp/tmp of=/tmp/tmp1 bs=1M
觀察sar的輸出:
sar -d 1 10000 -p
07:32:59 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
07:33:00 AM sda 120.37 23014.81 5837.04 239.69 1.66 13.75 3.22 38.70
07:33:00 AM hdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:33:00 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
07:33:01 AM sda 320.00 106624.00 18720.00 391.70 2.29 7.19 2.45 78.30
07:33:01 AM hdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
07:33:01 AM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
07:33:02 AM sda 209.00 26960.00 33152.00 287.62 3.21 15.34 1.53 31.90
07:33:02 AM hdc 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
注:
用引數-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的百分比,比率越大,說明越飽和.
該資料的來源是/proc/diskstats.
十一)關於sar的一些結束語
1)sar與它的時間段
sar也可以檢視非實時的資料,它是通過cron週期的執行sysstat指令碼,將資料產生到指定的目錄下,例如:/var/log/sa/sa27
sa27就是本月27日,指定具體的時間可以通過-s(start)和-e(end)來指定.
例如:我們想檢視本月27日,從0點到23點的記憶體資源.
sar -f /var/log/sa/sa27 -s 00:00:00 -e 23:00:00 -r
03:52:14 AM LINUX RESTART
04:00:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
04:10:01 AM 237268 278332 53.98 44328 183584 1052248 0 0.00 0
04:20:01 AM 237144 278456 54.01 44476 183592 1052248 0 0.00 0
04:30:01 AM 191988 323612 62.76 45324 227616 1052248 0 0.00 0
04:40:01 AM 191864 323736 62.79 45452 227624 1052248 0 0.00 0
04:50:02 AM 191740 323860 62.81 45576 227628 1052248 0 0.00 0
05:00:01 AM 190252 325348 63.10 45932 227640 1052248 0 0.00 0
Average: 206709 308891 59.91 45181 212947 1052248 0 0.00 0
07:02:35 AM LINUX RESTART
07:10:01 AM kbmemfree kbmemused %memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
07:20:01 AM 277340 238260 46.21 54056 145252 1052248 0 0.00 0
07:30:01 AM 304944 210656 40.86 1684 171196 1052248 0 0.00 0
07:40:01 AM 310168 205432 39.84 752 167940 1052248 0 0.00 0
07:50:01 AM 307568 208032 40.35 1164 169884 1052248 0 0.00 0
08:00:01 AM 302420 213180 41.35 1916 173580 1052248 0 0.00 0
Average: 300488 215112 41.72 11914 165570 1052248 0 0.00 0
注:上面的輸出分成兩個時段,這是因為在我們只在這兩個時間開了機器,並執行/etc/cron.d/sysstat指令碼.
sysstat指令碼每十分鐘執行一次/usr/lib/sa/sa1指令碼,生成監控資料,所以我們看到上面的資料是以十分鐘為間隔的.
2)sar的版本
在RHEL5下預設的版本是sysstat 7.0,在7.0版本中,sar的命令有-x/-X對某個程序的監控.
而在新的版本中sysstat 9.x中,sar去掉了-x/-X,並對-n 下的監控項做了調整,增加了ICMP等監控項.並對-v下面的系統資源做了調整.
本篇文章,我們用的是sysstat 9.x.