天天看點

#yyds幹貨盤點# I/O

更詳細的解釋:

​​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:[磁盤] 顯示磁盤和分區的情況

#yyds幹貨盤點# I/O

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:退出。

#yyds幹貨盤點# I/O

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      
#yyds幹貨盤點# I/O

輸出解釋:

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(機器在做壓力測試,性能表現不佳)。