作者:布丁緣 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 |
Tasks: 102 total, 1 running, 101 sleeping, 0 stopped, 0 zombie |
其中wa也就是iowait參數所表示的,有多少比例的CPU在等待I/O
找到具體讀寫的是哪個磁盤
最簡單的是iostat命令,比如
1 |
$ iostat -x 2 5 |
其中-x知指明輸出更加詳細的信息。2 5表示間隔2秒統計一次總共輸出5次。第一行結果是自系統啟動以來的統計值,通常排查突發的I/O異常時可忽略。重點看%util列,表示進程使用I/O的比例。
找出引起高I/O的進程
最簡單的是iotop命令,比如
1 |
Total DISK READ: 404.95 K/s | Total DISK WRITE: 9.91 M/s |
iotop命令確實是一個很好用的工具,但是很多Linux發行版中默認並沒有安裝。如果系統里沒有這個命令,又不想安裝時,怎么辦?有沒有更簡單的方式?
能夠實現iotop類型功能的ps命令
首先看下進程狀態編碼
1 |
PROCESS STATE CODES |
注意到,如果進程正在等待I/O,進行的狀態碼經常為D。通過這個信息,我們可以大概估算出哪些進程在I/O等待中,比如
1 |
[root@myos ~]# for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done |
這里就發現進行 27456 可能有問題。但等待I/O也不一定說明它在瘋狂讀寫磁盤。為了確定它確實讀寫很多,可以用/proc目錄下的信息來定位,比如
1 |
[root@myos ~]# cat /proc/27456/io |
需要注意的是,不同的線程參考值不一樣。這個得具體問題具體分析。
