計算機(jī)有三大件:CPU、內(nèi)存、磁盤,這三者有一個“拖后腿”的,那就是磁盤。在生產(chǎn)環(huán)境,作為數(shù)據(jù)庫角色的服務(wù)器磁盤建議拿至少4塊硬盤做RAID10,這樣既保證數(shù)據(jù)讀寫速度也保證數(shù)據(jù)的安全。如果使用普通的磁盤,即使CPU再強(qiáng)悍,最終的服務(wù)器性能也不會太好。
在我的職業(yè)生涯中,遇到過多次因?yàn)榇疟PI/O效率低而導(dǎo)致MySQL查詢非常慢的問題。對于一般的小網(wǎng)站來說,MySQL的查詢隊列(用show processlist查看)不會超過100個,甚至不會超過10個,這是因?yàn)镸ySQL查詢速度非???。如果查詢隊列數(shù)量突然變大,可能是因?yàn)榫W(wǎng)站訪問量變大也可能是因?yàn)榇疟P讀寫速度變慢。
本案例背景是這樣的,一臺阿里云的機(jī)器,收到告警磁盤IO達(dá)到100%,但是登錄機(jī)器后查看并沒有什么異常,也就是說磁盤飆到100%只是短暫的一會兒。既然出現(xiàn)了100%的情況,那說明肯定是有某個進(jìn)程有問題。由于這個問題并不是一直出現(xiàn),所以排查起來有點(diǎn)困難。于是,想到寫一個監(jiān)測腳本,來實(shí)時查看磁盤IO使用情況,當(dāng)發(fā)現(xiàn)異常時,則通過一些查看服務(wù)器狀態(tài)的指令來記錄具體的指標(biāo),從而分析出是什么造成的磁盤IO使用率100%。
知識點(diǎn)一:使用iostat查看磁盤IO
如果你系統(tǒng)中沒有iostat命令,需要安裝sysstat包,CentOS安裝方法是:
# yum install -y sysstat
iostat命令如果不加任何選項,執(zhí)行結(jié)果如下:
# iostat Linux 3.10.0-862.el7.x86_64 (web30) 2022年11月06日 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 1.50 0.00 2.10 0.07 26.12 70.21 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn vda 15.95 1.95 108.97 545936 30453675
avg-cpu: 為總體cpu使用情況統(tǒng)計信息,對于多核cpu,這里為所有cpu的平均值
Device: 為各磁盤設(shè)備的IO統(tǒng)計信息
對于cpu統(tǒng)計信息一行,我們主要看iowait的值,它指示cpu用于等待io請求完成的時間。Device中各列含義如下:
Device: 為設(shè)備名稱
tps: 為每秒進(jìn)程下發(fā)的IO讀、寫請求數(shù)量
Blk_read/s: 為每秒讀扇區(qū)數(shù)量(一扇區(qū)為512bytes)
Blk_wrtn/s: 為每秒寫扇區(qū)數(shù)量
Blk_read: 為取樣時間間隔內(nèi)讀扇區(qū)總數(shù)量
Blk_wrtn: 為取樣時間間隔內(nèi)寫扇區(qū)總數(shù)量
我們經(jīng)常會在iostat后面加上兩個數(shù)字,例如:
# iostat 1 3 Linux 3.10.0-862.el7.x86_64 (web30) 2022年11月06日 _x86_64_ (4 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 1.50 0.00 2.10 0.07 26.12 70.22 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn vda 15.96 1.96 109.10 546984 30511811 avg-cpu: %user %nice %system %iowait %steal %idle 0.79 0.00 1.58 0.53 26.58 70.53 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn vda 376.00 0.00 2324.00 0 2324 avg-cpu: %user %nice %system %iowait %steal %idle 0.78 0.00 1.04 0.00 9.14 89.03 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn vda 0.00 0.00 0.00 0 0
第一個1表示每隔1秒打印一次,3表示一共打印3次。iostat命令還有一個非常使用的選項-x,它可以顯示更多的信息,也是我最常用的一個選項,如下:
# iostat -d -x 1 2 Linux 3.10.0-862.el7.x86_64 (web30) 2022年11月06日 _x86_64_ (4 CPU) Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 0.06 0.04 15.91 1.95 109.11 13.92 0.34 21.07 4.49 21.12 1.10 1.75 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
說明:-d選項可以把cpu相關(guān)信息過濾掉,只顯示磁盤相關(guān)信息,以下為各列的含義:
rrqm/s: 每秒對該設(shè)備的讀請求被合并次數(shù),文件系統(tǒng)會對讀取同塊(block)的請求進(jìn)行合并
wrqm/s: 每秒對該設(shè)備的寫請求被合并次數(shù)
r/s: 每秒完成的讀次數(shù)
w/s: 每秒完成的寫次數(shù)
rkB/s: 每秒讀數(shù)據(jù)量(kB為單位)
wkB/s: 每秒寫數(shù)據(jù)量(kB為單位)
avgrq-sz:平均每次IO操作的數(shù)據(jù)量(扇區(qū)數(shù)為單位)
avgqu-sz: 平均等待處理的IO請求隊列長度
await: 平均每次IO請求等待時間(包括等待時間和處理時間,毫秒為單位)
svctm: 平均每次IO請求的處理時間(毫秒為單位)
%util: 采用周期內(nèi)用于IO操作的時間比率,即IO隊列非空的時間比率
對于這些列,我們最應(yīng)該關(guān)注的是最后一列%util,本案例中提到磁盤使用率100%,其實(shí)就是%util的值為100%。
知識點(diǎn)二:iotop查看哪個進(jìn)程磁盤讀寫最高
iotop命令是一個用來監(jiān)視磁盤I/O使用狀況的top類工具。iotop具有與top相似的UI,其中包括PID、用戶、I/O、進(jìn)程等相關(guān)信息。iotop命令就是由iotop包安裝得來的,在CentOS下安裝iotop的方法是:
# yum install -y iotop
安裝完成后直接輸入iotop回車,結(jié)果顯示跟top類似,它是動態(tài)實(shí)時查看各個進(jìn)程的磁盤讀寫情況,效果如下:
# iotop Total DISK READ : 0.00 B/s | Total DISK WRITE : 60.42 K/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 1419 be/4 nginx 0.00 B/s 3.55 K/s 0.00 % 0.00 % nginx: worker process 9634 be/4 www 0.00 B/s 49.76 K/s 0.00 % 0.00 % php-fpm: pool www 9646 be/4 www 0.00 B/s 7.11 K/s 0.00 % 0.00 % php-fpm: pool www 512 be/4 polkitd 0.00 B/s 0.00 B/s 0.00 % 0.00 % polkitd --no-debug 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 22 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] 3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0] 5 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H] 7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0] 8 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_bh] 9 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [rcu_sched]
對于各列的輸出,很容易理解,我們主要看第4和5兩列。iotop有幾個快捷鍵,如下:
左右箭頭:改變排序方式,默認(rèn)是按IO排序。
r:改變排序順序。
o:只顯示有IO輸出的進(jìn)程。
p:進(jìn)程/線程的顯示方式的切換。
a:顯示累積使用量。
q:退出。
如果在shell腳本中使用iotop命令,需要加上-b選項,即不使用動態(tài)顯示的模式,當(dāng)然還需要加另外幾個選項,具體用法如下:
# iotop -obn2 Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND Total DISK READ : 0.00 B/s | Total DISK WRITE : 59.67 K/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 1416 be/4 nginx 0.00 B/s 3.51 K/s 0.00 % 0.00 % nginx: worker process 1417 be/4 nginx 0.00 B/s 3.51 K/s 0.00 % 0.00 % nginx: worker process 1418 be/4 nginx 0.00 B/s 3.51 K/s 0.00 % 0.00 % nginx: worker process 1419 be/4 nginx 0.00 B/s 3.51 K/s 0.00 % 0.00 % nginx: worker process 9638 be/4 www 0.00 B/s 3.51 K/s 0.00 % 0.00 % php-fpm: pool www
說明:-o跟上面那個快捷鍵o一個意思,它的作用是只顯示有IO的進(jìn)程。-n2表示需要統(tǒng)計2次,因?yàn)榈谝淮尾粫@示任何進(jìn)程。
本案例參考腳本
#!/bin/bash ##監(jiān)控磁盤IO使用率,并找出哪個進(jìn)程造成磁盤使用率很高 ##該腳本需要寫一個常駐循環(huán) ##作者:阿銘 ##日期:2022-11-06 #判斷機(jī)器上是否安裝iostat命令 if ! which iostat &>/dev/null then yum install -y sysstat #如果你的機(jī)器為ubuntu,請使用這個命令:apt-get install -y sysstat fi #判斷機(jī)器上是否安裝iotop命令 if ! which iotop &>/dev/null then yum install -y iotop #如果你的機(jī)器為ubuntu,請使用這個命令:apt-get install -y iotop fi #定義記錄日志的目錄 logdir=/tmp/iolog [ -d $logdir ] || mkdir $logdir #定義日志名字 dt=`date+%F` #定義獲取io的函數(shù)(取5次平均值) get_io() { iostat -dx 1 5 > $logdir/iostat.log sum=0 #取最后一列的%util值循環(huán)遍歷然后相加 for ut in `grep "^$1" $logdir/iostat.log|awk '{print $NF}'|cut -d. -f1` do sum=$[$sum+$ut] done echo $[$sum/5] } #這里的true表示條件為真 while true do #獲取所有設(shè)備,對所有設(shè)備名遍歷 for d in `iostat -dx|egrep -v '^$|Device:|CPU)'|awk '{print $1}'` do io=`get_io $d` #如果io使用率大于等于80 if [ $io -ge 80 ] then #向日志里記錄時間、iostat和iotop信息 date >> $logdir/$dt cat $logdir/iostat.log >>$logdir/$dt iotop -obn2 >>$logdir/$dt echo "####################" >>$logdir/$dt fi #休眠10秒,繼續(xù)以上步驟 done sleep 10 done
當(dāng)然,這個腳本還并不完美,因?yàn)橐坏┌l(fā)生磁盤IO使用率很高的情況,則會持續(xù)一段時間,這樣就會頻繁地記錄日志。其實(shí),根據(jù)以前案例二中我們學(xué)過的告警收斂的思路,可以把該腳本適當(dāng)修改。希望你可以動手來寫一寫,這樣才能鍛煉你的邏輯思維能力。另外,你也可以把該腳本改為發(fā)告警郵件的形式。
審核編輯:湯梓紅
-
IO
+關(guān)注
關(guān)注
0文章
434瀏覽量
39050 -
cpu
+關(guān)注
關(guān)注
68文章
10806瀏覽量
210850 -
計算機(jī)
+關(guān)注
關(guān)注
19文章
7372瀏覽量
87636 -
磁盤
+關(guān)注
關(guān)注
1文章
362瀏覽量
25154
原文標(biāo)題:應(yīng)用卡死可能是因?yàn)槟愕拇疟PIO出了問題
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論