IO等待或者iowait
,wait
,wa
,%iowait
,或者wait%
通常可以通過Linux系統監控工具查看。例如命令行工具top、sar、atop等。
就其本身而言,它是眾多性能統計數據之一,可讓我們深入了解Linux系統性能。當CPU負載峰值為60到80時。I/O等待會導致頁面加載緩慢、超時和間歇性中斷。
IO等待是CPU或多個CPU空閑的時間百分比,在此期間系統有等待的磁盤I/O請求,I/O等待適用于Unix/Linux系統,包括macOS、FreeBSD、Solaris。
iostat 命令查找高IO等待的磁盤
Linux有很多可用的工具可以用來發現與排錯,有些工具很容易使用,有些用法則比較高級。
查看I/O 等待問題不僅需要使用一些高級工具,也需要一些基本工具的高級用法。I/O等待之所以難以排查是因為默認有太多的工具告訴你系統I/O阻塞。
但沒那么多工具可以幫你縮小范圍以確定是哪個或哪些進程引起的問題。
在排查IO等待問題上,首先確定是不是因為I/O引起系統緩慢。你可以使用很多工具但最簡單的Linux命令還是top。
使用top
命令即可看到類似這樣的信息Cpu(s): 0.0%us, 0.5%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
。
us用戶空間占用CPU百分比。sy內核空間占用CPU百分比。ni用戶進程空間內改變過優先級的進程占用CPU百分比。
id空閑CPU百分比。wa等待輸入輸出的CPU時間百分比。hi硬件中斷。si軟件中斷。st實時。
top
top - 14:31:20 up 35 min, 4 users, load average: 2.25, 1.74, 1.68
Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.3%us, 1.7%sy, 0.0%ni, 0.0%id, 96.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 245440k total, 241004k used, 4436k free, 496k buffers
Swap: 409596k total, 5436k used, 404160k free, 182812k cached
????從CPU(s)
這行你可以看出當前CPU IO等待的情況,越高的wa
表示越多的cpu資源在等待I/O。
上面的top命令從系統面大體展示I/O等待,但它沒有告訴你哪個硬盤正在被影響,為此我們還需要使用iostat
命令。
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
iostat -x 2 5
命令將每2秒打印報告,共打印5次。iostata命令的-x
選項打印更詳細的報告信息。
iostat
命令打印的第1個報告,數值是基于最后一次系統啟動的時間統計的。基于這個原因,在大部份情況下,iostat
命令打印出的第1個報告應該被忽略。
每個子報告都是基于上1次的報告。在這個例子中,iostat -x 2 5
命令將打印5次報告。
第2份報告就是從第1份報告開始后的硬盤數據,第3份報告基于第2份,依此類推。
上述示例,sda盤的%utili
達到了111.41%。這表示引起I/O慢的進程在寫入sda磁盤盤。
因為我這個測試實例中只有1個硬盤,但對于有多硬盤的服務器來說,這可以縮小在使用I/O的進程范圍。
iostat命令除了提供%utili
信息外,像rrqm/s、wrqm/s這些每秒讀、寫的請求數,r/s、w/s每秒讀寫數也很有用。
iotop 命令查找高IO等待的進程
查看哪個進程使用硬盤最多,最簡單的方法就是使用iotop
命令。iotop
命令定期采樣磁盤的讀寫數據。
顯示每個進程磁盤讀DISK READ和 DISK WRITE寫速度以及進程的IO優先級PRIO等信息。
通過查看磁盤的讀DISK READ與寫DISK WRITE,我們很容易就可以確定是bonnie++進程在頻繁的使用磁盤IO。
iotop
Total DISK READ: 8.00 M/s | Total DISK WRITE: 20.36 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
15758 be/4 root 7.99 M/s 8.01 M/s 0.00 % 61.97 % bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp
ps 命令查找高IO等待的進程
雖然iotop好用,但主流的Linux發行版中是沒有安裝的。系統管理員總是會碰到這樣的情況,他們沒辦法在短時間內簡單地安裝這些非默認命令。
如果iotop沒辦法用,可以使用PS命令來代替iotop
命令。以下的步聚還是可以幫助你縮小進程的范圍。
ps
命令可以打印出內存,cpu的情況。但沒辦法打印磁盤I/O的情況。雖然ps
命令沒辦法打印出I/O的情況,但它可以打印進程是否在等待I/O。
ps
命令的STAT
狀態列提供進程當前的狀態。D
表示不間斷睡眠。R
正在運行。S
可中斷的睡眠,正在等待事件的完成。T
已經終止進程。
X
表示進程已經死亡,你可能永遠不會看到此狀態。Z
表示已失效,通常稱為僵尸進程,已終止但未由其父進程回收。
等待I/O的進程通常處于D
狀態,通過ps
命令打印的信息我們就可以找到在等待IO的進程。
for x in `seq 1 1 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
命令會每5秒循環打印處于D
狀態的進程,共打印10次。但僅憑進程處于D狀態,還不能完全確定就是該進程引起的I/O等待。
為了確定可疑的進程,我們還需要使用/proc文件系統。在這個虛擬文件系統里,每個進程都有一個IO文件,里面的數值跟iotop
命令獲取的I/O數值是一樣的。
假設,我們懷疑引起高IO等待的進程bonnie++,它的進程PID是16528。我們可以運行命令cat /proc/16528/io
查看進程磁盤IO數據。
cat /proc/16528/io
rchar: 562397689
wchar: 1073318747
syscr: 137395
syscw: 190792
read_bytes: 482344960
write_bytes: 524697984
cancelled_write_bytes: 16801792
read_bytes
和write_bytes
就這個進程讀寫硬盤的字節數。在這里,bonnie++已經讀取了46MB,寫入524MB的數據。
lsof 命令查看頻繁讀寫的文件
lsof
命令會為你展示指定進程打開的所有文件,為了減少打印的信息,可以僅使用-p
選項打印指定進程打開的文件。
lsof -p 16528
減少I/O等待
優化應用程序的代碼和數據庫查詢。這可以大大降低磁盤讀/寫的頻率。這應該是您的第一種方法。
確保您有足夠的可用內存,以便大約一半的服務器內存用于內存緩沖區和緩存,而不是使用交換空間和分頁到磁盤。
調整您的系統、存儲設備和 Linux 內核以提高存儲性能和使用壽命。最后,如果一切都失敗了。將存儲設備升級到更快的SSD、NVMe或其他高吞吐量存儲設備。
-
IO
+關注
關注
0文章
461瀏覽量
39366 -
cpu
+關注
關注
68文章
10902瀏覽量
212996 -
Linux
+關注
關注
87文章
11345瀏覽量
210378 -
命令
+關注
關注
5文章
696瀏覽量
22107
發布評論請先 登錄
相關推薦
評論