linux系统性能优化及瓶颈分析
[root@localhost ~]# vmstat -n 3 ? ? ? (每一個3秒刷新一次)
procs-----------memory--------------------swap--- ---io---- --system---- ------cpu--------
r ? b ? ?swpd ? free ? ? ? buff ? ? ? cache ? ? ? si ? so ? bi ? ?bo ? in ? ? ?cs ? ? ? ?us ? sy ? id ? wa
1 ?0 ? 144 186164 105252 2386848 ? ? 0 ? ?0 ? ?18 ? 166 ?83 ? ? 2 ? ? ? ? ?48 ? 21 ?31 ? 0
2 ?0 ? 144 189620 105252 2386848 ? ? 0 ? ?0 ? ? 0 ? 177 ?1039 1210 ? 34 ? 10 ?56 ? ?0
0 ?0 ? 144 214324 105252 2386848 ? ? 0 ? ?0 ? ? 0 ? ?10 ? 1071 ? 670 ? ?32 ? 5 ? ?63 ? ?0
0 ?0 ? 144 202212 105252 2386848 ? ? 0 ? ?0 ? ? 0 ? 189 ? 1035 ? 558 ? 20 ? 3 ? ?77 ? ?0
2 ?0 ? 144 158772 105252 2386848 ? ? 0 ? ?0 ? ? 0 ? 203 ?1065 2832 ? ?70 ?14 ?15 ? ?0
IO
-bi:從塊設備讀入的數據總量(讀磁盤)(KB/S)
-bo:寫入到塊設備的數據總量(寫磁盤)(KB/S)
隨機磁盤讀寫的時候。這2個值越大(如超出1M),能看到CPU在IO等待的值也會越大
二,用iostat分析I/O子系統情況
? ? 假設你的系統沒有iostat,sar,mpstat等命令,安裝sysstat- 7.0.2-1.el5.i386.rpm包,iostat工具將對系統的磁盤操作活動進行監視。它的特點是匯報磁盤活動統計情況。同一時候也會匯報出CPU 使用情況。同vmstat一樣,iostat也有一個弱點,就是它不能對某個進程進行深入分析。僅對系統的總體情況進行分析。
iostat的語法例如以下:
程序代碼
iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ] ]
-c為匯報CPU的使用情況;
-d為匯報磁盤的使用情況;
-k表示每秒按kilobytes字節顯示數據;
-t為打印匯報的時間;
-v表示打印出版本號信息和使用方法;
-x device指定要統計的設備名稱。默覺得全部的設備;
interval指每次統計間隔的時間;
count指依照這個時間間隔統計的次數。
iostat在內核2.4和內核2.6中數據來源不太一樣,對于kernel 2.4, iostat 的數據的主要來源是 /proc/partitions;在2.6中,數據來源主要是/proc/diskstats和/sys/block/sd*/stat這兩個文件
#cat /proc/diskstats | grep sda
? 8 ? ? 0 ?sda ? 17945521 ?1547188 ? ?466667211 ?174042714 ? 15853874 42776252 ? 469241932 ?2406054445 ?0 ?137655809 ? 2580960422
? ?8 ? ?1 ? sda1 ?936 ? ? ? ? ? 1876 ? ? ? ? ?6 ? ? ? ? ? ? ? ?12
? ?8 ? ?2 ? sda2 ?19489178 ?466659986 58655070 ? ?469240224
? ?8 ? ?3 ? sda3 ?1270 ? ? ? ? 1441 ? ? ? ? ?33 ? ? ? ? ? ? ? 264
? ?8 ? ?4 ? sda4 ?4 ? ? ? ? ? ? ? 8 ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? 0
? ?8 ? ?5 ? sda5 ?648 ? ? ? ? ? 1442 ? ? ? ? ?0 ? ? ? ? ? ? ? ? 0
? ?8 ? ?6 ? sda6 ?648 ? ? ? ? ? 1442 ? ? ? ? ?0 ? ? ? ? ? ? ? ? 0
第1列 : 磁盤主設備號(major)
第2列 : 磁盤次設備號(minor)
第3列 : 磁盤的設備名(name)
第4列 : 讀請求總數(rio)
第5列 : 合并的讀請求總數(rmerge)
第6列 : 讀扇區總數(rsect)
第7列 : ? 讀數據花費的時間。單位是ms.(從__make_request到 end_that_request_last)(ruse)
第8列 : ? 寫請求總數(wio)
第9列 : ? 合并的寫請求總數(wmerge)
第10列 : 寫扇區總數(wsect)
第11列 : 寫數據花費的時間,單位是ms. (從__make_request到 end_that_request_last)(wuse)
第12列 : 如今正在進行的I/O數(running),等于I/O隊列中請求數
第13列 : 系統真正花費在I/O上的時間,除去反復等待時間(aveq)
第14列 : 系統在I/O上花費的時間(use)。
#iostat -x 1
Linux 2.6.18-53.el5PAE (localhost.localdomain) ?03/27/2009
avg-cpu: ?%user ? %nice %system %iowait ?%steal ? %idle
? ? ? ? ? 30.72 ? ?0.00 ? ?5.00 ? ?5.72 ? ?0.00 ? 58.56
Device: ? rrqm/s ? wrqm/s ? ?r/s ? ?w/s ? ? rsec/s ? wsec/s ? avgrq-sz avgqu-sz ? await ? ?svctm ? ?%util
sda ? ? ? ? 0.79 ? ? ? 21.81 ? ? 9.15 ? 8.08 ? 237.99 ? 239.29 ? ?27.69 ? ? ? 1.32 ? ? ? ? 76.31 ? ?4.07 ? ? ?7.02
sdb ? ? ? ? 0.69 ? ? ?19.13 ? ? ?3.26 ? 2.99 ? 153.08 ? 176.92 ? ?52.85 ? ? ? 0.43 ? ? ? ? 68.80 ? ?5.96 ? ? ?3.72
sdc ? ? ? ? 3.47 ? ? ? 89.30 ? ? 10.95 ?7.30 ? 213.30 ? 772.94 ? ?54.04 ? ? ? 1.32 ? ? ? ? 72.43 ? ?4.18 ? ? ?7.63
每項數據的含義例如以下,
rrqm/s: ? ? 每秒進行 merge 的讀操作數目。即 rmerge/s
wrqm/s: ? ? 每秒進行 merge 的寫操作數目。即 wmerge/s
r/s: ? ? ? 每秒完畢的讀 I/O 設備次數。
即 rio/s
w/s: ? ? ? 每秒完畢的寫 I/O 設備次數。即 wio/s
rsec/s: ? ? 每秒讀扇區數。即 rsect/s
wsec/s: ? ? 每秒寫扇區數。即 wsect/s
rkB/s: ? ? 每秒讀K字節數。
是 rsect/s 的一半。由于每扇區大小為512字節。
wkB/s: ? ? 每秒寫K字節數。是 wsect/s 的一半。
avgrq-sz: ? 平均每次設備I/O操作的數據大小 (扇區)。
即 (rsect+wsect)/(rio+wio)
avgqu-sz: ? 平均I/O隊列長度。
即 aveq/1000 (由于aveq的單位為毫秒)。
await: ? ? 平均每次設備I/O操作的等待時間 (毫秒)。即 (ruse+wuse)/(rio+wio)
svctm: ? ? 平均每次設備I/O操作的服務時間 (毫秒)。即 use/(rio+wio)
%util: ? ? 一秒中有百分之多少的時間用于 I/O 操作,或者說一秒中有多少時間
I/O隊列是非空的,即use/1000 (由于use的單位為毫秒),
假設 %util 接近 100%。說明產生的I/O請求太多,I/O系統已經滿負荷。該磁盤可能存在瓶頸。
svctm 一般要小于 await (由于同一時候等待的請求的等待時間被反復計算了),
svctm 的大小一般和磁盤性能有關,CPU/內存的負荷也會對其有影響,請求過多也會間接導致 svctm 的添加。
await 的大小一般取決于服務時間(svctm) 以及 I/O 隊列的長度和 I/O 請求的發出模式。假設 svctm 比較接近 await。說明 I/O 差點兒沒有等待時間。假設 await 遠大于 svctm,說明 I/O 隊列太長,應用得到的響應時間變慢,假設響應時間超過了用戶能夠容許的范圍。這時能夠考慮更換更快的磁盤,調整內核 elevator 算法,優化應用。或者升級 CPU。
? ?隊列長度(avgqu-sz)也可作為衡量系統 I/O 負荷的指標。但因為 avgqu-sz 是依照單位時間的平均值,所以不能反映瞬間的 I/O 洪水。
io/s = r/s +w/s
await=(ruse+wuse)/io(每一個請求的等待時間)
await*io/s=每秒內的I/O請求總共須要等待的ms
avgqu-sz=await*(r/s+w/s)/1000(隊列長度)
下面數據事實上與/proc/diskstats中除設備號與設備名外的其他數據是一一相應關系,僅僅是統計的方法略有區別而已。
#cat /sys/block/sda/stat
17949157 ?1547772 466744707 174070520 15855905 42781288 469298468 2406092114 ? ? ? ?2 137680700 2581025934
三。sar -b 監控I/O
#sar -b 1 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) ?03/29/2009
12:19:40 AM ? ? ? tps ? ? ?rtps ? ? ? wtps ? ? ?bread/s ? ?bwrtn/s
12:19:42 AM ? ? 21.48 ? ? ?9.40 ? ? 12.08 ? ?187.92 ? ?429.53
12:19:43 AM ? ? 14.00 ? ? 14.00 ? ? ?0.00 ? ?840.00 ? ? ?0.00
12:19:44 AM ? ? 10.29 ? ? ?8.82 ? ? ?1.47 ? ?235.29 ? ?217.65
12:19:45 AM ? ? 12.87 ? ? 10.89 ? ? ?1.98 ? ?752.48 ? ?142.57
12:19:46 AM ? ? 19.82 ? ? 12.61 ? ? ?7.21 ? ?425.23 ? ?381.98
12:19:47 AM ? ? 19.00 ? ? 19.00 ? ? ?0.00 ? ?512.00 ? ? ?0.00
12:19:49 AM ? ? ?9.29 ? ? ?9.29 ? ? ?0.00 ? ?262.86 ? ? ?0.00
12:19:50 AM ? ? 16.00 ? ? ?5.00 ? ? 11.00 ? ?144.00 ? ?536.00
12:19:51 AM ? ? 17.65 ? ? ?8.82 ? ? ?8.82 ? ?211.76 ? ?235.29
12:19:52 AM ? ? 41.41 ? ? 29.29 ? ? 12.12 ? ?614.14 ? ?363.64
Average: ? ? ? ? ? 17.75 ? ? 12.30 ? ? ?5.45 ? ?397.19 ? ?231.99
-tps:每秒鐘對磁盤發送transfer的總數。一個transfer就是一個I/O,多個邏輯請求組合成一個對磁盤的I/O請求。一個transfer的大小不確定。
-rtps:每秒鐘的物理讀的總數
-wtps:每秒鐘的物理寫的總數
-bread/s:每秒鐘從磁盤讀取的數據總數
-bwrtn/s:每秒鐘寫入磁盤的數據的總數
四,sar -d 1 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) ?03/29/2009
12:38:56 AM ? ? ? DEV ? ? ? tps ?rd_sec/s ?wr_sec/s ?avgrq-sz ?avgqu-sz ? ? await ? ? svctm ? ? %util
12:38:57 AM ? ? dev8-0 ? ? 15.00 ? ?232.00 ? ? ?0.00 ? ? 15.47 ? ? ?0.01 ? ? ? ? ? ? 0.87 ? ? ?0.87 ? ? ?1.30
12:38:57 AM ? dev8-16 ? ? ?6.00 ? ? 80.00 ? ?320.00 ? ? 66.67 ? ? ?0.05 ? ? ? ? ? ? 8.67 ? ? ?8.67 ? ? ?5.20
12:38:57 AM ? dev8-32 ? ? 10.00 ? ?224.00 ? ? ?0.00 ? ? 22.40 ? ? ?0.09 ? ? ? ? ? ? 9.20 ? ? ?9.20 ? ? ?9.20
? ? ? ? ? ? ? tps:每秒鐘對磁盤發送transfer的總數。一個transfer就是一個I/O,多個邏輯請求組合成一個對磁盤的I/O請求,一個transfer的大小不確定
? ? ? ? ? ? ? rd_sec/s
? ? ? ? ? ? ? ? ? ? ?每秒鐘讀取的扇區數,每一個扇區512 bytes.
? ? ? ? ? ? ? wr_sec/s
? ? ? ? ? ? ? ? ? ? ?每秒鐘寫入的扇區數,每一個扇區512 bytes.
? ? ? ? ? ? ? avgrq-sz
? ? ? ? ? ? ? ? ? ? ?對磁盤請求的扇區的平均大小。
? ? ? ? ? ? ? avgqu-sz
? ? ? ? ? ? ? ? ? ? ?對磁盤請求的平均隊列長度.
? ? ? ? ? ? ? await
? ? ? ? ? ? ? ? ? ? ?請求響應的平均時間(毫秒).包含在請求隊列中的時間和響應消耗時間
? ? ? ? ? ? ? svctm
? ? ? ? ? ? ? ? ? ? ?對IO請求的服務時間.
? ? ? ? ? ? ? %util
? ? ? ? ? ? ? ? ? ? ?I/O請求占用的CPU時間百分比。
Linux命令----分析內存的瓶頸
為了提高磁盤存取效率, Linux做了一些精心的設計, 除了對dentry進行緩存(用于VFS,加速文件路徑名到inode的轉換), 還採取了兩種主要Cache方式:Buffer Cache和Page Cache.前者針對磁盤塊的讀寫,后者針對文件inode的讀寫.這些Cache有效縮短了I/O系統調用(比方 read,write,getdents)的時間.
? ? ? ? 內存活動基本上能夠用3個數字來量化:活動虛擬內存總量,交換(swapping)率和調頁(paging)率.當中第一個數字表明內存的總需求 量,后兩個數字表示那些內存中有多少比例正處在使用之中.目標是降低內存活動或添加內存量,直到調頁率保持在一個能夠接受的水平上為止.
? ? ? ? 活動虛擬內存的總量(VM)=實際內存大小(size of real memory)(物理內存)+使用的交換空間大小(amount of swap space used)
? ? ? ? 當程序執行須要的內存大于物理內存時,UNIX系統採用了調頁機制。即系統copy一些內存中的頁面到磁盤上,騰出來空間供進程使用。
大多數系統能夠忍受偶爾的調頁,可是頻繁的調頁會使系統性能急劇下降。
UNIX內存管理:UNIX系統通過2種方法進行內存管理,“調頁算法”,“交換技術”。
調頁算法是將內存中近期不常使用的頁面換到磁盤上,把常使用的頁面(活動頁面)保留在內存中供進程使用。
交換技術是系統將整個進程。而不是部分頁面,所有換到磁盤上。
正常情況下,系統會發生一些交換過程。
當內存嚴重不足時。系統會頻繁使用調頁和交換,這添加了磁盤I/O的負載。進一步減少了系統對作業的運行速度,即系統I/O資源問題又會影響到內存資源的分配。
Unix的虛擬內存
Unix的虛擬內存是一個十分復雜的子系統。它實現了進程間代碼與數據共享機制的透明性,并可以分配比系統現有物理內存很多其它的內存,某些操作系統的虛存甚至能通過提供緩存功能影響到文件系統的性能。各種風格的UNIX的虛存的實現方式差別非常大,但都離不開以下的4個概念。
1:實際內存
實際內存是指一個系統中實際存在的物理內存,稱為RAM。
實際內存是存儲暫時數據最快最有效的方式,因此必須盡可能地分配給應用程序。如今的RAM的形式有多種:SIMM、DIMM、Rambus、DDR等,非常多RAM都能夠使用糾錯機制(ECC)。
2:交換空間
交換空間是專門用于暫時存儲內存的一塊磁盤空間,通常在頁面調度和交換進程數據時使用,通常推薦交換空間的大小應該是物理內存的二到四倍。
3:頁面調度
頁面調度是指從磁盤向內存數據傳輸。以及相反的過程,這個過程之所以被稱為頁面調度,是由于Unix內存被平均劃分成大小相等的頁面。通常頁面大小為 4KB和8KB(在Solaris中能夠用pagesize命令查看)。當可執行程序開始執行時,它的映象會一頁一頁地從磁盤中換入,與此類似。當某些內 存在一段時間內空暇,就能夠把它們換出到交換空間中,這樣就能夠把空暇的RAM交給其它須要它的程序使用。
4:交換
頁面調度通常easy和交換的概念混淆。頁面調度是指把一個進程所占內存的空暇部分傳輸到磁盤上,而交換是指當系統中實際的內存已不夠滿足新的分配需求時。把整個進程傳輸到磁盤上。交換活動通常意味著內存不足。
[root@localhost ~]# vmstat -n 3 ? ? ? (每一個3秒刷新一次)
procs-----------memory--------------------swap------io---- --system---- ------cpu--------
r ? b ? ?swpd ? free ? ? ? buff ? ? ? cache ? ? ? si ? so ? ?bi ? ?bo ? in ? ? ?cs ? ? ? ?us ? sy ? id ? wa
1 ?0 ? 144 186164 105252 2386848 ? ?0 ? ?0 ? ? 18 ? 166 ?83 ? ? 2 ? ? ? ? ?48 ? 21 ?31 ?0
2 ?0 ? 144 189620 105252 2386848 ? ?0 ? ?0 ? ? ?0 ? 177 ?1039 1210 ? 34 ? 10 ?56 ? 0
0 ?0 ? 144 214324 105252 2386848 ? ?0 ? ?0 ? ? ?0 ? ?10 ? 1071 ? 670 ? ?32 ? 5 ? ?63 ? 0
0 ?0 ? 144 202212 105252 2386848 ? ?0 ? ?0 ? ? ?0 ? 189 ? 1035 ? 558 ? 20 ? 3 ? ?77 ? 0
2 ?0 ? 144 158772 105252 2386848 ? ?0 ? ?0 ? ? ?0 ? 203 ?1065 2832 ? ?70 ?14 ?15 ? 0
MEMORY
-swap:切換到交換內存上的內存(默認以KB為單位)
假設SWAP的值不為0?;蛘哌€比較大。比方超過100M了,可是SI,SO的值長期為0,這樣的情況我們能夠不用操心,不會影響系統性能。-free:空暇的物理內存
- buff:作為buffer cache的內存,對塊設備的讀寫進行緩沖
-cache:作為page cache的內存,文件系統的cache
假設cache的值大的時候。說明cache處的文件數多,假設頻繁訪問到的文件都能被cache處。那么磁盤的讀IO bi會很小。
SWAP
-si:交換內存使用,由磁盤調入內存
-so:交換內存使用,由內存調入磁盤
內存夠用的時候,這2個值都是0,假設這2個值長期大于0時,系統性能會受到影響。磁盤IO和CPU資源都會被消耗。
我發現有些朋友看到空暇內存(FREE)非常少的或接近于0時,就覺得內存不夠用了,實際上不能光看這一點,Linux是搶占內存式的OS。還要結合si,so,假設free非常少,可是si,so也非常少(大多時候是0),那么不用操心,系統性能這時不會受到影響的。
Linux命令----分析CPU的瓶頸
衡量CPU性能的指標:1,用戶使用CPU的情況;
CPU執行常規用戶進程
CPU執行niced process
CPU執行實時進程
2。系統使用CPU情況;
用于I/O管理:中斷和驅動
用于內存管理:頁面交換
用戶進程管理:進程開始和上下文切換
3。WIO:用于進程等待磁盤I/O而使CPU處于空暇狀態的比率。
4,CPU的空暇率,除了上面的WIO以外的空暇時間
5。CPU用于上下文交換的比率
6。nice
7,real-time
8,執行進程隊列的長度
9,平均負載
Linux中經常使用的監控CPU總體性能的工具有:
? mpstat: mpstat 不但能查看全部CPU的平均信息,還能查看指定CPU的信息。
?
vmstat:僅僅能查看全部CPU的平均信息。查看cpu隊列信息;
? iostat: 僅僅能查看全部CPU的平均信息。
? sar: 與mpstat 一樣,不但能查看CPU的平均信息,還能查看指定CPU的信息。
? top:顯示的信息同ps接近。可是top能夠了解到CPU消耗。能夠依據用戶指定的時間來更新顯示。
以下一一介紹:
一,vmstat
[root@localhost ~]#vmstat -n 3 ? ? ? (每一個3秒刷新一次)
procs-----------memory--------------------swap-- ----io---- --system---- ------cpu--------
r b ? swpd ? free ? ? ? buff ? ? ? cache ? ? ? si ? so ? ?bi ? ?bo ? in ? ? ?cs ? ? ? ?us ? sy ? id ?wa
10 ? ?144 186164 105252 2386848 ? ?0 ? ?0 ? ? 18 ? 166 ?83 ? ? 2 ? ? ? ? ?48 ? 21 ?31 ?0
20 ? ?144 189620 105252 2386848 ? ?0 ? ?0 ? ? ?0 ? 177 ?1039 1210 ? 34 ? 10 ?56 ?0
00 ? ?144 214324 105252 2386848 ? ?0 ? ?0 ? ? ?0 ? ?10 ? 1071 ? 670 ? ?32 ? 5 ? ?63 ?0
00 ? ?144 202212 105252 2386848 ? ?0 ? ?0 ? ? ?0 ? 189 ? 1035 ? 558 ? ?20 ? 3 ? ?77 ?0
20 ? ?144 158772 105252 2386848 ? ?0 ? ?0 ? ? ?0 ? 203 ?1065 2832 ? ?70 ?14 ?15 ?0
紅色內容標示CPU相關的參數PROC(ESSES)
--r:假設在processes中執行的序列(process r)是連續的大于在系統中的CPU的個數表示系統如今執行比較慢,有多數的進程等待CPU.
假設r的輸出數大于系統中可用CPU個數的4倍的話,則系統面臨著CPU短缺的問題,或者是CPU的速率過低,系統中有多數的進程在等待CPU,造成系統中進程執行過慢.
SYSTEM
--in:每秒產生的中斷次數
--cs:每秒產生的上下文切換次數
上面2個值越大,會看到由內核消耗的CPU時間會越大
CPU
-us:用戶進程消耗的CPU時間百分
us的值比較高時,說明用戶進程消耗的CPU時間多,可是假設長期超50%的使用。那么我們就該考慮優化程序算法或者進行加速(比方PHP/PERL)
-sy:內核進程消耗的CPU時間百分比(sy的值高時,說明系統內核消耗的CPU資源多,這并非良性表現,我們應該檢查原因)
-wa:IO等待消耗的CPU時間百分比
wa的值高時。說明IO等待比較嚴重,這可能因為磁盤大量作隨機訪問造成,也有可能磁盤出現瓶頸(塊操作)。
-id:CPU處于空暇狀態時間百分比,假設空暇時間(cpu id)持續為0而且系統時間(cpu sy)是用戶時間的兩倍(cpu us) 系統則面臨著CPU資源的短缺.
解決的方法:
當發生以上問題的時候請先調整應用程序對CPU的占用情況.使得應用程序能夠更有效的使用CPU.同一時候能夠考慮添加很多其它的CPU. ?關于CPU的使用情 況還能夠結合mpstat, ?ps aux top ?prstat ?a等等一些對應的命令來綜合考慮關于詳細的CPU的使用情況,和那些進程在占用大量的CPU時間.普通情況下,應用程序的問題會比較大一些.比方一些 SQL語句不合理等等都會造成這種現象.
二,sar
sar [options] [-A] [-o file] t [n]
在命令行中。n 和t 兩個參數組合起來定義採樣間隔和次數,t為採樣間隔,是必須有
的參數,n為採樣次數。是可選的,默認值是1。-o file表示將命令結果以二進制格式
存放在文件里,file 在此處不是keyword,是文件名稱。options 為命令行選項,sar命令
的選項非常多,以下僅僅列出經常使用選項:
-A:全部報告的總和。
-u:CPU利用率
-v:進程、I節點、文件和鎖表狀態。
-d:硬盤使用報告。
-r:內存和交換空間的使用統計。
-g:串口I/O的情況。
-b:緩沖區使用情況。
-a:文件讀寫情況。
-c:系統調用情況。
-q:報告隊列長度和系統平均負載
-R:進程的活動情況。
-y:終端設備活動情況。
-w:系統交換活動。
-x { pid | SELF | ALL }:報告指定進程ID的統計信息,SELFkeyword是sar進程本身的統計,ALLkeyword是全部系統進程的統計。
用sar進行CPU利用率的分析
#sar -u 2 10
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
07:40:25 PM ? ? ? all ? ? ? ? 22.50 ? ? ?0.00 ? ? ? ? 7.00 ? ? ? ? ?3.25 ? ? ? ? 0.00 ? ? ? ?67.25
07:40:27 PM ? ? ? all ? ? ? ? 7.25 ? ? ? ?0.00 ? ? ? ? 2.75 ? ? ? ? ?2.50 ? ? ? ? 0.00 ? ? ? ?87.50
07:40:29 PM ? ? ? all ? ? ? ? 20.05 ? ? ?0.00 ? ? ? ? 8.56 ? ? ? ? ?2.93 ? ? ? ? 0.00 ? ? ? ?68.46
07:40:31 PM ? ? ? all ? ? ? ? 13.97 ? ? ?0.00 ? ? ? ? 6.23 ? ? ? ? ?3.49 ? ? ? ? 0.00 ? ? ? ?76.31
07:40:33 PM ? ? ? all ? ? ? ? 8.25 ? ? ? ?0.00 ? ? ? ? 0.75 ? ? ? ? ?3.50 ? ? ? ? 0.00 ? ? ? ?87.50
07:40:35 PM ? ? ? all ? ? ? ? 13.25 ? ? ?0.00 ? ? ? ? 5.75 ? ? ? ? ?4.00 ? ? ? ? 0.00 ? ? ? ?77.00
07:40:37 PM ? ? ? all ? ? ? ? 10.03 ? ? ?0.00 ? ? ? ? 0.50 ? ? ? ? ?2.51 ? ? ? ? 0.00 ? ? ? ?86.97
Average: ? ? ? ? ? ? all ? ? ? ? 15.15 ? ? ?0.00 ? ? ? ? 5.91 ? ? ? ? ?3.99 ? ? ? ? 0.00 ? ? ? ?74.95
在顯示內容包含:
%user:CPU處在用戶模式下的時間百分比。
? ? ? ? %nice:CPU處在帶NICE值的用戶模式下的時間百分比。
%system:CPU處在系統模式下的時間百分比。
%iowait:CPU等待輸入輸出完畢時間的百分比。
? ? ? ? %steal:管理程序維護還有一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。
%idle:CPU空暇時間百分比。
? ? ? ? 在全部的顯示中,我們應主要注意%iowait和%idle,%iowait的值過高,表示硬盤存在I/O瓶頸。%idle值高。表示CPU較空 閑,假設%idle值高但系統響應慢時,有可能是CPU等待分配內存,此時應加大內存容量。
%idle值假設持續低于10,那么系統的CPU處理能力相對 較低。表明系統中最須要解決的資源是CPU。
用sar進行執行進程隊列長度分析:
#sar -q 2 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) ?03/28/2009
07:58:14 PM ? runq-sz ?plist-sz ? ldavg-1 ? ldavg-5 ?ldavg-15
07:58:16 PM ? ? ? ? 0 ? ? ? ? 493 ? ? ? ? ?0.64 ? ? ? ?0.56 ? ? ? ?0.49
07:58:18 PM ? ? ? ? 1 ? ? ? ? 491 ? ? ? ? ?0.64 ? ? ? ?0.56 ? ? ? ?0.49
07:58:20 PM ? ? ? ? 1 ? ? ? ? 488 ? ? ? ? ?0.59 ? ? ? ?0.55 ? ? ? ?0.49
07:58:22 PM ? ? ? ? 0 ? ? ? ? 487 ? ? ? ? ?0.59 ? ? ? ?0.55 ? ? ? ?0.49
07:58:24 PM ? ? ? ? 0 ? ? ? ? 485 ? ? ? ? ?0.59 ? ? ? ?0.55 ? ? ? ?0.49
07:58:26 PM ? ? ? ? 1 ? ? ? ? 483 ? ? ? ? ?0.78 ? ? ? ?0.59 ? ? ? ?0.50
07:58:28 PM ? ? ? ? 0 ? ? ? ? 481 ? ? ? ? ?0.78 ? ? ? ?0.59 ? ? ? ?0.50
07:58:30 PM ? ? ? ? 1 ? ? ? ? 480 ? ? ? ? ?0.72 ? ? ? ?0.58 ? ? ? ?0.50
07:58:32 PM ? ? ? ? 0 ? ? ? ? 477 ? ? ? ? ?0.72 ? ? ? ?0.58 ? ? ? ?0.50
07:58:34 PM ? ? ? ? 0 ? ? ? ? 474 ? ? ? ? ?0.72 ? ? ? ?0.58 ? ? ? ?0.50
Average: ? ? ? ? ? ? ? 0 ? ? ? ? 484 ? ? ? ? ?0.68 ? ? ? ?0.57 ? ? ? ?0.49
runq-sz 準備執行的進程執行隊列。
plist-sz ?進程隊列里的進程和線程的數量
ldavg-1 ?前一分鐘的系統平均負載(load average)
ldavg-5 ?前五分鐘的系統平均負載(load average)
ldavg-15 ?前15分鐘的系統平均負載(load average)
順便說一下load avarage的含義
load average能夠理解為[size=+0]每秒鐘CPU等待執行的進程個數.
在Linux系統中。sar -q、uptime、w、top等命令都會有系統平均負載load average的輸出,那么什么是系統平均負載呢?
系統平均負載被定義為在特定時間間隔內執行隊列中的平均任務數。假設一個進程滿足下面條件則其就會位于執行隊列中:
- 它沒有在等待I/O操作的結果
- 它沒有主動進入等待狀態(也就是沒有調用'wait')
- 沒有被停止(比如:等待終止)
比如:
# uptime
20:55:40 up 24 days, ?3:06, ?1 user, ?load average: 8.13, 5.90, 4.94
命令輸出的最后內容表示在過去的1、5、15分鐘內執行隊列中的平均進程數量。
一般來說僅僅要每一個CPU的當前活動進程數不大于3那么系統的性能就是良好的,如果每一個CPU的任務數大于5,那么就表示這臺機器的性能有嚴重問題。對 于上面的樣例來說。如果系統有兩個CPU,那么其每一個CPU的當前任務數為:8.13/2=4.065。這表示該系統的性能是能夠接受的。
三。iostat
#iostat -c 2 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) ?03/28/2009
avg-cpu: ?%user ? %nice %system %iowait ?%steal ? %idle
? ? ? ? ? ? ? ? ? ? 30.10 ? ?0.00 ? ? ? ? ?4.89 ? ? ? ? 5.63 ? ?0.00 ? 59.38
avg-cpu: ?%user ? %nice %system %iowait ?%steal ? %idle
? ? ? ? ? ? ? ? ? ? 8.46 ? ? ? 0.00 ? ? ? ? ?1.74 ? ? ? ? 0.25 ? ?0.00 ? 89.55
avg-cpu: ?%user ? %nice %system %iowait ?%steal ? %idle
? ? ? ? ? ? ? ? ? ? 22.06 ? ? 0.00 ? ? ? ? ?11.28 ? ? ? 1.25 ? ?0.00 ? 65.41
四,mpstat
mpstat是 Multiprocessor Statistics的縮寫。是實時系統監控工具。
其報告與CPU的一些統計信息,這些信息存放在/proc/stat文件里。在多CPUs系統里。其不 但能查看全部CPU的平均狀況信息。并且可以查看特定CPU的信息。以下僅僅介紹 mpstat與CPU相關的參數。mpstat的語法例如以下:
mpstat [-P {|ALL}] [internal [count]]
參數的含義例如以下:
參數 解釋
-P {|ALL} 表示監控哪個CPU。 cpu在[0,cpu個數-1]中取值
internal 相鄰的兩次採樣的間隔時間
count 採樣的次數,count僅僅能和delay一起使用
當沒有參數時,mpstat則顯示系統啟動以后全部信息的平均值。有interval時。第一行的信息自系統啟動以來的平均信息。從第二行開始。輸出為前一個interval時間段的平均信息。與CPU有關的輸出的含義例如以下:
參數 解釋 從/proc/stat獲得數據
CPU 處理器ID
user 在internal時間段里,用戶態的CPU時間(%) ,不包括 nice值為負 進程 ?
usr/?total*100
nice 在internal時間段里,nice值為負進程的CPU時間(%) ?nice/?
total*100
system 在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
intr/s 在internal時間段里,每秒CPU接收的中斷的次數 ?intr/?
total*100
CPU總的工作時間=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 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) ?03/28/2009
10:07:57 PM ?CPU ? %user ? %nice ? ?%sys %iowait ? ?%irq ? %soft ?%steal ? %idle ? ?intr/s
10:07:59 PM ?all ? 20.75 ? ?0.00 ? 10.50 ? ?1.50 ? ?0.25 ? ?0.25 ? ?0.00 ? 66.75 ? 1294.50
10:07:59 PM ? ?0 ? 16.00 ? ?0.00 ? ?9.00 ? ?1.50 ? ?0.00 ? ?0.00 ? ?0.00 ? 73.50 ? 1000.50
10:07:59 PM ? ?1 ? 25.76 ? ?0.00 ? 12.12 ? ?1.52 ? ?0.00 ? ?0.51 ? ?0.00 ? 60.10 ? ?294.00
轉載于:https://www.cnblogs.com/jzdwajue/p/7181361.html
總結
以上是生活随笔為你收集整理的linux系统性能优化及瓶颈分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java知识总结-15
- 下一篇: Codeforces 610C:Harm