性能案例分析 | 查看哪些進程在大量讀寫磁盤-I/O很高問題排查


作者:布丁緣 https://www.ddkiss.com/archives/68.html


Linux 有很多運維診斷工具,有些用起來很簡單,有些功能很強大用起來就有些麻煩。比如I/O等待問題,原因可能有很多種,也很難用某一種工具就能定位。特別是如何找到到底是哪個進程讀寫了哪個文件引起的?

最近,從監控上看總是在上午10點左右I/O負載突然就升起來了,連遠程SSH都卡住。因為ECS服務器內存有限,我啟用了SWAP,內存不足時不至於會崩潰,系統性能肯定有所下降。

說明:在Centos7中,top ps等是系統自帶的工具,iostat iotop lsof等都是需要自行安裝的。

確實系統負載上升是否由於I/O異常導致

最簡單的是用top命令,比如

1
2
3
4
Tasks: 102 total,   1 running, 101 sleeping,   0 stopped,   0 zombie
%Cpu(s): 0.7 us, 0.2 sy, 0.0 ni, 0.2 id, 98.9 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1016396 total, 62276 free, 891072 used, 63048 buff/cache
KiB Swap: 1048572 total, 804428 free, 244144 used. 8100 avail Mem

其中wa也就是iowait參數所表示的,有多少比例的CPU在等待I/O

找到具體讀寫的是哪個磁盤

最簡單的是iostat命令,比如

1
2
3
4
5
6
7
8
$ iostat -x 2 5
avg-cpu: %user %nice %system %iowait %steal %idle
3.66 0.00 47.64 48.69 0.00 0.00

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 44.50 39.27 117.28 29.32 11220.94 13126.70 332.17 65.77 462.79 9.80 2274.71 7.60 111.41
dm-0 0.00 0.00 83.25 9.95 10515.18 4295.29 317.84 57.01 648.54 16.73 5935.79 11.48 107.02
dm-1 0.00 0.00 57.07 40.84 228.27 163.35 8.00 93.84 979.61 13.94 2329.08 10.93 107.02

其中-x知指明輸出更加詳細的信息。2 5表示間隔2秒統計一次總共輸出5次。第一行結果是自系統啟動以來的統計值,通常排查突發的I/O異常時可忽略。重點看%util列,表示進程使用I/O的比例。

找出引起高I/O的進程

最簡單的是iotop命令,比如

1
2
3
4
Total DISK READ: 404.95 K/s | Total DISK WRITE: 9.91 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
3153 be/3 root 0.00 B/s 3.78 K/s 0.00 % 6.23 % [jbd2/sda5-8]
10287 be/4 mysql 253.57 K/s 1858.24 K/s 0.00 % 3.73 % mysqld --defaults-file=/etc/my.cnf --basedir=/opt/my~--pid-file

iotop命令確實是一個很好用的工具,但是很多Linux發行版中默認並沒有安裝。如果系統里沒有這個命令,又不想安裝時,怎么辦?有沒有更簡單的方式?

能夠實現iotop類型功能的ps命令

首先看下進程狀態編碼

1
2
3
4
5
6
7
8
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.

注意到,如果進程正在等待I/O,進行的狀態碼經常為D。通過這個信息,我們可以大概估算出哪些進程在I/O等待中,比如

1
2
3
4
5
6
7
8
9
10
11
12
[root@myos ~]# for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done
----
----
----
D 27456 php-fpm: pool www
----
----
----
----
----
----
----

這里就發現進行 27456 可能有問題。但等待I/O也不一定說明它在瘋狂讀寫磁盤。為了確定它確實讀寫很多,可以用/proc目錄下的信息來定位,比如

1
2
3
4
5
6
7
8
[root@myos ~]# cat /proc/27456/io
rchar: 42857442
wchar: 35657666
syscr: 44932
syscw: 9744
read_bytes: 1530859520
write_bytes: 13824000
cancelled_write_bytes: 1249280

需要注意的是,不同的線程參考值不一樣。這個得具體問題具體分析。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM