linux性能監(jiān)控,就是要監(jiān)控系統(tǒng)的各個子系統(tǒng)是否正常。linux主要的子系統(tǒng)包括:CPU、Memory、IO和Network,它們之間相互依賴,一個出問題可能會影響其他的。比如:網(wǎng)卡流量很大會導致更多的CPU開銷,因為頻繁的響應中斷執(zhí)行協(xié)議棧。
性能監(jiān)控時,首先要確定應用的類型,然后對癥下藥,可以將應用分成:
CPU密集型:CPU開銷很高,比如大量的CPU運算、科學計算等。通常web server屬于這類。
IO密集型:大量的磁盤讀寫,高負荷的內(nèi)存使用。IO密集型不會對CPU發(fā)起更多的請求,它占用CPU只是為了產(chǎn)生IO請求然后sleep。通常數(shù)據(jù)庫屬于這一類型。
1. CPU
1. 上下文切換
上下文切換(Context Switch)是多任務操作系統(tǒng)的基石,每個進程都有自己的執(zhí)行環(huán)境就是進程的上下文,這些上下文就是當前進程使用的寄存器,比如PC、棧指針%esp、幀指針%ebp等。每個處理器核心在任意時刻只能執(zhí)行一個進程或線程,當線程的時間片用盡或者線程阻塞(比如線程執(zhí)行磁盤io或網(wǎng)絡io時),進程調(diào)度器會根據(jù)一定的規(guī)則(比如選擇運行時間加權之后最少的)挑選一個線程占有處理器。因為CPU的寄存器集合只有一份,所有必須要保存上一個進程使用的寄存器,同時恢復被調(diào)度的進程的寄存器狀態(tài)。
上下文切換時有損耗的。一般地,當系統(tǒng)中線程過多或者io負載過高時,上下文切換會比較頻繁,此時CPU時間過多的消耗在上下文切換。
2. 運行隊列
內(nèi)核中的進程調(diào)度器維護著運行隊列(run queue),而每個阻塞源維護著自己的阻塞隊列(wait queue,比如一個文件描述符,正在讀寫該文件的進程會被阻塞在其阻塞隊列上)。任意一個進程要么處于可執(zhí)行狀態(tài),要么阻塞狀態(tài)。所有的可執(zhí)行狀態(tài)的進程都處于運行隊列,如果當前系統(tǒng)CPU負載很高,那么運行隊列的長度很大,進程調(diào)度器就不會及時響應系統(tǒng)請求。當運行隊列越來越大時,進程或線程將花費更多的時間來獲取CPU時間。
- > cat /proc/loadavg
- 0.02 0.05 0.05 1/279 23903
上述命令可以顯示系統(tǒng)負載,分別是:過去1分鐘、5分鐘、15分鐘的系統(tǒng)負載、當前正在執(zhí)行的進程數(shù)/系統(tǒng)的所有進程數(shù)、最后執(zhí)行的進程的pid。top命令也可以現(xiàn)在系統(tǒng)負載。
3. vmstat
vmstat提供一種低開銷的方式統(tǒng)計系統(tǒng)性能數(shù)據(jù)。
- > 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:當前運行隊列中的進程的數(shù)目,就是那些處于可執(zhí)行狀態(tài),但是得不到CPU的進程。
b:當前處于阻塞狀態(tài),并等待IO請求完成的進程的數(shù)目。
in:當前處理的中斷數(shù)目。
cs:當前系統(tǒng)發(fā)生的上下文切換次數(shù)。
us:CPU在用戶空間執(zhí)行的時間的百分比。
sy:CPU在內(nèi)核空間執(zhí)行的時間的百分比。
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中是不區(qū)分進程和線程的,線程就是可以共享資源的進程。TID就是線程的PID,這里可以查看各個線程的CPU使用情況。
5. 總結(jié)
vmstat -> top -> pidstat
通過vmstat查看整體CPU使用情況,top查看CPU占用高的幾個進程,pidstat查看這幾個進程對應的線程。
監(jiān)控CPU性能包括以下幾個部分:
a. 檢查CPU的run queue,每個CPU的run queue最好不要超過3個進程。
b. 確定CPU利用率在usr/sys = 65% / 35% ~ 70% / 30%之間。
c. 當CPU的處理時間更多的是在system空間,說明已經(jīng)超負荷。
d. 當I/O增多時,CPU密集型的應用將受到影響。
e. 當CPU的IOWait占用比較大的比例時,說明IO出現(xiàn)異常。
2. Memory
1. 虛擬內(nèi)存
虛擬內(nèi)存就是在硬盤上劃出一部分區(qū)域做為內(nèi)存使用,當系統(tǒng)可用的內(nèi)存低于某個值時,內(nèi)核就會將當前不再活躍的內(nèi)存塊寫入磁盤,然后這塊內(nèi)存可以作為其他用途使用。當cpu需要訪問被寫入磁盤的數(shù)據(jù)時,再把它讀入到內(nèi)存中。上述操作對用戶來說是透明的,磁盤的讀寫是很慢的,比內(nèi)存要慢幾千萬倍(磁盤10ms,內(nèi)存100-200ns),所以要盡量把數(shù)據(jù)放在內(nèi)存中,程序才會運行的更快。硬盤中用作替代內(nèi)存的部分就是虛擬內(nèi)存,成為swap space。
2. 頁高速緩存
Linux內(nèi)核通過頁高速緩存來加快磁盤操作。當系統(tǒng)存在大量的空閑內(nèi)存時,內(nèi)核會把空閑內(nèi)存的一部分做為頁高速緩存。當某個磁盤塊被緩存之后,對于這個磁盤塊的讀寫就相當于內(nèi)存操作。讀操作時直接讀對應的page,寫操作時將內(nèi)容寫入對應的page,然后將該page標記為臟頁,會有后臺線程flush(linux 2.6內(nèi)核)完成將臟頁同步回磁盤。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可以查看系統(tǒng)的內(nèi)存相關信息。
- > 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
內(nèi)存相關列的意思:
swpd:當前使用的虛擬內(nèi)存的總額(KB),當空閑內(nèi)存達到更低的閾值時,更多的頁會被交換到磁盤。
free:當前內(nèi)存中的空閑空間的大小(KB)。
buff:當前內(nèi)存中用于read和write操作的緩沖區(qū)的大小(KB)。
cache:頁高速緩存大?。↘B)。
si:從swap寫回內(nèi)存的大?。↘B)。
so:寫入swap的大?。↘B)。
bi:從文件系統(tǒng)或交換設備讀的磁盤塊的大?。↘B)。讀磁盤。
bo:從內(nèi)存寫入文件系統(tǒng)或交換設備的大?。↘B)。寫磁盤。
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,這些錯誤不會導致從磁盤加載內(nèi)存頁。
majflt/s:進程平均每s造成的major fault,這些錯誤會導致從磁盤加載內(nèi)存頁。
VSZ:進程使用的所有虛擬內(nèi)存的大?。↘B)。
RSS:進程使用的物理內(nèi)存大?。↘B)。
%MEM:占用物理內(nèi)存百分比。
5. sar
a. 查看頁統(tǒng)計信息
- > 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從磁盤換入的頁的大?。↘B)
pgpgout/s:每s換出到磁盤的頁的大小(KB)
fault/s:每s發(fā)生的缺頁錯誤的次數(shù),包括minor fault和major fault。
majflt/s:每s發(fā)生的major fault的次數(shù),major fault會導致從磁盤載入內(nèi)存頁(即使用了swap分區(qū))。
pgfree/s:每s放入空閑列表中的頁的個數(shù)。
pgscank/s:每s被kswapd后臺進程掃描的頁的個數(shù)。
pgscand/s:每s直接被掃描的頁的個數(shù)。
pgsteal/s:為了滿足內(nèi)存要求,每s從cache(pagecache和swapcache)回收的頁的個數(shù)。
%vmeff:等于pgsteal / pgscan,用于計算頁回收(page reclaim)的效率。
b. 查看內(nèi)存使用信息
- > 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:可用的空閑內(nèi)存(KB)。
kbmemused:使用的內(nèi)存,不包括內(nèi)核自己使用的內(nèi)存(KB)。
%memused:使用的內(nèi)存的比例。
kbbuffers:被內(nèi)核用做緩沖區(qū)的內(nèi)存(KB)。
kbcached:被內(nèi)核用來緩存數(shù)據(jù)的內(nèi)存(KB)。
kbcommit:對于當前的工作量需要的內(nèi)存(KB),確定RAM/Swap的大小以防止out of memory。
%commit:當前的工作量需要的內(nèi)存和所有內(nèi)存(RAM+Swap)的百分比。
上面兩種sar的使用方式可以查看從0點到現(xiàn)在的每分鐘的統(tǒng)計信息,可以通過sar -B interval times以固定間隔時間interval秒統(tǒng)計times次數(shù)據(jù),比如:
- 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. 總結(jié)
a. 當系統(tǒng)出現(xiàn)較少的page fault,說明頁命中率很高,會獲得較好的響應時間。
b. 在沒有寫入swap和disk的情況下,空閑內(nèi)存越小,表明頁高速緩存利用率越高。
c. 如果系統(tǒng)不斷報告swap device繁忙,那么說明系統(tǒng)內(nèi)存不足。
|