更詳細的解釋:
https://blog.csdn.net/Youth_lql/article/details/115524139?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166113469016782390520665%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166113469016782390520665&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v33_ecpm-2-115524139-null-null.142^v42^pc_ran_alice,185^v2^control&utm_term=%E6%A3%80%E6%9F%A5%E7%B3%BB%E7%BB%9Fio&spm=1018.2226.3001.4187
一,檢視磁盤io
iostat指令
iostat 主要用于輸出磁盤IO 和 CPU的統計資訊。屬于sysstat軟體包。可以用yum install sysstat 直接安裝。
用法
用法:iostat [選項] [<時間間隔>] [<次數>]
指令參數:
-c: 顯示CPU使用情況
-d: 顯示磁盤使用情況
-N: 顯示磁盤陣列(LVM) 資訊
-n: 顯示NFS 使用情況
-k: 以 KB 為機關顯示
-m: 以 M 為機關顯示
-t: 報告每秒向終端讀取和寫入的字元數和CPU的資訊
-V: 顯示版本資訊
-x: 顯示詳細資訊
-p:[磁盤] 顯示磁盤和分區的情況

cpu屬性值說明:
%user:CPU處在使用者模式下的時間百分比。
%nice:CPU處在帶NICE值的使用者模式下的時間百分比。
%system:CPU處在系統模式下的時間百分比。
%iowait:CPU等待輸入輸出完成時間的百分比。
%steal:管理程式維護另一個虛拟處理器時,虛拟CPU的無意識等待時間百分比。
%idle:CPU空閑時間百分比。
備注:如果%iowait的值過高,表示硬碟存在I/O瓶頸,%idle值高,表示CPU較空閑,如果%idle值高但系統響應慢時,有可能是CPU等待配置設定記憶體,此時應加大記憶體容量。%idle值如果持續低于10,那麼系統的CPU處理能力相對較低,表明系統中最需要解決的資源是CPU。
disk屬性值說明:
device:磁盤名稱
tps:每秒鐘發送到的I/O請求數.
Blk_read/s:每秒讀取的block數.
Blk_wrtn/s:每秒寫入的block數.
Blk_read:讀入的block總數.
Blk_wrtn:寫入的block總數.
# iostat -d -x -k 1
輸出詳解
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: 每秒io操作占用的cpu使用時間。即一秒中有百分之多少的時間用于 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的,計算方法:(r/s+w/s)*(svctm/1000)
問題判斷:
1,如果 %util 接近 100%,說明産生的I/O請求太多,I/O系統已經滿負荷,該磁盤可能存在瓶頸.
2,idle小于70%,IO壓力就較大了,一般讀取速度有較多的wait。這時可以結合vmstat 檢視檢視b參數(等待資源的程序數)和wa參數(IO等待所占用的CPU時間的百分比,高過30%時IO壓力高)
3,await 的參數也要多和 svctm 來參考.差的過高就一定有 IO 的問題.
4,avgqu-sz 也是個做 IO 調優時需要注意的地方,這個就是直接每次操作的資料的大小,如果次數多,但資料拿的小的話,其實 IO 也會很小.如果資料拿的大,才IO 的資料會高.也可以通過 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s.也就是講,讀定速度是這個來決定的.
二,檢視程序io占用
iotop根據Linux核心(需要2.6.20及以上)來監測I/O,并且能顯示目前程序/線程的I/O使用率。用來顯示實時的磁盤活動。Linux下的IO統計工具如iostat,nmon等大多數是隻能統計到per裝置的讀寫情況。iotop 監控 Linux 核心輸出的 I/O 使用資訊,并且顯示一個系統中程序或線程的目前 I/O 使用情況。它顯示每個程序/線程讀寫 I/O 帶寬。它同樣顯示當等待換入和等待 I/O 的線程/程序花費的時間的百分比。
參數:
-o:隻顯示有io操作的程序
-b:批量顯示,無互動,主要用作記錄到檔案。
-n NUM:顯示NUM次,主要用于非互動式模式。
-d SEC:間隔SEC秒顯示一次。
-p PID:監控的程序pid。
-u USER:監控的程序使用者。
快捷鍵:
左右箭頭:改變排序方式,預設是按IO排序。
r:改變排序順序。
o:隻顯示有IO輸出的程序。
p:程序/線程的顯示方式的切換。
a:顯示累積使用量。
q:退出。
TID:線程或程序id
PRIO:線程io優先級
USER:線程所屬使用者
DISK READ:線程從磁盤讀資料的速度
DISK WRITE:線程寫磁盤的速度
SWAPIN:程序使用的資料由swap換入到記憶體的時間占程序io總時間的百分比
IO:程序等待進行io操作的時間占程序io總時間的百分比
Total DISK READ 和 Total DISK WRITE
的值一方面表示了程序和核心線程之間的總的讀寫帶寬,另一方面也表示核心塊裝置子系統的。
Actual DISK READ 和 Actual DISK WRITE 的值表示在核心塊裝置子系統和下面硬體(HDD、SSD
等等)對應的實際磁盤 I/O 帶寬。
三,檢視網絡io占用
1,使用nload指令
下載下傳位址:http://sourceforge.net/projects/nload/
# nload eth0
監控eth0網卡的總流量,非常直覺的現實
2,使用iptraf指令
下載下傳位址:http://iptraf.seul.org/
# iptraf
會進入一個圖形界面,設定要抓取的網卡之後,能夠更為詳細的現實ip+port之間的資料報通信,根據通信資料報的接受速率和大小,可以判斷哪個應用程式占用網卡io較大
3,使用sar指令
檢視網卡裝置的曆史流量資料
# sar -n DEV
檢視某天的流量資料
# sar -f /var/log/sa/sa28 -n DEV
四,檢視系統記憶體占用
vmstat指令
vmstat指令是最常見的Linux/Unix監控工具,屬于sysstat包。可以展現給定時間間隔的伺服器的狀态值,包括伺服器的CPU使用率,記憶體使用,虛拟記憶體交換情況,IO讀寫情況。這個指令是我檢視Linux/Unix最喜愛的指令,一個是Linux/Unix都支援,二是相比top,我可以看到整個機器的CPU,記憶體,IO的使用情況,而不是單單看到各個程序的CPU使用率和記憶體使用率(使用場景不一樣)。
用法:
一般vmstat工具的使用是通過兩個數字參數來完成的,第一個參數是采樣的時間間隔數,機關是秒,第二個參數是采樣的次數,如:
root@local:~# vmstat 2 1
輸出解釋:
r: 表示運作和等待cpu時間片的程序數,如果長期大于CPU的數目,說明cpu不足,需要增加cpu。
b: 表示在等待資源的程序數,比如正在等待I/O、或者記憶體交換等。
swpd: 表示swap記憶體的使用量,機關是KB
free:表示系統的空閑記憶體
buff:buff空間的使用大小。buffers是用來緩沖塊裝置做的,它隻記錄檔案系統的中繼資料(metadata)以及 tracking in-flight pages等。
cache:cache空間的使用大小。用來給系統或程式打開的檔案内容做緩沖。
si:即swap in操作,告訴我們每秒有多大記憶體被從磁盤swap分區中換入真實記憶體中。
so:即swap out操作,告訴我們每秒有多大記憶體被從真實記憶體換出到磁盤swap分區中。(注:一旦,swap in和swap out比較頻繁,就非常影響程式的性能)
bi:每秒從塊裝置接收的塊數量,這裡的塊裝置是指系統上所有的磁盤和其他塊裝置,預設塊大小是1024byte
bo:每秒寫入塊裝置的塊數量
in:列顯示了系統每秒被中斷的數量,包括之間中斷。如果中斷比較多,可能會導緻cpu繁忙。
cs:列顯示了系統為了處理是以任務而上下文切換的數量。例如我們調用系統函數,就要進行上下文切換,線程的切換,也要程序上下文切換,這個值要越小越好,太大了,要考慮調低線程或者程序的數目,例如在apache和nginx這種web伺服器中,我們一般做性能測試時會進行幾千并發甚至幾萬并發的測試,選擇web伺服器的程序可以由程序或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和線程數就是比較合适的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入核心空間,導緻上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導緻CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。
us:cpu在使用者态消耗的時間
sy:cpu在核心态消耗的時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。
id:cpu處于空閑的時間
wa:cpu等待IO操作完成的時間。如果,wait時間較長,有可能是等待cpu處理的io操作較多。
st:Time stolen from a virtual machine.(這個值應該隻有在虛拟機裡才有意義,表示被實體機給竊取走的時間,不太明白)
常見問題及解決方法:
如果r經常大于4,且id經常少于40,表示cpu的負荷很重。
如果pi,po長期不等于0,表示記憶體不足。
如果disk經常不等于0,且在b中的隊列大于3,表示io性能不好。
1.)如果在processes中運作的序列(process r)是連續的大于在系統中的CPU的個數表示系統現在運作比較慢,有多數的程序等待CPU。
2.)如果r的輸出數大于系統中可用CPU個數的4倍的話,則系統面臨着CPU短缺的問題,或者是CPU的速率過低,系統中有多數的程序在等待CPU,造成系統中程序運作過慢。
3.)如果空閑時間(cpu id)持續為0并且系統時間(cpu sy)是使用者時間的兩倍(cpu us)系統則面臨着CPU資源的短缺。
當發生以上問題的時候請先調整應用程式對CPU的占用情況.使得應用程式能夠更有效的使用CPU.同時可以考慮增加更多的CPU. 關于CPU的使用情況還可以結合mpstat, ps aux top prstat –a等等一些相應的指令來綜合考慮關于具體的CPU的使用情況,和那些程序在占用大量的CPU時間.一般情況下,應用程式的問題會比較大一些.比如一些sql語句不合理等等都會造成這樣的現象.
記憶體問題現象:
記憶體的瓶頸是由scan rate (sr)來決定的.scan rate是通過每秒的始終算法來進行頁掃描的.如果scan rate(sr)連續的大于每秒200頁則表示可能存在記憶體缺陷.同樣的如果page項中的pi和po這兩欄表示每秒頁面的調入的頁數和每秒調出的頁數.如果該值經常為非零值,也有可能存在記憶體的瓶頸,當然,如果個别的時候不為0的話,屬于正常的頁面排程這個是虛拟記憶體的主要原理.
解決辦法:
1.調節applications & servers使得對記憶體和cache的使用更加有效.
2.增加系統的記憶體.
3. Implement priority paging in s in pre solaris 8 versions by adding line "set priority paging=1" in /etc/system. Remove this line if upgrading from Solaris 7 to 8 & retaining old /etc/system file.
關于記憶體的使用情況還可以結ps aux top prstat –a等等一些相應的指令來綜合考慮關于具體的記憶體的使用情況,和那些程序在占用大量的記憶體.一般情況下,如果記憶體的占用率比較高,但是,CPU的占用很低的時候,可以考慮是有很多的應用程式占用了記憶體沒有釋放,但是,并沒有占用CPU時間,可以考慮應用程式,對于未占用CPU時間和一些背景的程式,釋放記憶體的占用。
r 表示運作隊列(就是說多少個程序真的配置設定到CPU),我測試的伺服器目前CPU比較空閑,沒什麼程式在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。這個也和top的負載有關系,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,伺服器的狀态很危險。top的負載類似每秒的運作隊列。如果運作隊列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。
常見性能問題分析
IO/CPU/men連鎖反應
1.free急劇下降
2.buff和cache被回收下降,但也無濟于事
3.依舊需要使用大量swap交換分區swpd
4.等待程序數,b增多
5.讀寫IO,bi bo增多
6.si so大于0開始從硬碟中讀取
7.cpu等待時間用于 IO等待,wa增加
記憶體不足
1.開始使用swpd,swpd不為0
2.si so大于0開始從硬碟中讀取
io瓶頸
1.讀寫IO,bi bo增多超過2000
2.cpu等待時間用于 IO等待,wa增加 超過20
3.sy 系統調用時間長,IO操作頻繁會導緻增加 >30%
4.wa io等待時間長
iowait% <20% 良好
iowait% <35% 一般
iowait% >50%
5.進一步使用iostat觀察
CPU瓶頸:load,vmstat中r列
1.反應為CPU隊列長度
2.一段時間内,CPU正在處理和等待CPU處理的程序數之和,直接反應了CPU的使用和申請情況。
3.理想的load average:核數*CPU數*0.7
CPU個數:grep 'physical id' /proc/cpuinfo | sort -u
核數:grep 'core id' /proc/cpuinfo | sort -u | wc -l
4.超過這個值就說明已經是CPU瓶頸了
CPU瓶頸
1.us 使用者CPU時間高超過90%
涉及到web伺服器,cs 每秒上下文切換次數
例如我們調用系統函數,就要進行上下文切換,線程的切換,也要程序上下文切換,這個值要越小越好,太大了,要考慮調低線程或者程序的數目,例如在apache和nginx這種web伺服器中,我們一般做性能測試時會進行幾千并發甚至幾萬并發的測試,選擇web伺服器的程序可以由程序或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和線程數就是比較合适的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入核心空間,導緻上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導緻CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。
1.cs可以對apache和nginx線程和程序數限制起到一定的參考作用
2.我們一般做性能測試時會進行幾千并發甚至幾萬并發的測試,選擇web伺服器的程序可以由程序或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和線程數就是比較合适的值了
較好的趨勢:主要是 swap使用少,swpd數值低。si so分頁讀取寫入數值趨近于零
其他說明:
b 表示阻塞的程序,這個不多說,程序阻塞,大家懂的。
swpd 虛拟記憶體已使用的大小,如果大于0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該更新記憶體了或者把耗記憶體的任務遷移到其他機器。
free 空閑的實體記憶體的大小,我的機器記憶體總共8G,剩餘3415M。
buff Linux/Unix系統是用來存儲,目錄裡面有什麼内容,權限等的緩存,我本機大概占用300多M
cache cache直接用來記憶我們打開的檔案,給檔案做緩沖,我本機大概占用300多M(這裡是Linux/Unix的聰明之處,把空閑的實體記憶體的一部分拿來做檔案和目錄的緩存,是為了提高 程式執行的性能,當程式使用記憶體時,buffer/cached會很快地被使用。)
si 每秒從磁盤讀入虛拟記憶體的大小,如果這個值大于0,表示實體記憶體不夠用或者記憶體洩露了,要查找耗記憶體程序解決掉。我的機器記憶體充裕,一切正常。
so 每秒虛拟記憶體寫入磁盤的大小,如果這個值大于0,同上。
bi 塊裝置每秒接收的塊數量,這裡的塊裝置是指系統上所有的磁盤和其他塊裝置,預設塊大小是1024byte,我本機上沒什麼IO操作,是以一直是0,但是我曾在處理拷貝大量資料(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒
bo 塊裝置每秒發送的塊數量,例如我們讀取檔案,bo就要大于0。bi和bo一般都要接近0,不然就是IO過于頻繁,需要調整。
in 每秒CPU的中斷次數,包括時間中斷
cs 每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要程序上下文切換,這個值要越小越好,太大了,要考慮調低線程或者程序的數目,例如在apache和nginx這種web伺服器中,我們一般做性能測試時會進行幾千并發甚至幾萬并發的測試,選擇web伺服器的程序可以由程序或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和線程數就是比較合适的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入核心空間,導緻上下文切換,這個是很耗資源,也要盡量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導緻CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。
us 使用者CPU時間,我曾經在一個做加密解密很頻繁的伺服器上,可以看到us接近100,r運作隊列達到80(機器在做壓力測試,性能表現不佳)。