0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

應(yīng)用卡死可能是因?yàn)槟愕拇疟PIO出了問題

阿銘linux ? 來源:阿銘linux ? 作者:阿銘linux ? 2022-12-13 09:33 ? 次閱讀

計算機(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ā)告警郵件的形式。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • IO
    IO
    +關(guān)注

    關(guān)注

    0

    文章

    434

    瀏覽量

    39050
  • cpu
    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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    晶振不起振也可能是PCB設(shè)計的鍋

    PCB設(shè)計在電子產(chǎn)品中的重要性不言而喻,也因此,產(chǎn)品一旦出現(xiàn)了問題,就需要考慮是否是因?yàn)?/b>PCB設(shè)計不良的問題。比如,產(chǎn)品調(diào)試時晶振不起振,這可能是因?yàn)?/b>晶振器件本身的問題,也有可能是因?yàn)?/b>PCB設(shè)計上
    的頭像 發(fā)表于 12-29 15:46 ?1825次閱讀

    使用tc397進(jìn)行收發(fā)的時候沒有響應(yīng)是因?yàn)?/b>什么?

    在使用 tc397 進(jìn)行收發(fā)的時候,發(fā)現(xiàn)沒有響應(yīng),代碼是根據(jù)示例代碼修改,通過邏輯分析儀和示波器進(jìn)行調(diào)試的 只修改了對應(yīng)的 tx,rx 引腳,請問可能是因?yàn)?/b>什么原因
    發(fā)表于 03-05 07:45

    飛凌嵌入式ElfBoard ELF 1板卡-通用文件IO模型之write

    文件的字節(jié)數(shù),該返回值可能小于count參數(shù)值。這被稱為“部分寫”。對磁盤文件來說,造成“部分寫”的原因可能是由于磁盤已滿,或是因?yàn)?/b>進(jìn)程資源
    發(fā)表于 10-12 09:24

    AD仿真,這個錯誤是因?yàn)?/b>什么?

    這個錯誤是因?yàn)?/b>什么?
    發(fā)表于 11-03 21:53

    DM368卡死現(xiàn)象是否是因?yàn)?/b>上電順序引起的?

    張sd卡在開發(fā)板上就能正常引導(dǎo)內(nèi)核進(jìn)入文件系統(tǒng)。請問,這種卡死現(xiàn)象是否是因?yàn)?/b>上電順序引起的,上電順序不按照文檔來的話還會有什么其他潛在問題,謝謝!
    發(fā)表于 08-27 14:18

    庫UFX打開文件出錯0x1F,請問可能是哪里的問題?

    查詢磁片容量大小不對 實(shí)際是32G,結(jié)果是64G打開文件的時候,提示 0x1F/* USB存儲器操作失敗,在初始化時可能是USB存儲器不支持,在讀寫操作中可能是磁盤損壞或者已經(jīng)斷開 */這個文件是存在的 請問
    發(fā)表于 05-16 07:31

    在imxrt1176上的TICK設(shè)置為1000Hz后RTT會卡死可能是什么原因?

    *)CORE1_BOOT_ADDRESS, (uint32_t)rpmsg_lite_base, kMCMGR_Start_Synchronous);請問大神們,可能是什么原因?
    發(fā)表于 01-09 15:51

    三星折疊手機(jī)Galaxy Fold造成屏幕損壞的原因是因?yàn)?/b>鉸鏈結(jié)構(gòu)和灰塵

    Galaxy Fold采用了內(nèi)折的方案,屏幕配合中間的鉸鏈開合,實(shí)現(xiàn)折疊的效果。據(jù)iFixit表示,他們在拆開Galaxy Fold發(fā)現(xiàn),造成屏幕損壞的原因可能是因?yàn)?/b>下方的7mm缺口。這個缺口在使用中可能會導(dǎo)致灰塵、外部雜質(zhì)等進(jìn)入OLED面板內(nèi)部,然后在折疊過程中損壞屏幕
    發(fā)表于 04-27 10:00 ?4816次閱讀

    警惕!的電腦變卡可能是因?yàn)?/b>在幫別人挖礦

    知道嗎?挖礦病毒不僅吞噬電力,更能拖慢的計算能力。許多“中招”的數(shù)據(jù)中心,以及無法精確統(tǒng)計的僵尸網(wǎng)絡(luò),正在貪婪的吞噬電力、拖慢企業(yè)的計算能力。對于個人用戶而言,“礦工”可能就躲藏在你我的電腦當(dāng)中。
    的頭像 發(fā)表于 08-19 10:47 ?8032次閱讀

    PCB銅線脫落可能是因?yàn)?/b>什么原因

    PCB的銅線脫落(也是常說的甩銅)不良,PCB廠都說是層壓板的問題,要求其生產(chǎn)工廠承擔(dān)不良損失。
    的頭像 發(fā)表于 04-09 17:00 ?3409次閱讀

    PBGA失效可能是因?yàn)?/b>什么原因

    BGA在電子產(chǎn)品中已有廣泛的應(yīng)用,但在實(shí)際生產(chǎn)應(yīng)用中,以PBGA(PLASTIC BALL GRID ARRAY)塑料封裝BGA居多。
    的頭像 發(fā)表于 12-15 11:35 ?2488次閱讀

    linux虛擬機(jī)下使用IOMETER測試磁盤IO性能

    前面有分享了windows下如何使用IOMETER來測試網(wǎng)絡(luò)磁盤IO性能,今天分享一下linux下如何使用IOMETER來測試網(wǎng)絡(luò)磁盤的性能。在linux下和window下工作模式有些區(qū)別:在
    發(fā)表于 07-08 10:32 ?14次下載
    linux虛擬機(jī)下使用IOMETER測試<b class='flag-5'>磁盤</b>的<b class='flag-5'>IO</b>性能

    可能是因?yàn)?/b>蘇伊士運(yùn)河被堵這個?

    今年3月24號,由日本制造、船員來自印度、運(yùn)營公司來自中國臺灣、掛的是巴拿馬的旗、最后被荷蘭人和埃及人幫忙拖走的長賜號巨型集裝箱船在蘇伊士運(yùn)河擱淺。 蘇伊士運(yùn)河連接著紅海和地中海,全球12%的貿(mào)易要通過這個運(yùn)河,因此它常被稱為“歐亞大動脈”。但是,長賜號把這個重要的國際運(yùn)輸要道的血管給堵上了,超過200艘輪船卡在了河道里,在整整6天6夜后才再次通行。 蘇伊士運(yùn)河管理局(Suez Canal Authority)的局長 Osama Rabie 稱,擱淺期間,光是
    的頭像 發(fā)表于 04-13 10:00 ?2277次閱讀
    <b class='flag-5'>可能是因?yàn)?/b>蘇伊士運(yùn)河被堵這個?

    解決蘋果手機(jī)卡死的方法,讓從此不再頭疼

    相信很多蘋果手機(jī)用戶都會遇到手機(jī)卡死的問題,這讓人十分頭疼,本次哇哦找到了一個解決蘋果手機(jī)卡死的方法,讓從此不再為這個問題頭疼。 蘋果手機(jī)卡在蘋果logo上的原因: 這是蘋果手機(jī)用戶經(jīng)常遇到的一個
    發(fā)表于 03-14 15:23 ?5655次閱讀
    解決蘋果手機(jī)<b class='flag-5'>卡死</b>的方法,讓<b class='flag-5'>你</b>從此不再頭疼

    Linux磁盤IO詳細(xì)解析

      在講解磁盤IO前,先簡單說下什么是磁盤磁盤是可以持久化存儲的設(shè)備,根據(jù)存儲介質(zhì)的不同,常見磁盤可以分為兩類:機(jī)械
    的頭像 發(fā)表于 08-05 15:49 ?535次閱讀
    Linux<b class='flag-5'>磁盤</b><b class='flag-5'>IO</b>詳細(xì)解析