溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux系統(tǒng)監(jiān)控、診斷工具之IO wait怎么用

發(fā)布時間:2021-11-02 14:23:15 來源:億速云 閱讀:195 作者:小新 欄目:系統(tǒng)運維

這篇文章主要為大家展示了“l(fā)inux系統(tǒng)監(jiān)控、診斷工具之IO wait怎么用”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“l(fā)inux系統(tǒng)監(jiān)控、診斷工具之IO wait怎么用”這篇文章吧。

1、問題:

最近在做日志的實時同步,上線之前是做過單份線上日志壓力測試的,消息隊列和客戶端、本機都沒問題,但是沒想到上了第二份日志之后,問題來了:

集群中的某臺機器 top 看到負載巨高,集群中的機器硬件配置一樣,部署的軟件都一樣,卻單單這一臺負載有問題,初步猜測可能硬件有問題了。

同時,我們還需要把負載有異常的罪魁禍?zhǔn)拙境鰜?,到時候從軟件、硬件層面分別尋找解決方案。

2、排查:

從 top 中可以看到 load average 偏高,%wa 偏高,%us 很低:

linux系統(tǒng)監(jiān)控、診斷工具之IO wait怎么用

從上圖我們大致可以推斷 IO 遇到了瓶頸,下面我們可以再用相關(guān)的 IO 診斷工具,具體的驗證排查下。

PS:如果你對 top 的用法不了解,請參考我去年寫的一篇博文:

linux 系統(tǒng)監(jiān)控、診斷工具之 top 詳解

常用組合方式有如下幾種:

• 用vmstat、sar、iostat檢測是否是CPU瓶頸
• 用free、vmstat檢測是否是內(nèi)存瓶頸
• 用iostat、dmesg 檢測是否是磁盤I/O瓶頸
• 用netstat檢測是否是網(wǎng)絡(luò)帶寬瓶頸

2.1 vmstat

vmstat命令的含義為顯示虛擬內(nèi)存狀態(tài)(“Viryual Memor Statics”),但是它可以報告關(guān)于進程、內(nèi)存、I/O等系統(tǒng)整體運行狀態(tài)。

linux系統(tǒng)監(jiān)控、診斷工具之IO wait怎么用

它的相關(guān)字段說明如下:

Procs(進程)  • r: 運行隊列中進程數(shù)量,這個值也可以判斷是否需要增加CPU。(長期大于1)  • b: 等待IO的進程數(shù)量,也就是處在非中斷睡眠狀態(tài)的進程數(shù),展示了正在執(zhí)行和等待CPU資源的任務(wù)個數(shù)。當(dāng)這個值超過了CPU數(shù)目,就會出現(xiàn)CPU瓶頸了     Memory(內(nèi)存)  • swpd: 使用虛擬內(nèi)存大小,如果swpd的值不為0,但是SI,SO的值長期為0,這種情況不會影響系統(tǒng)性能。  • free: 空閑物理內(nèi)存大小。  • buff: 用作緩沖的內(nèi)存大小。  • cache: 用作緩存的內(nèi)存大小,如果cache的值大的時候,說明cache處的文件數(shù)多,如果頻繁訪問到的文件都能被cache處,那么磁盤的讀IO bi會非常小。     Swap  • si: 每秒從交換區(qū)寫到內(nèi)存的大小,由磁盤調(diào)入內(nèi)存。  • so: 每秒寫入交換區(qū)的內(nèi)存大小,由內(nèi)存調(diào)入磁盤。  注意:內(nèi)存夠用的時候,這2個值都是0,如果這2個值長期大于0時,系統(tǒng)性能會受到影響,磁盤IO和CPU資源都會被消耗。有些朋友看到空閑內(nèi)存(free)很少的或接近于0時,就認(rèn)為內(nèi)存不夠用了,不能光看這一點,還要結(jié)合si和so,如果free很少,但是si和so也很少(大多時候是0),那么不用擔(dān)心,系統(tǒng)性能這時不會受到影響的。     IO(現(xiàn)在的Linux版本塊的大小為1kb)  • bi: 每秒讀取的塊數(shù)  • bo: 每秒寫入的塊數(shù)  注意:隨機磁盤讀寫的時候,這2個值越大(如超出1024k),能看到CPU在IO等待的值也會越大。     system(系統(tǒng))  • in: 每秒中斷數(shù),包括時鐘中斷。  • cs: 每秒上下文切換數(shù)。  注意:上面2個值越大,會看到由內(nèi)核消耗的CPU時間會越大。     CPU(以百分比表示)  • us: 用戶進程執(zhí)行時間百分比(user time)  us的值比較高時,說明用戶進程消耗的CPU時間多,但是如果長期超50%的使用,那么我們就該考慮優(yōu)化程序算法或者進行加速。  • sy: 內(nèi)核系統(tǒng)進程執(zhí)行時間百分比(system time)  sy的值高時,說明系統(tǒng)內(nèi)核消耗的CPU資源多,這并不是良性表現(xiàn),我們應(yīng)該檢查原因。  • wa: IO等待時間百分比  wa的值高時,說明IO等待比較嚴(yán)重,這可能由于磁盤大量作隨機訪問造成,也有可能磁盤出現(xiàn)瓶頸(塊操作)。  • id: 空閑時間百分比

從 vmstat 中可以看到,CPU大部分的時間浪費在等待IO上面,可能是由于大量的磁盤隨機訪問或者磁盤的帶寬所造成的,bi、bo 也都超過 1024k,應(yīng)該是遇到了IO瓶頸。

2.2 iostat

下面再用更加專業(yè)的磁盤 IO 診斷工具來看下相關(guān)統(tǒng)計數(shù)據(jù)。

linux系統(tǒng)監(jiān)控、診斷工具之IO wait怎么用

它的相關(guān)字段說明如下:

rrqm/s:    每秒進行 merge 的讀操作數(shù)目。即 delta(rmerge)/s  wrqm/s:    每秒進行 merge 的寫操作數(shù)目。即 delta(wmerge)/s  r/s:       每秒完成的讀 I/O 設(shè)備次數(shù)。即 delta(rio)/s  w/s:       每秒完成的寫 I/O 設(shè)備次數(shù)。即 delta(wio)/s  rsec/s:    每秒讀扇區(qū)數(shù)。即 delta(rsect)/s  wsec/s:    每秒寫扇區(qū)數(shù)。即 delta(wsect)/s  rkB/s:     每秒讀K字節(jié)數(shù)。是 rsect/s 的一半,因為每扇區(qū)大小為512字節(jié)。(需要計算)  wkB/s:     每秒寫K字節(jié)數(shù)。是 wsect/s 的一半。(需要計算)  avgrq-sz:  平均每次設(shè)備I/O操作的數(shù)據(jù)大小 (扇區(qū))。delta(rsect+wsect)/delta(rio+wio)  avgqu-sz:  平均I/O隊列長度。即 delta(aveq)/s/1000 (因為aveq的單位為毫秒)。  await:     平均每次設(shè)備I/O操作的等待時間 (毫秒)。即 delta(ruse+wuse)/delta(rio+wio)  svctm:     平均每次設(shè)備I/O操作的服務(wù)時間 (毫秒)。即 delta(use)/delta(rio+wio)  %util:     一秒中有百分之多少的時間用于 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的。即 delta(use)/s/1000 (因為use的單位為毫秒)

可以看到兩塊硬盤中的 sdb 的利用率已經(jīng) 100%,存在嚴(yán)重的 IO 瓶頸,下一步我們就是要找出哪個進程在往這塊硬盤讀寫數(shù)據(jù)。

2.3 iotop

linux系統(tǒng)監(jiān)控、診斷工具之IO wait怎么用

根據(jù) iotop 的結(jié)果,我們迅速的定位到是 flume 進程的問題,造成了大量的 IO wait。

但是在開頭我已經(jīng)說了,集群中的機器配置一樣,部署的程序也都 rsync 過去的一模一樣,難道是硬盤壞了?

這得找運維同學(xué)來查證了,***的結(jié)論是:

Sdb為雙盤raid1,使用raid卡為“LSI Logic / Symbios Logic SAS1068E”,無cache。近400的IOPS壓力已經(jīng)達到了硬件極限。而其它機器使用的raid卡是“LSI Logic / Symbios Logic MegaRAID SAS 1078”,有256MB cache,并未達到硬件瓶頸,解決辦法是更換能提供更大IOPS的機器。

不過前面也說了,我們從軟硬件兩方面著手的目的就是看能否分別尋求代價最小的解決方案:

知道硬件的原因了,我們可以嘗試把讀寫操作移到另一塊盤,然后再看看效果:

linux系統(tǒng)監(jiān)控、診斷工具之IO wait怎么用

3、***的話:另辟蹊徑

其實,除了用上述專業(yè)的工具定位這個問題外,我們可以直接利用進程狀態(tài)來找到相關(guān)的進程。

我們知道進程有如下幾種狀態(tài):

PROCESS STATE CODES   D uninterruptible sleep (usually IO)   R running or runnable (on run queue)   S interruptible sleep (waiting for an event to complete)   T stopped, either by a job control signal or because it is being traced.   W paging (not valid since the 2.6.xx kernel)   X dead (should never be seen)   Z defunct ("zombie") process, terminated but not reaped by its parent.

其中狀態(tài)為 D 的一般就是由于 wait IO 而造成所謂的”非中斷睡眠“,我們可以從這點入手然后一步步的定位問題:

for x in `seq 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done   D 248 [jbd2/dm-0-8]   D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp   ----   D 22 [kdmflush]   D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp   ----  # 或者:  while true; do date; ps auxf | awk '{if($8=="D") print $0;}'; sleep 1; done   Tue Aug 23 20:03:54 CLT 2011   root       302  0.0  0.0      0     0 ?        D    May22   2:58  \_ [kdmflush]   root       321  0.0  0.0      0     0 ?        D    May22   4:11  \_ [jbd2/dm-0-8]   Tue Aug 23 20:03:55 CLT 2011   Tue Aug 23 20:03:56 CLT 2011     cat /proc/16528/io   rchar: 48752567   wchar: 549961789   syscr: 5967   syscw: 67138   read_bytes: 49020928   write_bytes: 549961728   cancelled_write_bytes: 0      lsof -p 16528   COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME   bonnie++ 16528 root cwd DIR 252,0 4096 130597 /tmp   <truncated>   bonnie++ 16528 root 8u REG 252,0 501219328 131869 /tmp/Bonnie.16528   bonnie++ 16528 root 9u REG 252,0 501219328 131869 /tmp/Bonnie.16528   bonnie++ 16528 root 10u REG 252,0 501219328 131869 /tmp/Bonnie.16528   bonnie++ 16528 root 11u REG 252,0 501219328 131869 /tmp/Bonnie.16528   bonnie++ 16528 root 12u REG 252,0 501219328 131869 <strong>/tmp/Bonnie.16528</strong>      df /tmp   Filesystem 1K-blocks Used Available Use% Mounted on   /dev/mapper/workstation-root 7667140 2628608 4653920 37% /      fuser -vm /tmp          USER        PID ACCESS COMMAND   /tmp:  db2fenc1   1067 ....m db2fmp          db2fenc1   1071 ....m db2fmp          db2fenc1   2560 ....m db2fmp          db2fenc1   5221 ....m db2fmp

以上是“l(fā)inux系統(tǒng)監(jiān)控、診斷工具之IO wait怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI