Linux 高 wio 分析
High IO wait
Table of Contents
1. 現(xiàn)象
2. 分析
2.1. iotop或者pidstat
2.1.1. iotop
2.1.2. pidstat
2.2. 腳本
2.3. 追蹤進(jìn)程
1 現(xiàn)象
top 命令,我們發(fā)現(xiàn)%wa 的值,達(dá)到20以上,甚至40以上,此時(shí),我們就要明確,現(xiàn)在CPU 大量消耗在等待IO響應(yīng)上了。請(qǐng)注意,是在等待IO響應(yīng),而不是在等待磁盤完成IO操作.
這兩者之間的區(qū)別在于,等待IO響應(yīng), 可能鏈路沒反應(yīng),請(qǐng)求根本沒有到達(dá)磁盤,也有 可能磁盤損壞,無法響應(yīng),高IO wait 不一定代表磁盤很忙。
因此分析這種情況,我們需要從兩個(gè)角度來考慮: 磁盤忙和磁盤不忙。磁盤不忙,但是 %wa 較高,唯一說明的問題就是:IO通道發(fā)生了異常。進(jìn)程發(fā)送請(qǐng)求、信號(hào)傳輸、鏈路 傳輸、磁盤讀取/寫入、信號(hào)返回等各個(gè)步驟都有可能異常。所以%wa高,不一定是磁盤 達(dá)到了瓶頸。也有可能是鏈路或存儲(chǔ)本身出現(xiàn)了問題,也有可能服務(wù)器參數(shù)配置不合理 導(dǎo)致進(jìn)程無法發(fā)送消息。
2 分析
常用的分析工具有iotop,iostat. 一般想看哪個(gè)或者哪些磁盤上CPU等待比較高,會(huì)使用iostat, 而查找消耗IO較高的進(jìn)程則使 用iotop. 那么如果我們查看哪些進(jìn)程在等待IO響應(yīng),可以使用一行命令。下面來詳細(xì) 說明:
2.1 iotop或者pidstat
2.1.1 iotop
iotop可以讓我們很方便的找出哪個(gè)進(jìn)程在消耗大量的IO資源。也就是統(tǒng)計(jì)出進(jìn)程的IO量。 這個(gè)命令的統(tǒng)計(jì)結(jié)果,是真實(shí)的IO消耗的統(tǒng)計(jì),一般排行在靠前的進(jìn)程,說明消耗IO資源 較多。具體磁盤忙不忙,還要看IO吞吐量。 示例如下:
Total DISK READ : 0.00 B/s | Total DISK WRITE : 137.02 K/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 207.49 K/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 5965 be/4 adb 0.00 B/s 62.64 K/s 0.00 % 0.28 % postgres: wal writer process 5908 be/4 adb 0.00 B/s 15.66 K/s 0.00 % 0.00 % postgres: logger process 5952 be/4 adb 0.00 B/s 11.74 K/s 0.00 % 0.00 % postgres: logger process 5953 be/4 adb 0.00 B/s 15.66 K/s 0.00 % 0.00 % postgres: logger process 5967 be/4 adb 0.00 B/s 15.66 K/s 0.00 % 0.00 % postgres: stats collector process ........
輸出結(jié)果以IO列做降序排列,固定的時(shí)間(默認(rèn)1秒)間隔刷新一次結(jié)果。有了進(jìn)程編號(hào), 我們就可以很方便的分析,定位高IO產(chǎn)生的原因。 或者直接輸入 iotop -boP 命令, 將 每秒輸出一次IO統(tǒng)計(jì)和正在使用IO的進(jìn)程。如果使用IO的進(jìn)程較多,還是不加參數(shù)方便
不過有些環(huán)境,并沒有安裝iotop工具,那么我們?cè)趺崔k?其實(shí)iotop命令,獲取的數(shù)據(jù)就 是存儲(chǔ)在/proc/<pid>/io文件中。比如:
#cat /proc/5977/io rchar: 29381 wchar: 4369248962 syscr: 29379 syscw: 96033 read_bytes: 0 write_bytes: 4369088512 cancelled_write_bytes: 0
我們完全可以通過自己寫腳本來實(shí)現(xiàn)基本的統(tǒng)計(jì),比如每秒哪個(gè)進(jìn)程讀寫最高。
2.1.2 pidstat
pidstat 這個(gè)命令,也是可以用來做高IO等待的性能分析的。而且也非常方便實(shí)用。
我們可以通過 pidstat -d <interval> 來輸出進(jìn)程的消耗情況。
pidstat -d 1 1 12時(shí)56分51秒 PID kB_rd/s kB_wr/s kB_ccwr/s Command 12時(shí)56分53秒 3348 0.00 20.00 0.00 jbd2/dm-2-8 12時(shí)56分53秒 3679 0.00 6.00 0.00 rsyslogd 12時(shí)56分53秒 22903 0.00 724.00 0.00 ns-slapd 12時(shí)56分53秒 44188 0.00 18.00 0.00 java 12時(shí)56分53秒 47980 0.00 4.00 0.00 java
也可以進(jìn)行條件判斷,取出關(guān)心的數(shù)據(jù)。比如:
pidstat -dl| head -3;pidstat -dl |awk '{if ($4 >10 || $3 > 10) print $0}'
這一行的本意是輸出讀或者寫大于10K的進(jìn)程,但是由于不同操作系統(tǒng)設(shè)置不同,讀和寫的列不一定是第3和第4列。 因此執(zhí)行前,需要先確認(rèn)。
notepidstat -d 的輸出,默認(rèn)是以Pid 進(jìn)行升序排列的。
2.2 腳本
等待I/O的進(jìn)程通過處于uninterruptible sleep或D狀態(tài)。通過這個(gè)特點(diǎn),查找有問題 的進(jìn)程。這行命令,找出來的進(jìn)程,只能說明,進(jìn)程在等待IO操作,但是并不能說明 磁盤本身已經(jīng)達(dá)到瓶頸。但是從另外一個(gè)角度來講,我們可以定準(zhǔn)有問題的進(jìn)程。
for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done
此命令,每5秒, 取一次結(jié)果.查詢結(jié)果類似如下:
----- D 248 [jbd2/dm-0-8] ----- D 248 [jbd2/dm-0-8]
2.3 追蹤進(jìn)程
我們定位了等待IO請(qǐng)求的進(jìn)程,如果確實(shí)是消耗了IO, 我們可以通過減少單位時(shí)間的 IO吞吐來解決,或者把數(shù)據(jù)分散到不同的時(shí)間段去處理。
如果進(jìn)程只是在等待IO,并沒有什么吞吐量,可以對(duì)進(jìn)程進(jìn)行追蹤(strace/truss)或 者gdb調(diào)試??纯磫栴}到底出現(xiàn)在哪里。 問題到底出在哪兒。
Created: 2020-04-29 Wed 17:49
Validate
總結(jié)
以上是生活随笔為你收集整理的Linux 高 wio 分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gp数据库运维
- 下一篇: 雄黄粉直接撒地面上可以吗