Linux性能監控(1)

        linux性能監控,就是要監控系統的各個子系統是否正常。linux主要的子系統包括:CPU、Memory、IO和Network,它們之間相互依賴,一個出問題可能會影響其他的。比如:網卡流量很大會導致更多的CPU開銷,因爲頻繁的響應中斷執行協議棧。

        性能監控時,首先要確定應用的類型,然後對症下藥,可以將應用分成:
        CPU密集型:CPU開銷很高,比如大量的CPU運算、科學計算等。通常web server屬於這類。
        IO密集型:大量的磁盤讀寫,高負荷的內存使用。IO密集型不會對CPU發起更多的請求,它佔用CPU只是爲了產生IO請求然後sleep。通常數據庫屬於這一類型。

1. CPU

1. 上下文切換

        上下文切換(Context Switch)是多任務操作系統的基石,每個進程都有自己的執行環境就是進程的上下文,這些上下文就是當前進程使用的寄存器,比如PC、棧指針%esp、幀指針%ebp等。每個處理器核心在任意時刻只能執行一個進程或線程,當線程的時間片用盡或者線程阻塞(比如線程執行磁盤io或網絡io時),進程調度器會根據一定的規則(比如選擇運行時間加權之後最少的)挑選一個線程佔有處理器。因爲CPU的寄存器集合只有一份,所有必須要保存上一個進程使用的寄存器,同時恢復被調度的進程的寄存器狀態。

        上下文切換時有損耗的。一般地,當系統中線程過多或者io負載過高時,上下文切換會比較頻繁,此時CPU時間過多的消耗在上下文切換。

2. 運行隊列

        內核中的進程調度器維護着運行隊列(run queue),而每個阻塞源維護着自己的阻塞隊列(wait queue,比如一個文件描述符,正在讀寫該文件的進程會被阻塞在其阻塞隊列上)。任意一個進程要麼處於可執行狀態,要麼阻塞狀態。所有的可執行狀態的進程都處於運行隊列,如果當前系統CPU負載很高,那麼運行隊列的長度很大,進程調度器就不會及時響應系統請求。當運行隊列越來越大時,進程或線程將花費更多的時間來獲取CPU時間。

> cat /proc/loadavg
0.02 0.05 0.05 1/279 23903
        上述命令可以顯示系統負載,分別是:過去1分鐘、5分鐘、15分鐘的系統負載、當前正在執行的進程數/系統的所有進程數、最後執行的進程的pid。top命令也可以現在系統負載。

3. vmstat

        vmstat提供一種低開銷的方式統計系統性能數據。

>  vmstat 1 1
procs -----------memory------------------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free     buff    cache        si   so    bi    bo     in   cs     us sy id wa
0  0      0   1540304  497972  1631008      0    0     0    45      0    0       2  0 97  1    
        與CPU相關的各個列的意思:
        r:當前運行隊列中的進程的數目,就是那些處於可執行狀態,但是得不到CPU的進程。
        b:當前處於阻塞狀態,並等待IO請求完成的進程的數目。
        in:當前處理的中斷數目。
        cs:當前系統發生的上下文切換次數。
        us:CPU在用戶空間執行的時間的百分比。
        sy:CPU在內核空間執行的時間的百分比。
        id:CPU空閒時間的百分比。
        wa:由於所有可運行進程等待IO請求完成被阻塞導致的CPU空閒時間的百分比。

4. pidstat

        pidstat用於查看進程所屬的線程的CPU的使用情況。

> pidstat -p 2036 -t 1 1
Linux 2.6.32-5-xen-amd64 (vzw51173.puppetclient.163.com)        2012年10月12日  _x86_64_        (4 CPU)
16時09分17秒      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
16時09分18秒      2036         -    0.00    2.00    0.00    2.00     3  python
16時09分18秒         -      2036    0.00    0.00    0.00    0.00     3  |__python
16時09分18秒         -      2041    0.00    0.00    0.00    0.00     3  |__python
16時09分18秒         -      5639    0.00    0.00    0.00    0.00     2  |__python
16時09分18秒         -      5650    0.00    1.00    0.00    1.00     1  |__python
平均時間:      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
平均時間:      2036         -    0.00    2.00    0.00    2.00     -  python
平均時間:         -      2036    0.00    0.00    0.00    0.00     -  |__python
平均時間:         -      2041    0.00    0.00    0.00    0.00     -  |__python
平均時間:         -      5639    0.00    0.00    0.00    0.00     -  |__python
平均時間:         -      5650    0.00    1.00    0.00    1.00     -  |__python
        Linux中是不區分進程和線程的,線程就是可以共享資源的進程。TID就是線程的PID,這裏可以查看各個線程的CPU使用情況。

5. 總結

        vmstat     ->     top     ->     pidstat
        通過vmstat查看整體CPU使用情況,top查看CPU佔用高的幾個進程,pidstat查看這幾個進程對應的線程。
        監控CPU性能包括以下幾個部分:
       a. 檢查CPU的run queue,每個CPU的run queue最好不要超過3個進程。
       b. 確定CPU利用率在usr/sys = 65% / 35% ~ 70% / 30%之間。
       c. 當CPU的處理時間更多的是在system空間,說明已經超負荷。
       d. 當I/O增多時,CPU密集型的應用將受到影響。
       e. 當CPU的IOWait佔用比較大的比例時,說明IO出現異常。

2. Memory

1. 虛擬內存

        虛擬內存就是在硬盤上劃出一部分區域做爲內存使用,當系統可用的內存低於某個值時,內核就會將當前不再活躍的內存塊寫入磁盤,然後這塊內存可以作爲其他用途使用。當cpu需要訪問被寫入磁盤的數據時,再把它讀入到內存中。上述操作對用戶來說是透明的,磁盤的讀寫是很慢的,比內存要慢幾千萬倍(磁盤10ms,內存100-200ns),所以要儘量把數據放在內存中,程序纔會運行的更快。硬盤中用作替代內存的部分就是虛擬內存,成爲swap space。

2. 頁高速緩存

        Linux內核通過頁高速緩存來加快磁盤操作。當系統存在大量的空閒內存時,內核會把空閒內存的一部分做爲頁高速緩存。當某個磁盤塊被緩存之後,對於這個磁盤塊的讀寫就相當於內存操作。讀操作時直接讀對應的page,寫操作時將內容寫入對應的page,然後將該page標記爲髒頁,會有後臺線程flush(linux 2.6內核)完成將髒頁同步回磁盤。flush在髒頁比例大於某個閾值,或者修改超過一定時間之後進行寫回。

> ps axu | grep flush
root       927  0.0  0.0      0     0 ?        S    May23   2:34 [flush-202:2]
root     14413  0.0  0.0  10200   856 pts/2    S+   16:53   0:00 grep flush

3. vmstat

        vmstat可以查看系統的內存相關信息。

> vmstat 1
procs -----------memory------------- ----swap----- -----io---- -system-- ----cpu----
r  b   swpd   free     buff      cache     si   so    bi    bo   in    cs   us  sy id wa
0  0   6004  38264  99552 3741240    0    0     0     4    0      0    0  0 100  0
0  0   6004  37364  99552 3741244    0    0     0     0  1565  906  0  0 99  0
        內存相關列的意思:
        swpd:當前使用的虛擬內存的總額(KB),當空閒內存達到更低的閾值時,更多的頁會被交換到磁盤。
        free:當前內存中的空閒空間的大小(KB)。
        buff:當前內存中用於read和write操作的緩衝區的大小(KB)。
        cache:頁高速緩存大小(KB)。
        si:從swap寫回內存的大小(KB)。
        so:寫入swap的大小(KB)。
        bi:從文件系統或交換設備讀的磁盤塊的大小(KB)。讀磁盤。
        bo:從內存寫入文件系統或交換設備的大小(KB)。寫磁盤。

4. pidstat

        查看進程的缺頁情況。

> pidstat -r -p 31679 1 1
Linux 2.6.32-5-xen-amd64 (debian-org)   2012年10月12日  _x86_64_        (4 CPU)

17時10分02秒       PID      minflt/s  majflt/s     VSZ    RSS    %MEM  Command
17時10分03秒     31679   1292.00      0.00    871348 107852   2.58   node
平均時間:           31679   1292.00      0.00    871348 107852   2.58  node
        各個列含義:
        minflt/s:進程平均每s造成的minor fault,這些錯誤不會導致從磁盤加載內存頁。
        majflt/s:進程平均每s造成的major fault,這些錯誤會導致從磁盤加載內存頁。
        VSZ:進程使用的所有虛擬內存的大小(KB)。
        RSS:進程使用的物理內存大小(KB)。
        %MEM:佔用物理內存百分比。

5. sar

        a. 查看頁統計信息
> sar -B
Linux 2.6.32-5-xen-amd64 (debian-org)   2012年11月17日  _x86_64_        (4 CPU)

00時00分01秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
00時05分01秒      0.00    200.84      364.65      0.00    538.94      0.00      0.00      0.00      0.00
00時15分01秒      0.00    184.84      353.72      0.00    396.33      0.00      0.00      0.00      0.00
……
09時45分01秒      0.00   1822.52    1175.53      0.00   9406.76      0.00      0.00      0.00      0.00
09時55分01秒      0.00   3401.99    1556.25      0.00  10269.71      0.00      0.00      0.00      0.00
平均時間:            0.00    319.68       429.48      0.00   1036.33      0.00      0.00      0.00      0.00
        各個列的含義:
        pgpgin/s:每s從磁盤換入的頁的大小(KB)
        pgpgout/s:每s換出到磁盤的頁的大小(KB)
        fault/s:每s發生的缺頁錯誤的次數,包括minor fault和major fault。
        majflt/s:每s發生的major fault的次數,major fault會導致從磁盤載入內存頁(即使用了swap分區)。
        pgfree/s:每s放入空閒列表中的頁的個數。
        pgscank/s:每s被kswapd後臺進程掃描的頁的個數。
        pgscand/s:每s直接被掃描的頁的個數。
        pgsteal/s:爲了滿足內存要求,每s從cache(pagecache和swapcache)回收的頁的個數。
        %vmeff:等於pgsteal  /  pgscan,用於計算頁回收(page reclaim)的效率。
        
        b. 查看內存使用信息
> sar -r
Linux 2.6.32-5-xen-amd64 (debian-org)   2012年11月17日  _x86_64_        (4 CPU)

00時00分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
00時05分01秒   1636744   2551244             60.92    498112   1626600    180708      4.31
00時15分01秒   1634724   2553264             60.97    498112   1626628    181304      4.33
……
09時55分01秒   1555940   2632048             62.85    498128   1624716    200876      4.80
10時05分01秒   1548416   2639572             63.03    498128   1624760    206364      4.93
10時15分01秒   1545200   2642788             63.10    498128   1624804    212948      5.08

10時15分01秒 kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
10時25分01秒   1542332   2645656     63.17    498128   1624852    211524      5.05
平均時間:     1624618   2563370     61.21    498118   1626298    183528      4.38
        各個列的含義:
        kbmemfree:可用的空閒內存(KB)。
        kbmemused:使用的內存,不包括內核自己使用的內存(KB)。
        %memused:使用的內存的比例。
        kbbuffers:被內核用做緩衝區的內存(KB)。
        kbcached:被內核用來緩存數據的內存(KB)。
        kbcommit:對於當前的工作量需要的內存(KB),確定RAM/Swap的大小以防止out of memory。
        %commit:當前的工作量需要的內存和所有內存(RAM+Swap)的百分比。
        上面兩種sar的使用方式可以查看從0點到現在的每分鐘的統計信息,可以通過sar -B interval times以固定間隔時間interval秒統計times次數據,比如:
sar -B 1 5
Linux 2.6.32-5-xen-amd64 (debian-org)   2012年11月17日  _x86_64_        (4 CPU)

18時53分20秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
18時53分21秒      0.00      0.00     40.00      0.00    355.00      0.00      0.00      0.00      0.00
18時53分22秒      0.00      0.00     42.00      0.00    362.00      0.00      0.00      0.00      0.00
18時53分23秒      0.00      0.00     32.00      0.00    355.00      0.00      0.00      0.00      0.00
18時53分24秒      0.00   6584.00    104.00      0.00    414.00      0.00      0.00      0.00      0.00
18時53分25秒      0.00     28.00     66.00      0.00    427.00      0.00      0.00      0.00      0.00
平均時間:        0.00   1322.40     56.80      0.00    382.60      0.00      0.00      0.00      0.00

5. 總結

        a. 當系統出現較少的page fault,說明頁命中率很高,會獲得較好的響應時間。
        b. 在沒有寫入swap和disk的情況下,空閒內存越小,表明頁高速緩存利用率越高。
        c. 如果系統不斷報告swap device繁忙,那麼說明系統內存不足。


發佈了119 篇原創文章 · 獲贊 69 · 訪問量 126萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章