1. 程式人生 > >linuxr下sar調優工具的深入分析

linuxr下sar調優工具的深入分析

一)關於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.