Linux Shell常用技巧(八) 系統運行狀況

Linux Shell常用技巧(八) 系統運行狀況

十八.  和系統運行狀況相關的Shell命令:

    1.  Linux的實時監測命令(watch):
     watch   是一個非常實用的命令,可以幫你實時監測一個命令的運行結果,省得一遍又一遍的手動運行。該命令最爲常用的兩個選項是-d和-n,其中-n表示間隔多少秒 執行一次"command",-d表示高亮發生變化的位置。下面列舉幾個在watch中常用的實時監視命令:
    /> watch -d -n 1 'who'   #每隔一秒執行一次who命令,以監視服務器當前用戶登錄的狀況
    Every 1.0s: who       Sat Nov 12 12:37:18 2011
    
    stephen  tty1           2011-11-11 17:38 (:0)
    stephen  pts/0         2011-11-11 17:39 (:0.0)
    root       pts/1         2011-11-12 10:01 (192.168.149.1)
    root       pts/2         2011-11-12 11:41 (192.168.149.1)
    root       pts/3         2011-11-12 12:11 (192.168.149.1)
    stephen  pts/4         2011-11-12 12:22 (:0.0)
    此時通過其他Linux客戶端工具以root的身份登錄當前Linux服務器,再觀察watch命令的運行變化。
    Every 1.0s: who       Sat Nov 12 12:41:09 2011
    
    stephen  tty1          2011-11-11 17:38 (:0)
    stephen  pts/0        2011-11-11 17:39 (:0.0)
    root       pts/1        2011-11-12 10:01 (192.168.149.1)
    root       pts/2        2011-11-12 11:41 (192.168.149.1)
    root       pts/3        2011-11-12 12:40 (192.168.149.1)
    stephen  pts/4        2011-11-12 12:22 (:0.0)
    root       pts/5        2011-11-12 12:41 (192.168.149.1)
    最後一行中被高亮的用戶爲新登錄的root用戶。此時按CTRL + C可以退出正在執行的watch監控進程。
   
    #watch可以同時運行多個命令,命令間用分號分隔。
    #以下命令監控磁盤的使用狀況,以及當前目錄下文件的變化狀況,包括文件的新增、刪除和文件修改日期的更新等。
    /> watch -d -n 1 'df -h; ls -l'
    Every 1.0s: df -h; ls -l     Sat Nov 12 12:55:00 2011
    
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda1             5.8G  3.3G  2.2G  61% /
    tmpfs                 504M  420K  504M   1% /dev/shm
    total 20
    -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
    -rw-r--r--. 1 root root   183 Nov 11 08:02 users
    -rw-r--r--. 1 root root   279 Nov 11 08:45 users2
    此時通過另一個Linux控制檯窗口,在watch監視的目錄下,如/home/stephen/test,執行下面的命令
    /> touch aa         #在執行該命令之後,另一個執行watch命令的控制檯將有如下變化
    Every 1.0s: df -h; ls -l                                Sat Nov 12 12:57:08 2011
    
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/sda1             5.8G  3.3G  2.2G  61% /
    tmpfs                 504M  420K  504M   1% /dev/shm
    total 20
    -rw-r--r--. 1 root root        0 Nov 12 12:56 aa
    -rw-r--r--. 1 root root        0 Nov 12 10:02 datafile3
    -rw-r--r--. 1 root root 10530 Nov 11 23:08 test.tar.bz2
    -rw-r--r--. 1 root root     183 Nov 11 08:02 users
    -rw-r--r--. 1 root root     279 Nov 11 08:45 users2
    其中黃色高亮的部分,爲touch aa命令執行之後watch輸出的高亮變化部分。

   
    2.  查看當前系統內存使用狀況(free)
    free命令有以下幾個常用選項:

選項說明
-b以字節爲單位顯示數據。
-k以千字節(KB)爲單位顯示數據(缺省值)。
-m以兆(MB)爲單位顯示數據。
-s delay該選項將使free持續不斷的刷新,每次刷新之間的間隔爲delay指定的秒數,如果含有小數點,將精確到毫秒,如0.5爲500毫秒,1爲一秒。

    free命令輸出的表格中包含以下幾列:

列名說明
total總計物理內存的大小。
used已使用的內存數量。
free可用的內存數量。
Shared多個進程共享的內存總額。
Buffers/cached磁盤緩存的大小。


    見以下具體示例和輸出說明:
    /> free -k
                        total         used          free     shared    buffers     cached
    Mem:       1031320     671776     359544          0      88796     352564
    -/+ buffers/cache:      230416     800904
    Swap:        204792              0     204792
    對於free命令的輸出,我們只需關注紅色高亮的輸出行和綠色高亮的輸出行,見如下具體解釋:
    紅色輸出行:該行是從操作系統的角度來看待輸出數據的,used(671776)表示內核(Kernel)+Applications+buffers+cached。free(359544)表示系統還有多少內存可供使用。
    綠色輸出行:該行則是從應用程序的角度來看輸出數據的。其free = 操作系統used + buffers + cached,既:
    800904 = 359544 + 88796 + 352564
    /> free -m
                      total        used        free      shared    buffers     cached
    Mem:          1007         656        351            0         86            344
    -/+ buffers/cache:        225        782
    Swap:          199             0        199
    /> free -k -s 1.5  #以千字節(KB)爲單位顯示數據,同時每隔1.5刷新輸出一次,直到按CTRL+C退出
                      total        used       free     shared    buffers     cached
    Mem:          1007         655        351          0           86        344
    -/+ buffers/cache:        224        782
    Swap:          199             0        199

                      total        used       free     shared    buffers     cached
    Mem:          1007         655        351          0           86        344
    -/+ buffers/cache:        224        782
    Swap:          199             0        199

    3.  CPU的實時監控工具(mpstat)
    該命令主要用於報告當前系統中所有CPU的實時運行狀況。
    #該命令將每隔2秒輸出一次CPU的當前運行狀況信息,一共輸出5次,如果沒有第二個數字參數,mpstat將每隔兩秒執行一次,直到按CTRL+C退出。
    /> mpstat 2 5  
    Linux 2.6.32-71.el6.i686 (Stephen-PC)   11/12/2011      _i686_  (1 CPU)

    04:03:00 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    04:03:02 PM  all    0.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00   99.50
    04:03:04 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
    04:03:06 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
    04:03:08 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
    04:03:10 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
    Average:       all    0.00    0.00    0.10    0.00    0.00    0.00    0.00    0.00   99.90

    第一行的末尾給出了當前系統中CPU的數量。後面的表格中則輸出了系統當前CPU的使用狀況,以下爲每列的含義:

列名說明
%user在internal時間段裏,用戶態的CPU時間(%),不包含nice值爲負進程  (usr/total)*100
%nice在internal時間段裏,nice值爲負進程的CPU時間(%)   (nice/total)*100
%sys在internal時間段裏,內核時間(%)       (system/total)*100
%iowait在internal時間段裏,硬盤IO等待時間(%) (iowait/total)*100
%irq在internal時間段裏,硬中斷時間(%)     (irq/total)*100
%soft在internal時間段裏,軟中斷時間(%)     (softirq/total)*100
%idle在internal時間段裏,CPU除去等待磁盤IO操作外的因爲任何原因而空閒的時間閒置時間(%) (idle/total)*100

    計算公式:
    total_cur=user+system+nice+idle+iowait+irq+softirq
    total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
    user=user_cur – user_pre
    total=total_cur-total_pre
    其中_cur 表示當前值,_pre表示interval時間前的值。上表中的所有值可取到兩位小數點。    

    /> mpstat -P ALL 2 3  #-P ALL表示打印所有CPU的數據,這裏也可以打印指定編號的CPU數據,如-P 0(CPU的編號是0開始的)
    Linux 2.6.32-71.el6.i686 (Stephen-PC)   11/12/2011      _i686_  (1 CPU)

    04:12:54 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    04:12:56 PM    all      0.00      0.00     0.50    0.00      0.00    0.00    0.00      0.00     99.50
    04:12:56 PM      0     0.00      0.00     0.50    0.00      0.00    0.00    0.00      0.00     99.50

    04:12:56 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    04:12:58 PM    all     0.00      0.00     0.00    0.00      0.00    0.00    0.00      0.00    100.00
    04:12:58 PM     0     0.00      0.00     0.00    0.00      0.00    0.00    0.00      0.00    100.00

    04:12:58 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    04:13:00 PM    all      0.00     0.00    0.00    0.00      0.00    0.00     0.00      0.00    100.00
    04:13:00 PM     0      0.00     0.00    0.00    0.00      0.00    0.00     0.00      0.00    100.00

    Average:       CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
    Average:         all      0.00     0.00    0.17    0.00      0.00    0.00     0.00      0.00     99.83
    Average:          0      0.00     0.00    0.17    0.00      0.00    0.00     0.00      0.00     99.83

    4.  虛擬內存的實時監控工具(vmstat)
      vmstat命令用來獲得UNIX系統有關進程、虛存、頁面交換空間及CPU活動的信息。這些信息反映了系統的負載情況。vmstat首次運行時顯示自 系統啓動開始的各項統計信息,之後運行vmstat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。
    /> vmstat 1 3    #這是vmstat最爲常用的方式,其含義爲每隔1秒輸出一條,一共輸出3條後程序退出。
    procs  -----------memory----------   ---swap-- -----io---- --system-- -----cpu-----
     r  b   swpd      free      buff   cache   si   so     bi    bo     in   cs  us  sy id  wa st
     0  0        0 531760  67284 231212  108  0     0  260   111  148  1   5 86   8  0
     0  0        0 531752  67284 231212    0    0     0     0     33   57   0   1 99   0  0
     0  0        0 531752  67284 231212    0    0     0     0     40   73   0   0 100 0  0

    /> vmstat 1       #其含義爲每隔1秒輸出一條,直到按CTRL+C後退出。

    下面將給出輸出表格中每一列的含義說明:
    有關進程的信息有:(procs)
    r:  在就緒狀態等待的進程數。
    b: 在等待狀態等待的進程數。   
    有關內存的信息有:(memory)
    swpd:  正在使用的swap大小,單位爲KB。
    free:    空閒的內存空間。
    buff:    已使用的buff大小,對塊設備的讀寫進行緩衝。
    cache: 已使用的cache大小,文件系統的cache。
    有關頁面交換空間的信息有:(swap)
    si:  交換內存使用,由磁盤調入內存。
    so: 交換內存使用,由內存調入磁盤。 
    有關IO塊設備的信息有:(io)
    bi:  從塊設備讀入的數據總量(讀磁盤) (KB/s)
    bo: 寫入到塊設備的數據總理(寫磁盤) (KB/s)  
    有關故障的信息有:(system)
    in: 在指定時間內的每秒中斷次數。
    sy: 在指定時間內每秒系統調用次數。
    cs: 在指定時間內每秒上下文切換的次數。  
    有關CPU的信息有:(cpu)
    us:  在指定時間間隔內CPU在用戶態的利用率。
    sy:  在指定時間間隔內CPU在覈心態的利用率。
    id:  在指定時間間隔內CPU空閒時間比。
    wa: 在指定時間間隔內CPU因爲等待I/O而空閒的時間比。  
    vmstat   可以用來確定一個系統的工作是受限於CPU還是受限於內存:如果CPU的sy和us值相加的百分比接近100%,或者運行隊列(r)中等待的進程數總是不 等於0,且經常大於4,同時id也經常小於40,則該系統受限於CPU;如果bi、bo的值總是不等於0,則該系統受限於內存。

    5.  設備IO負載的實時監控工具(iostat)
    iostat主要用於監控系統設備的IO負載情況,iostat首次運行時顯示自系統啓動開始的各項統計信息,之後運行iostat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。
    其中該命令中最爲常用的使用方式如下:
    /> iostat -d 1 3    #僅顯示設備的IO負載,其中每隔1秒刷新並輸出結果一次,輸出3次後iostat退出。
    Linux 2.6.32-71.el6.i686 (Stephen-PC)   11/16/2011      _i686_  (1 CPU)

    Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    sda                 5.35       258.39        26.19     538210      54560

    Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    sda                 0.00         0.00         0.00                  0          0

    Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    sda                 0.00         0.00         0.00                  0          0

    Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    sda                 0.00         0.00         0.00                  0          0
    /> iostat -d 1  #和上面的命令一樣,也是每隔1秒刷新並輸出一次,但是該命令將一直輸出,直到按CTRL+C退出。
    下面將給出輸出表格中每列的含義:

列名說明
Blk_read/s每秒塊(扇區)讀取的數量。
Blk_wrtn/s每秒塊(扇區)寫入的數量。
Blk_read總共塊(扇區)讀取的數量。
Blk_wrtn總共塊(扇區)寫入的數量。

    iostat還有一個比較常用的選項-x,該選項將用於顯示和io相關的擴展數據。
    /> iostat -dx 1 3
    Device:  rrqm/s wrqm/s  r/s   w/s  rsec/s wsec/s avgrq-sz avgqu-sz   await  svctm  %util
    sda            5.27   1.31 2.82 1.14 189.49  19.50    52.75     0.53     133.04  10.74   4.26

    Device:  rrqm/s wrqm/s  r/s   w/s  rsec/s wsec/s avgrq-sz avgqu-sz   await  svctm  %util
    sda            0.00   0.00 0.00 0.00   0.00   0.00        0.00     0.00         0.00   0.00   0.00

    Device:  rrqm/s wrqm/s  r/s   w/s  rsec/s wsec/s avgrq-sz avgqu-sz   await  svctm  %util
    sda            0.00   0.00 0.00 0.00   0.00   0.00        0.00     0.00         0.00   0.00   0.00
    還可以在命令行參數中指定要監控的設備名,如:
    /> iostat -dx sda 1 3   #指定監控的設備名稱爲sda,該命令的輸出結果和上面命令完全相同。

    下面給出擴展選項輸出的表格中每列的含義:

列名說明
rrqm/s隊列中每秒鐘合併的讀請求數量
wrqm/s隊列中每秒鐘合併的寫請求數量
r/s每秒鐘完成的讀請求數量
w/s每秒鐘完成的寫請求數量
rsec/s每秒鐘讀取的扇區數量
wsec/s每秒鐘寫入的扇區數量
avgrq-sz平均請求扇區的大小
avgqu-sz平均請求隊列的長度
await平均每次請求的等待時間
util設備的利用率

    下面是關鍵列的解釋:
    util是設備的利用率。如果它接近100%,通常說明設備能力趨於飽和。
    await是平均每次請求的等待時間。這個時間包括了隊列時間和服務時間,也就是說,一般情況下,await大於svctm,它們的差值越小,則說明隊列時間越短,反之差值越大,隊列時間越長,說明系統出了問題。
    avgqu-sz是平均請求隊列的長度。毫無疑問,隊列長度越短越好。                 

     6.  當前運行進程的實時監控工具(pidstat)
       pidstat主要用於監控全部或指定進程佔用系統資源的情況,如CPU,內存、設備IO、任務切換、線程等。pidstat首次運行時顯示自系統啓動 開始的各項統計信息,之後運行pidstat將顯示自上次運行該命令以後的統計信息。用戶可以通過指定統計的次數和時間來獲得所需的統計信息。
    在正常的使用,通常都是通過在命令行選項中指定待監控的pid,之後再通過其他具體的參數來監控與該pid相關係統資源信息。

選項說明
-l顯示該進程和CPU相關的信息(command列中可以顯示命令的完整路徑名和命令的參數)。
-d顯示該進程和設備IO相關的信息。
-r顯示該進程和內存相關的信息。
-w顯示該進程和任務時間片切換相關的信息。
-t顯示在該進程內正在運行的線程相關的信息。
-p後面緊跟着帶監控的進程id或ALL(表示所有進程),如不指定該選項,將監控當前系統正在運行的所有進程。

    #監控pid爲1(init)的進程的CPU資源使用情況,其中每隔2秒刷新並輸出一次,3次後程序退出。
    /> pidstat -p 1 2 3 -l
    07:18:58 AM       PID    %usr %system  %guest    %CPU   CPU  Command
    07:18:59 AM         1    0.00    0.00    0.00    0.00     0  /sbin/init
    07:19:00 AM         1    0.00    0.00    0.00    0.00     0  /sbin/init
    07:19:01 AM         1    0.00    0.00    0.00    0.00     0  /sbin/init
    Average:               1    0.00    0.00    0.00    0.00     -  /sbin/init
    %usr:      該進程在用戶態的CPU使用率。
    %system:該進程在內核態(系統級)的CPU使用率。
    %CPU:     該進程的總CPU使用率,如果在SMP環境下,該值將除以CPU的數量,以表示每CPU的數據。
    CPU:         該進程所依附的CPU編號(0表示第一個CPU)。

    #監控pid爲1(init)的進程的設備IO資源負載情況,其中每隔2秒刷新並輸出一次,3次後程序退出。
    /> pidstat -p 1 2 3 -d    
    07:24:49 AM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
    07:24:51 AM         1      0.00      0.00      0.00  init
    07:24:53 AM         1      0.00      0.00      0.00  init
    07:24:55 AM         1      0.00      0.00      0.00  init
    Average:               1      0.00      0.00      0.00  init
    kB_rd/s:   該進程每秒的字節讀取數量(KB)。
    kB_wr/s:   該進程每秒的字節寫出數量(KB)。
    kB_ccwr/s: 該進程每秒取消磁盤寫入的數量(KB)。

    #監控pid爲1(init)的進程的內存使用情況,其中每隔2秒刷新並輸出一次,3次後程序退出。
    /> pidstat -p 1 2 3 -r
    07:29:56 AM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
    07:29:58 AM         1      0.00      0.00    2828   1368   0.13  init
    07:30:00 AM         1      0.00      0.00    2828   1368   0.13  init
    07:30:02 AM         1      0.00      0.00    2828   1368   0.13  init
    Average:               1      0.00      0.00    2828   1368   0.13  init
    %MEM:  該進程的內存使用百分比。

    #監控pid爲1(init)的進程任務切換情況,其中每隔2秒刷新並輸出一次,3次後程序退出。
    /> pidstat -p 1 2 3 -w
    07:32:15 AM       PID   cswch/s nvcswch/s  Command
    07:32:17 AM         1      0.00      0.00  init
    07:32:19 AM         1      0.00      0.00  init
    07:32:21 AM         1      0.00      0.00  init
    Average:            1      0.00      0.00  init
    cswch/s:    每秒任務主動(自願的)切換上下文的次數。主動切換是指當某一任務處於阻塞等待時,將主動讓出自己的CPU資源。
    nvcswch/s: 每秒任務被動(不自願的)切換上下文的次數。被動切換是指CPU分配給某一任務的時間片已經用完,因此將強迫該進程讓出CPU的執行權。

    #監控pid爲1(init)的進程及其內部線程的內存(r選項)使用情況,其中每隔2秒刷新並輸出一次,3次後程序退出。需要說明的是,如果-t選項後面不加任何其他選項,缺省監控的爲CPU資源。結果中黃色高亮的部分表示進程和其內部線程是樹狀結構的顯示方式。
    /> pidstat -p 1 2 3 -tr
    Linux 2.6.32-71.el6.i686 (Stephen-PC)   11/16/2011      _i686_  (1 CPU)

    07:37:04 AM      TGID       TID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
    07:37:06 AM         1         -      0.00      0.00        2828   1368      0.13  init
    07:37:06 AM         -         1      0.00      0.00        2828   1368      0.13  |__init

    07:37:06 AM      TGID       TID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
    07:37:08 AM         1         -      0.00      0.00        2828   1368      0.13  init
    07:37:08 AM         -         1      0.00      0.00        2828   1368      0.13  |__init

    07:37:08 AM      TGID       TID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
    07:37:10 AM         1         -      0.00      0.00        2828   1368      0.13  init
    07:37:10 AM         -         1      0.00      0.00        2828   1368      0.13  |__init

    Average:         TGID       TID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
    Average:            1         -      0.00      0.00        2828   1368      0.13  init
    Average:            -         1      0.00      0.00        2828   1368      0.13  |__init
    TGID: 線程組ID。
    TID: 線程ID。  

    以上監控不同資源的選項可以同時存在,這樣就將在一次輸出中輸出多種資源的使用情況,如:pidstat -p 1 -dr。

    7.  報告磁盤空間使用狀況(df):
    該命令最爲常用的選項就是-h,該選項將智能的輸出數據單位,以便使輸出的結果更具可讀性。
    /> df -h
    Filesystem             Size  Used   Avail Use% Mounted on
    /dev/sda1             5.8G  3.3G  2.2G  61%   /
    tmpfs                  504M  260K  504M   1%  /dev/shm

    8.  評估磁盤的使用狀況(du)

選項說明
-a包括了所有的文件,而不只是目錄。
-b以字節爲計算單位。
-k以千字節(KB)爲計算單位。
-m以兆字節(MB)爲計算單位。
-h使輸出的信息更易於閱讀。
-s只顯示工作目錄所佔總空間。
--exclude=PATTERN排除掉符合樣式的文件,Pattern就是普通的Shell樣式,?表示任何一個字符,*表示任意多個字符。
--max-depth=N從當前目錄算起,目錄深度大於N的子目錄將不被計算,該選項不能和s選項同時存在。

    #僅顯示子一級目錄的信息。
    /> du --max-depth=1 -h
    246M    ./stephen
    246M    .   
    /> du -sh ./*   #獲取當前目錄下所有子目錄所佔用的磁盤空間大小。
    352K    ./MemcachedTest
    132K    ./Test
    33M     ./thirdparty   
    #在當前目錄下,排除目錄名模式爲Te*的子目錄(./Test),輸出其他子目錄佔用的磁盤空間大小。
    /> du --exclude=Te* -sh ./*  
    352K    ./MemcachedTest
    33M     ./thirdparty


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章