1. 程式人生 > >linux系統看系統性能進行效能監控的幾大命令列

linux系統看系統性能進行效能監控的幾大命令列

一般我們檢視系統性能主要是在以下幾個方面 1.使用者使用CPU情況 展現為 %user 2.系統使用CPU情況 展現為 %sys 3.wio或iowait     展現為 %iowait 程序由於等待磁碟IO而使CPU處於空閒狀態的比率 4.CPU的空閒率 5.CPU上下文的交換的比率,也有說明為CPU上下文的切換。即記憶體和暫存器中資料的切換 6.nice 這個還不是很明白是啥意思 7.real-time 還是未知 8.執行佇列的長度 9.平均負載

二 、常用命令

1.mpstat 2.top 3.vmstat 4.sar 5.iostat 6.uptime

三命令詳解1. mpstat -P ALL 5  

  //需要注意的P和ALL一定要大寫

17時22分24秒  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s 17時22分29秒  all    0.30    0.00    0.10    0.67    0.02    0.07    0.00   98.83    821.40 17時22分29秒    0    1.00    0.00    0.60    1.00    0.20    0.60    0.00   96.60    560.00 17時22分29秒    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.20      0.00 17時22分29秒    2    0.60    0.00    0.20    0.20    0.00    0.20    0.00   99.00    250.20 17時22分29秒    3    0.00    0.00    0.00    4.00    0.00    0.00    0.00   96.00     11.20 17時22分29秒    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.20      0.00 17時22分29秒    5    0.80    0.00    0.00    0.00    0.00    0.00    0.00   99.20      0.00 17時22分29秒    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00 17時22分29秒    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00

上面資訊我們可以看出,有8個CPU。 %user :在internal時間段裡,即為使用者態的CPU時間,及登入使用者所消耗的CPU時間比。 %sys  :在internal時間段裡,負程序消耗的CPU時間,佔所有CPU的百分比 %nice :優先程序佔用時間 %iowait:在internal時間段裡,所有未等待磁碟IO操作程序佔CPU的百分比 %irq  : 這個還是未知 %soft : 在internal時間段裡,軟中斷時間(%) softirq/total*100 %idle : 在internal時間段裡,CPU除去等待磁碟IO操作外的因為任何原因而空閒的時間閒置時間 (%) intr/s: 在internal時間段裡,每秒CPU接收的中斷的次數

2. top  //直接敲TOP即可。

常見用法:top -d 3    //每三秒重新整理一次資料 預設是每5秒重新整理一次資料Ctrl+L      //擦除並且重寫螢幕。

[[email protected] log]# top top - 14:06:23 up 70 days, 16:44, 2 users, load average: 1.25, 1.32, 1.35 Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie Cpu(s): 5.9%us, 3.4%sy, 0.0%ni, 90.4%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st Mem: 32949016k total, 14411180k used, 18537836k free, 169884k buffers Swap: 32764556k total, 0k used, 32764556k free, 3612636k cached</p>< p>PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND  28894 root 22 0 1501m 405m 10m S 52.2 1.3 2534:16 java  18249 root 18 0 3201m 1.9g 11m S 35.9 6.0 569:39.41 java  2808 root 25 0 3333m 1.0g 11m S 24.3 3.1 526:51.85 java  25668 root 23 0 3180m 704m 11m S 14.0 2.2 360:44.53 java  574 root 25 0 3168m 611m 10m S 12.6 1.9 556:59.63 java  1599 root 20 0 3237m 1.9g 11m S 12.3 6.2 262:01.14 java  1008 root 21 0 3147m 842m 10m S 0.3 2.6 4:31.08 java  13823 root 23 0 3031m 2.1g 10m S 0.3 6.8 176:57.34 java  28218 root 15 0 12760 1168 808 R 0.3 0.0 0:01.43 top  29062 root 20 0 1241m 227m 10m S 0.3 0.7 2:07.32 java  1 root 15 0 10368 684 572 S 0.0 0.0 1:30.85 init  2 root RT -5 0 0 0 S 0.0 0.0 0:01.01 migration/0  3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0  4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0  5 root RT -5 0 0 0 S 0.0 0.0 0:00.80 migration/1  6 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1  7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1  8 root RT -5 0 0 0 S 0.0 0.0 0:20.59 migration/2  9 root 34 19 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/2  10 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/2  11 root RT -5 0 0 0 S 0.0 0.0 0:23.66 migration/3  12 root 34 19 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/3  13 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/3  14 root RT -5 0 0 0 S 0.0 0.0 0:20.29 migration/4  15 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/4  16 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/4  17 root RT -5 0 0 0 S 0.0 0.0 0:23.07 migration/5  18 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/5  19 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/5  20 root RT -5 0 0 0 S 0.0 0.0 0:17.16 migration/6  21 root 34 19 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/6  22 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/6  23 root RT -5 0 0 0 S 0.0 0.0 0:58.28 migration/7

top命令輸出內容詳細說明:

統計資訊區:

前五行是當前系統情況整體的統計資訊區。下面我們看每一行資訊的具體意義。

第一行,任務佇列資訊,同 uptime 命令的執行結果,具體引數說明情況如下:

14:06:23 — 當前系統時間

up 70 days, 16:44 — 系統已經運行了70天16小時44分鐘(在這期間系統沒有重啟過的吆!)

2 users — 當前有2個使用者登入系統

load average: 1.15, 1.42, 1.44 — load average後面的三個數分別是1分鐘、5分鐘、15分鐘的負載情況。

load average資料是每隔5秒鐘檢查一次活躍的程序數,然後按特定演算法計算出的數值。如果這個數除以邏輯CPU的數量,結果高於5的時候就表明系統在超負荷運轉了。

第二行,Tasks — 任務(程序),具體資訊說明如下:

系統現在共有206個程序,其中處於執行中的有1個,205個在休眠(sleep),stoped狀態的有0個,zombie狀態(殭屍)的有0個。

第三行,cpu狀態資訊,具體屬性說明如下:

5.9%us — 使用者空間佔用CPU的百分比。

3.4% sy — 核心空間佔用CPU的百分比。

0.0% ni — 改變過優先順序的程序佔用CPU的百分比

90.4% id — 空閒CPU百分比

0.0% wa — IO等待佔用CPU的百分比

0.0% hi — 硬中斷(Hardware IRQ)佔用CPU的百分比

0.2% si — 軟中斷(Software Interrupts)佔用CPU的百分比

備註:在這裡CPU的使用比率和windows概念不同,需要理解linux系統使用者空間和核心空間的相關知識!

第四行,記憶體狀態,具體資訊如下:

32949016k total — 實體記憶體總量(32GB)

14411180k used — 使用中的記憶體總量(14GB)

18537836k free — 空閒記憶體總量(18GB)

169884k buffers — 快取的記憶體量 (169M)

第五行,swap交換分割槽資訊,具體資訊說明如下:

32764556k total — 交換區總量(32GB)

0k used — 使用的交換區總量(0K)

32764556k free — 空閒交換區總量(32GB)

3612636k cached — 緩衝的交換區總量(3.6GB)

備註:

第四行中使用中的記憶體總量(used)指的是現在系統核心控制的記憶體數,空閒記憶體總量(free)是核心還未納入其管控範圍的數量。納入核心管理的記憶體不見得都在使用中,還包括過去使用過的現在可以被重複利用的記憶體,核心並不把這些可被重新使用的記憶體交還到free中去,因此在linux上free記憶體會越來越少,但不用為此擔心。

如果出於習慣去計算可用記憶體數,這裡有個近似的計算公式:第四行的free + 第四行的buffers + 第五行的cached,按這個公式此臺伺服器的可用記憶體:18537836k +169884k +3612636k = 22GB左右。

對於記憶體監控,在top裡我們要時刻監控第五行swap交換分割槽的used,如果這個數值在不斷的變化,說明核心在不斷進行記憶體和swap的資料交換,這是真正的記憶體不夠用了。

第六行,空行。

第七行以下:各程序(任務)的狀態監控,專案列資訊說明如下:

PID — 程序id

USER — 程序所有者

PR — 程序優先順序

NI — nice值。負值表示高優先順序,正值表示低優先順序

VIRT — 程序使用的虛擬記憶體總量,單位kb。VIRT=SWAP+RES

RES — 程序使用的、未被換出的實體記憶體大小,單位kb。RES=CODE+DATA

SHR — 共享記憶體大小,單位kb

S — 程序狀態。D=不可中斷的睡眠狀態 R=執行 S=睡眠 T=跟蹤/停止 Z=殭屍程序

%CPU — 上次更新到現在的CPU時間佔用百分比

%MEM — 程序使用的實體記憶體百分比

TIME+ — 程序使用的CPU時間總計,單位1/100秒

COMMAND — 程序名稱(命令名/命令列)

概念詳解: load average: 可以理解為每秒鐘CPU等待執行的程序個數. 在Linux系統中,sar -q、uptime、w、top等命令都會有系統平均負載load average的輸出,那麼什麼是系統平均負載呢? 系統平均負載被定義為在特定時間間隔內執行佇列中的平均任務數。如果一個程序滿足以下條件則其就會位於執行佇列中: - 它沒有在等待I/O操作的結果 - 它沒有主動進入等待狀態(也就是沒有呼叫’wait’) - 沒有被停止(例如:等待終止)

3.vmstat

procs ———–memory———- —swap– —–io—- -system– —–cpu—— r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 1  1 1385712  66752 112164 1429992  3    4    14    50   14    2 10  2 88  1  0 1  0 1385712  64540 112208 1430976  0    0     3   104 2599 6595 15  2 81  3  0 0  0 1385712  62084 112232 1433008  0    0     1  1276 2068 7772 18  1 77  4  0 0  0 1385712  60808 112232 1434036  0    0     1    29  730 3686  9  1 90  1  0

引數詳解: r:當前系統中等待CPU的程序數(所有的CPU),若是改值連續都大於CPU的個數,表明有多數程序在等待CPU進行處理。若是該值大於CPU個數4倍的話,那麼表明該伺服器缺少CPU,或者CPU的處理速度過慢

in :cpu每秒產生的中斷數 cs :每秒產生的上下文切換

us:使用者佔用的CPU時間百分比,同mpstat 的%user,說明使用者程序消耗的CPU時間多,但是如果長期超50%的使用,那麼我們就該考慮優化程式演算法或者進行加速(比如PHP/PERL) sy:系統佔用的CPU時間百分比,同mpstat 的%sys。核心程序消耗的CPU時間百分比(sy的值高時,說明系統核心消耗的CPU資源多,這並不是良性表現,我們應該檢查原因) id:CPU處於空閒狀態時間百分比,如果空閒時間(cpu id)持續為0並且系統時間(cpu sy)是使用者時間的兩倍(cpu us) 系統則面臨著CPU資源的短缺. wa:IO等待消耗的CPU時間百分比,wa的值高時,說明IO等待比較嚴重,這可能由於磁碟大量作隨機訪問造成,也有可能磁碟出現瓶頸(塊操作)。

us+sy+id = 100%

常見用法:vmstat -n 3 //每三秒獲取一次資料vmstat 4 5  //間隔4次輸出5次資料

概念詳解: 上下文切換:CPU的切換就是將輪到該時間片的程序,將該程序中的資料從內容中刷到CPU的暫存器中,同時將原暫存器中的資料刷到記憶體中儲存。  

4.sarsar [options] [-A] [-o file] t [n] t 和 n兩個引數指定了取樣間隔和取樣次數 - o 較日誌記錄到某個檔案中sar 5 6 //每5秒採用一次,共取樣6次。

Linux 2.6.18-53.el5PAE (localhost.localdomain)  03/28/2009 07:40:17 PM       CPU     %user     %nice   %system   %iowait    %steal     %idle 07:40:19 PM       all     12.44      0.00    6.97       1.74      0.00       78.86 07:40:21 PM       all     26.75      0.00    12.50      16.00     0.00       44.75 07:40:23 PM       all     16.96      0.00    7.98       0.00      0.00       75.06

引數詳解: 大部分的引數同mpstat top等命令。

%idle :等同於vmstat 中的id .就是空閒CPU百分比.如果該值高,表明CPU較空閒,但是處理速度還是很慢,則表明CPU在等待記憶體分配,應該加大伺服器的記憶體。若是該值持續低於10%,表明CPU處理能力較弱,需要增加CPU。 %steal:管理程式維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。  

5.iostat 主要是為了檢視磁碟IO

Linux 2.6.16.46-0.12-smp (iread-85)     03/29/2010

avg-cpu:  %user   %nice %system %iowait  %steal   %idle 9.47    0.00    1.59    1.27    0.00   86.67

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn sda              15.46       114.45       401.22   44378459  155576936

引數詳解: avg-cpu中引數不做過多解釋,詳細可見其他命令,類似。

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系統已經滿負荷,該磁碟 可能存在瓶頸。 idle小於70% IO壓力就較大了,一般讀取速度有較多的wait. 同時可以結合vmstat 檢視檢視b引數(等待資源的程序數)和wa引數(IO等待所佔用的CPU時間的百分比,高過30%時IO壓力高)

# iostat -x 1 avg-cpu: %user %nice %sys %idle 16.24 0.00 4.31 79.44 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util /dev/cciss/c0d0 0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29 /dev/cciss/c0d0p1 0.00 44.90 1.02 27.55 8.16 579.59 4.08 289.80 20.57 22.35 78.21 5.00 14.29 /dev/cciss/c0d0p2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

上面的 iostat 輸出表明秒有 28.57 次裝置 I/O 操作: 總IO(io)/s = r/s(讀) +w/s(寫) = 1.02+27.55 = 28.57 (次/秒) 其中寫操作佔了主體 (w:r = 27:1)。

平均每次裝置 I/O 操作只需要 5ms 就可以完成,但每個 I/O 請求卻需要等上 78ms,為什麼? 因為發出的 I/O 請求太多 (每秒鐘約 29 個),假設這些請求是同時發出的,那麼平均等待時間可以這樣計算:

平均等待時間 = 單個 I/O 服務時間 * ( 1 + 2 + … + 請求總數-1) / 請求總數

應用到上面的例子: 平均等待時間 = 5ms * (1+2+…+28)/29 = 70ms,和 iostat 給出的78ms 的平均等待時間很接近。這反過來表明 I/O 是同時發起的。

每秒發出的 I/O 請求很多 (約 29 個),平均佇列卻不長 (只有 2 個 左右),這表明這 29 個請求的到來並不均勻,大部分時間 I/O 是空閒的。

一秒中有 14.29% 的時間 I/O 佇列中是有請求的,也就是說,85.71% 的時間裡 I/O 系統無事可做,所有 29 個 I/O 請求都在142毫秒之內處理掉了。

delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s =78.21 * delta(io)/s = 78.21*28.57 = 2232.8,表明每秒內的I/O請求總共需要等待2232.8ms。所以平均佇列長度應為 2232.8ms/1000ms = 2.23,而 iostat 給出的平均佇列長度 (avgqu-sz) 卻為 22.35,為什麼?! 因為 iostat 中有 bug,avgqu-sz 值應為 2.23,而不是 22.35。