1. 程式人生 > >linux 系統性能分析常用命令

linux 系統性能分析常用命令

 1.top

使用許可權:所有使用者

使用方式:top [-] [d delay] [q] [c] [S] [s] [i] [n] [b]

說明:即時顯示process的動態

d :改變顯示的更新速度,或是在交談式指令列( interactive command)按s

q :沒有任何延遲的顯示速度,如果使用者是有superuser的許可權,則top將會以最高的優先序執行

c :切換顯示模式,共有兩種模式,一是隻顯示執行檔的名稱,另一種是顯示完整的路徑與名稱S :累積模式,會將己完成或消失的子行程( dead child process )的CPU time累積起來

s :安全模式,將交談式指令取消,避免潛在的危機

i :不顯示任何閒置(idle)或無用(zombie)的行程

n :更新的次數,完成後將會退出top

b :批次檔模式,搭配"n"引數一起使用,可以用來將top的結果輸出到檔案內

範例:

顯示更新十次後退出:top -n 10

使用者將不能利用交談式指令來對行程下命令:top -s

將更新顯示二次的結果輸入到名稱為top。log的檔案裡:top -n 2 -b < top.log

 2.vmstat

正如我們之前討論的任何系統的效能比較都是基於基線的,並且監控CPU的效能就是以上3點,執行佇列、CPU使用率和上下文切換。以下是一些對於CPU很普遍的效能要求:

1。對於每一個CPU來說執行佇列不要超過3,例如,如果是雙核CPU就不要超過6;

2。如果CPU在滿負荷執行,應該符合下列分佈,

a) User Time:65%~70%

b) System Time:30%~35%

c) Idle:0%~5%

procs

r 列表示執行和等待cpu時間片的程序數,如果長期大於1,說明cpu不足,需要增加cpu。

b 列表示在等待資源的程序數,比如正在等待I/O、或者記憶體交換等。

memory

swpd 切換到記憶體交換區的記憶體數量(k表示)。如果swpd的值不為0,或者比較大,比如超過了100m,只要si、so的值長期為0,系統性能還是正常

free 當前的空閒頁面列表中記憶體數量(k表示)

buff 作為buffer cache的記憶體數量,一般對塊裝置的讀寫才需要緩衝。

cache: 作為page cache的記憶體數量,一般作為檔案系統的cache,如果cache較大,說明用到cache的檔案較多,如果此時IO中bi比較小,說明檔案系統效率比較好。

swap

si 由記憶體進入記憶體交換區數量。

so由記憶體交換區進入記憶體數量。

IO

bi 從塊裝置讀入資料的總量(讀磁碟)(每秒kb)。

bo 塊裝置寫入資料的總量(寫磁碟)(每秒kb)

這裡我們設定的bi+bo參考值為1000,如果超過1000,而且wa值較大應該考慮均衡磁碟負載,可以結合iostat輸出來分析。

system (顯示採集間隔內發生的中斷數)

in 列表示在某一時間間隔中觀測到的每秒裝置中斷數。

cs列表示每秒產生的上下文切換次數,如當 cs 比磁碟 I/O 和網路資訊包速率高得多,都應進行進一步調查。

cpu (表示cpu的使用狀態)

us 列顯示了使用者方式下所花費 CPU 時間的百分比。us的值比較高時,說明使用者程序消耗的cpu時間多,但是如果長期大於50%,需要考慮優化使用者的程式。

sy 列顯示了核心程序所花費的cpu時間的百分比。這裡us + sy的參考值為80%,如果us+sy 大於 80%說明可能存在CPU不足。

wa 列顯示了IO等待所佔用的CPU時間的百分比。這裡wa的參考值為30%,如果wa超過30%,說明IO等待嚴重,這可能是磁碟大量隨機訪問造成的,也可能磁碟或者磁碟訪問控制器的頻寬瓶頸造成的(主要是塊操作)。

id 列顯示了cpu處在空閒狀態的時間百分比。

3. mpstat

對於上下文切換要結合CPU使用率來看,如果CPU使用滿足上述分佈,大量的上下文切換也是可以接受的。

常用的監視工具有:vmstat,top,dstat和mpstat。

#vmstat

 

r表示執行佇列的大小,

b表示由於IO等待而block的執行緒數量,

in表示中斷的數量,

cs表示上下文切換的數量,

us表示使用者CPU時間,

sys表示系統CPU時間,

wa表示由於IO等待而是CPU處於idle狀態的時間,

id表示CPU處於idle狀態的總時間。

#dstat –cip

可以給出每一個裝置產生的中斷數。

 

我們可以看到這裡有3個裝置號92,107和109。裝置名和裝置號的關係我們可以參考檔案/proc/interrupts,這裡109代表網絡卡eth1。

#cat /proc/interrupts

 

#mpstat [-P {|ALL}] [internal [count]]

-P {|ALL} 表示監控哪個CPU, cpu在[0,cpu個數-1]中取值;

internal 相鄰的兩次取樣的間隔時間;

count 取樣的次數,count只能和delay一起使用;

當沒有引數時,mpstat則顯示系統啟動以後所有資訊的平均值。有interval時,第一行的資訊自系統啟動以來的平均資訊。從第二行開始,輸出為前一個interval時間段的平均資訊。

mpstat可以顯示每個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

總結的說,CPU效能監控包含以下方面:

檢查系統的執行佇列,確保每一個CPU的執行佇列不大於3。

確保CPU使用分佈滿足70/30原則(使用者70%,系統30%)。

如果系統時間過長,可能是因為頻繁的排程和改變優先順序。

CPU Bound程序總是會被懲罰(降低優先順序)而IO Bound程序總會被獎勵(提高優先順序)。

4. sar

常用格式:sar [options] [-A] [-o file] t [n]

t為取樣間隔,n為取樣次數,預設值是1;

-o file表示將命令結果以二進位制格式存放在檔案中,file 是檔名。

-A:所有報告的總和

-u:輸出CPU使用情況的統計資訊

-v:輸出inode、檔案和其他核心表的統計資訊

-d:輸出每一個塊裝置的活動資訊

-r:輸出記憶體和交換空間的統計資訊

-b:顯示I/O和傳送速率的統計資訊

-a:檔案讀寫情況

-c:輸出程序統計資訊,每秒建立的程序數

-R:輸出記憶體頁面的統計資訊

-y:終端裝置活動情況

-w:輸出系統交換活動資訊

cpu資源監控

sar -u -o test 10 3

每10秒取樣一次,連續取樣3次,觀察CPU 的使用情況,並將取樣結果以二進位制形式存入當前目錄下的檔案test中。

 

CPU:all 表示統計資訊為所有CPU的平均值。

%user:顯示在使用者級別(application)執行使用 CPU 總時間的百分比。

%nice:顯示在使用者級別,用於nice操作,所佔用 CPU 總時間的百分比。

%system:在核心級別(kernel)執行所使用 CPU 總時間的百分比。

%iowait:顯示用於等待I/O操作佔用 CPU 總時間的百分比。

%steal:管理程式(hypervisor)為另一個虛擬程序提供服務而等待虛擬 CPU 的百分比。

%idle:顯示 CPU 空閒時間佔用 CPU 總時間的百分比。

1. 若 %iowait 的值過高,表示硬碟存在I/O瓶頸

2. 若 %idle 的值高但系統響應慢時,有可能是 CPU 等待分配記憶體,此時應加大記憶體容量

3. 若 %idle 的值持續低於1,則系統的 CPU 處理能力相對較低,表明系統中最需要解決的資源是 CPU 。

inode、檔案和其他核心表監控

#sar -v 10 3

每10秒取樣一次,連續取樣3次,觀察核心表的狀態。

 

dentunusd:目錄快取記憶體中未被使用的條目數量

file-nr:檔案控制代碼(file handle)的使用數量

inode-nr:索引節點控制代碼(inode handle)的使用數量

pty-nr:使用的pty數量

記憶體和交換空間監控

#sar -r 10 3

每10秒取樣一次,連續取樣3次,監控記憶體分頁。

 

kbmemfree:這個值和free命令中的free值基本一致,所以它不包括buffer和cache的空間。

kbmemused:這個值和free命令中的used值基本一致,所以它包括buffer和cache的空間。

%memused:這個值是 kbmemused 和記憶體總量(不包括swap)的一個百分比。

kbbuffers和kbcached:這兩個值就是free命令中的buffer和cache。

kbcommit:保證當前系統所需要的記憶體,即為了確保不溢位而需要的記憶體(RAM+swap)。

%commit:這個值是kbcommit與記憶體總量(包括swap)的一個百分比。

記憶體分頁監控

#sar -B 10 3

每10秒取樣一次,連續取樣3次,監控記憶體分頁。

 

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)的百分比。

I/O和傳送速率監控

#sar -b 10 3

每10秒取樣一次,連續取樣3次,報告緩衝區的使用情況。

 

tps:每秒鐘物理裝置的 I/O 傳輸總量。

rtps:每秒鐘從物理裝置讀入的資料總量。

wtps:每秒鐘向物理裝置寫入的資料總量。

bread/s:每秒鐘從物理裝置讀入的資料量,單位為塊/s。

bwrtn/s:每秒鐘向物理裝置寫入的資料量,單位為塊/s。

程序佇列長度和平均負載狀態監控

#sar -q 10 3

每10秒取樣一次,連續取樣3次,監控程序佇列長度和平均負載狀態:

 

runq-sz:執行佇列的長度(等待執行的程序數)。

plist-sz:程序列表中程序(processes)和執行緒(threads)的數量。

ldavg-1:最後1分鐘的系統平均負載(System load average)。

ldavg-5:過去5分鐘的系統平均負載。

ldavg-15:過去15分鐘的系統平均負載。

系統交換活動資訊監控

#sar -W 10 3

每10秒取樣一次,連續取樣3次,監控系統交換活動資訊。

 

pswpin/s:每秒系統換入的交換頁面(swap page)數量

pswpout/s:每秒系統換出的交換頁面(swap page)數量

裝置使用情況監控

#sar -d 10 3 –p

每10秒取樣一次,連續取樣3次,報告裝置使用情況,

引數-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的百分比,比率越大,說明越飽和。

1. avgqu-sz 的值較低時,裝置的利用率較高。

2. 當%util的值接近 1% 時,表示裝置頻寬已經佔滿。

要判斷系統瓶頸問題,有時需幾個 sar 命令選項結合起來。

懷疑CPU存在瓶頸,可用 sar -u 和 sar -q 等來檢視。

懷疑記憶體存在瓶頸,可用 sar -B、sar -r 和 sar -W 等來檢視。

懷疑I/O存在瓶頸,可用 sar -b、sar -u 和 sar -d 等來檢視。

5. iostat

iostat主要用於監控系統裝置的IO負載情況,iostat首次執行時顯示自系統啟動開始的各項統計資訊,之後執行iostat將顯示自上次執行該命令以後的統計資訊。使用者可以通過指定統計的次數和時間來獲得所需的統計資訊。

iostat [ -c ] [ -d ] [ -h ] [ -N ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ -z ] [ device [...] | ALL ] [ -p [ device [,...] | ALL ] ] [ interval [ count ] ]

檢視TPS和吞吐量資訊

#iostat -d -k 1 3

 

tps:該裝置每秒的傳輸次數,一次傳輸的意思是“一次I/O請求”

kB_read/s:每秒從裝置讀取的資料量

kB_wrtn/s:每秒向裝置寫入的資料量

kB_read :讀取的總資料量

kB_wrtn :寫入的總數量資料量

檢視裝置使用率(%util)、響應時間(await)

#iostat -d -x -k 1 3

 

rrqm/s:每秒進行 merge 的讀運算元目.即 delta(rmerge)/s

wrqm/s:每秒進行 merge 的寫運算元目.即 delta(wmerge)/s

r/s:每秒完成的讀 I/O 裝置次數.即 delta(rio)/s

w/s:每秒完成的寫 I/O 裝置次數.即 delta(wio)/s

rsec/s:每秒讀扇區數.即 delta(rsect)/s

wsec/s:每秒寫扇區數.即 delta(wsect)/s

rkB/s:每秒讀K位元組數.是 rsect/s 的一半,因為每扇區大小為512位元組.(需要計算)

wkB/s:每秒寫K位元組數.是 wsect/s 的一半.(需要計算)

avgrq-sz:平均每次裝置I/O操作的資料大小(扇區).delta(rsect+wsect)/delta(rio+wio)

avgqu-sz:平均I/O佇列長度.即 delta(aveq)/s/1000(因為aveq的單位為毫秒).

await:平均每次裝置I/O操作的等待時間(毫秒).即 delta(ruse+wuse)/delta(rio+wio)

svctm:平均每次裝置I/O操作的服務時間 (毫秒).即 delta(use)/delta(rio+wio)

%util:一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間 I/O 佇列是非空的.即 delta(use)/s/1000 (因為use的單位為毫秒)

如果 %util 接近 100%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁碟可能存在瓶頸。

%util:在統計時間內所有處理IO時間,除以總共統計時間。例如,如果統計間隔1秒,該裝置有0.8秒在處理IO,而0.2秒閒置,那麼該裝置的%util = 0.8/1 = 80%,所以該引數暗示了裝置的繁忙程度。一般地,如果該引數是100%表示裝置已經接近滿負荷運行了(當然如果是多磁碟,即使%util是100%,因為磁碟的併發能力,所以磁碟使用未必就到了瓶頸)。)