IO等待或者iowait
,wait
,wa
,%iowait
,或者wait%
通??梢酝ㄟ^(guò)Linux系統(tǒng)監(jiān)控工具查看。例如命令行工具top、sar、atop等。
就其本身而言,它是眾多性能統(tǒng)計(jì)數(shù)據(jù)之一,可讓我們深入了解Linux系統(tǒng)性能。當(dāng)CPU負(fù)載峰值為60到80時(shí)。I/O等待會(huì)導(dǎo)致頁(yè)面加載緩慢、超時(shí)和間歇性中斷。
IO等待是CPU或多個(gè)CPU空閑的時(shí)間百分比,在此期間系統(tǒng)有等待的磁盤(pán)I/O請(qǐng)求,I/O等待適用于Unix/Linux系統(tǒng),包括macOS、FreeBSD、Solaris。
iostat 命令查找高IO等待的磁盤(pán)
Linux有很多可用的工具可以用來(lái)發(fā)現(xiàn)與排錯(cuò),有些工具很容易使用,有些用法則比較高級(jí)。
查看I/O 等待問(wèn)題不僅需要使用一些高級(jí)工具,也需要一些基本工具的高級(jí)用法。I/O等待之所以難以排查是因?yàn)槟J(rèn)有太多的工具告訴你系統(tǒng)I/O阻塞。
但沒(méi)那么多工具可以幫你縮小范圍以確定是哪個(gè)或哪些進(jìn)程引起的問(wèn)題。
在排查IO等待問(wèn)題上,首先確定是不是因?yàn)镮/O引起系統(tǒng)緩慢。你可以使用很多工具但最簡(jiǎn)單的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內(nèi)核空間占用CPU百分比。ni用戶進(jìn)程空間內(nèi)改變過(guò)優(yōu)先級(jí)的進(jìn)程占用CPU百分比。
id空閑CPU百分比。wa等待輸入輸出的CPU時(shí)間百分比。hi硬件中斷。si軟件中斷。st實(shí)時(shí)。
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)
這行你可以看出當(dāng)前CPU IO等待的情況,越高的wa
表示越多的cpu資源在等待I/O。
上面的top命令從系統(tǒng)面大體展示I/O等待,但它沒(méi)有告訴你哪個(gè)硬盤(pán)正在被影響,為此我們還需要使用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秒打印報(bào)告,共打印5次。iostata命令的-x
選項(xiàng)打印更詳細(xì)的報(bào)告信息。
iostat
命令打印的第1個(gè)報(bào)告,數(shù)值是基于最后一次系統(tǒng)啟動(dòng)的時(shí)間統(tǒng)計(jì)的?;谶@個(gè)原因,在大部份情況下,iostat
命令打印出的第1個(gè)報(bào)告應(yīng)該被忽略。
每個(gè)子報(bào)告都是基于上1次的報(bào)告。在這個(gè)例子中,iostat -x 2 5
命令將打印5次報(bào)告。
第2份報(bào)告就是從第1份報(bào)告開(kāi)始后的硬盤(pán)數(shù)據(jù),第3份報(bào)告基于第2份,依此類推。
上述示例,sda盤(pán)的%utili
達(dá)到了111.41%。這表示引起I/O慢的進(jìn)程在寫(xiě)入sda磁盤(pán)盤(pán)。
因?yàn)槲疫@個(gè)測(cè)試實(shí)例中只有1個(gè)硬盤(pán),但對(duì)于有多硬盤(pán)的服務(wù)器來(lái)說(shuō),這可以縮小在使用I/O的進(jìn)程范圍。
iostat命令除了提供%utili
信息外,像rrqm/s、wrqm/s這些每秒讀、寫(xiě)的請(qǐng)求數(shù),r/s、w/s每秒讀寫(xiě)數(shù)也很有用。
iotop 命令查找高IO等待的進(jìn)程
查看哪個(gè)進(jìn)程使用硬盤(pán)最多,最簡(jiǎn)單的方法就是使用iotop
命令。iotop
命令定期采樣磁盤(pán)的讀寫(xiě)數(shù)據(jù)。
顯示每個(gè)進(jìn)程磁盤(pán)讀DISK READ和 DISK WRITE寫(xiě)速度以及進(jìn)程的IO優(yōu)先級(jí)PRIO等信息。
通過(guò)查看磁盤(pán)的讀DISK READ與寫(xiě)DISK WRITE,我們很容易就可以確定是bonnie++進(jìn)程在頻繁的使用磁盤(pán)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等待的進(jìn)程
雖然iotop好用,但主流的Linux發(fā)行版中是沒(méi)有安裝的。系統(tǒng)管理員總是會(huì)碰到這樣的情況,他們沒(méi)辦法在短時(shí)間內(nèi)簡(jiǎn)單地安裝這些非默認(rèn)命令。
如果iotop沒(méi)辦法用,可以使用PS命令來(lái)代替iotop
命令。以下的步聚還是可以幫助你縮小進(jìn)程的范圍。
ps
命令可以打印出內(nèi)存,cpu的情況。但沒(méi)辦法打印磁盤(pán)I/O的情況。雖然ps
命令沒(méi)辦法打印出I/O的情況,但它可以打印進(jìn)程是否在等待I/O。
ps
命令的STAT
狀態(tài)列提供進(jìn)程當(dāng)前的狀態(tài)。D
表示不間斷睡眠。R
正在運(yùn)行。S
可中斷的睡眠,正在等待事件的完成。T
已經(jīng)終止進(jìn)程。
X
表示進(jìn)程已經(jīng)死亡,你可能永遠(yuǎn)不會(huì)看到此狀態(tài)。Z
表示已失效,通常稱為僵尸進(jìn)程,已終止但未由其父進(jìn)程回收。
等待I/O的進(jìn)程通常處于D
狀態(tài),通過(guò)ps
命令打印的信息我們就可以找到在等待IO的進(jìn)程。
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
命令會(huì)每5秒循環(huán)打印處于D
狀態(tài)的進(jìn)程,共打印10次。但僅憑進(jìn)程處于D狀態(tài),還不能完全確定就是該進(jìn)程引起的I/O等待。
為了確定可疑的進(jìn)程,我們還需要使用/proc文件系統(tǒng)。在這個(gè)虛擬文件系統(tǒng)里,每個(gè)進(jìn)程都有一個(gè)IO文件,里面的數(shù)值跟iotop
命令獲取的I/O數(shù)值是一樣的。
假設(shè),我們懷疑引起高IO等待的進(jìn)程bonnie++,它的進(jìn)程PID是16528。我們可以運(yùn)行命令cat /proc/16528/io
查看進(jìn)程磁盤(pán)IO數(shù)據(jù)。
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
就這個(gè)進(jìn)程讀寫(xiě)硬盤(pán)的字節(jié)數(shù)。在這里,bonnie++已經(jīng)讀取了46MB,寫(xiě)入524MB的數(shù)據(jù)。
lsof 命令查看頻繁讀寫(xiě)的文件
lsof
命令會(huì)為你展示指定進(jìn)程打開(kāi)的所有文件,為了減少打印的信息,可以僅使用-p
選項(xiàng)打印指定進(jìn)程打開(kāi)的文件。
lsof -p 16528
減少I/O等待
優(yōu)化應(yīng)用程序的代碼和數(shù)據(jù)庫(kù)查詢。這可以大大降低磁盤(pán)讀/寫(xiě)的頻率。這應(yīng)該是您的第一種方法。
確保您有足夠的可用內(nèi)存,以便大約一半的服務(wù)器內(nèi)存用于內(nèi)存緩沖區(qū)和緩存,而不是使用交換空間和分頁(yè)到磁盤(pán)。
調(diào)整您的系統(tǒng)、存儲(chǔ)設(shè)備和 Linux 內(nèi)核以提高存儲(chǔ)性能和使用壽命。最后,如果一切都失敗了。將存儲(chǔ)設(shè)備升級(jí)到更快的SSD、NVMe或其他高吞吐量存儲(chǔ)設(shè)備。
-
IO
+關(guān)注
關(guān)注
0文章
448瀏覽量
39132 -
cpu
+關(guān)注
關(guān)注
68文章
10854瀏覽量
211578 -
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209326 -
命令
+關(guān)注
關(guān)注
5文章
683瀏覽量
22011
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論