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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

應用卡死可能是因為你的磁盤IO出了問題

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

計算機有三大件:CPU、內(nèi)存、磁盤,這三者有一個“拖后腿”的,那就是磁盤。在生產(chǎn)環(huán)境,作為數(shù)據(jù)庫角色的服務器磁盤建議拿至少4塊硬盤做RAID10,這樣既保證數(shù)據(jù)讀寫速度也保證數(shù)據(jù)的安全。如果使用普通的磁盤,即使CPU再強悍,最終的服務器性能也不會太好。



在我的職業(yè)生涯中,遇到過多次因為磁盤I/O效率低而導致MySQL查詢非常慢的問題。對于一般的小網(wǎng)站來說,MySQL的查詢隊列(用show processlist查看)不會超過100個,甚至不會超過10個,這是因為MySQL查詢速度非???。如果查詢隊列數(shù)量突然變大,可能是因為網(wǎng)站訪問量變大也可能是因為磁盤讀寫速度變慢。

本案例背景是這樣的,一臺阿里云的機器,收到告警磁盤IO達到100%,但是登錄機器后查看并沒有什么異常,也就是說磁盤飆到100%只是短暫的一會兒。既然出現(xiàn)了100%的情況,那說明肯定是有某個進程有問題。由于這個問題并不是一直出現(xiàn),所以排查起來有點困難。于是,想到寫一個監(jiān)測腳本,來實時查看磁盤IO使用情況,當發(fā)現(xiàn)異常時,則通過一些查看服務器狀態(tài)的指令來記錄具體的指標,從而分析出是什么造成的磁盤IO使用率100%。



知識點一:使用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: 為各磁盤設備的IO統(tǒng)計信息

對于cpu統(tǒng)計信息一行,我們主要看iowait的值,它指示cpu用于等待io請求完成的時間。Device中各列含義如下:

Device: 為設備名稱

tps: 為每秒進程下發(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相關信息過濾掉,只顯示磁盤相關信息,以下為各列的含義:

rrqm/s: 每秒對該設備的讀請求被合并次數(shù),文件系統(tǒng)會對讀取同塊(block)的請求進行合并

wrqm/s: 每秒對該設備的寫請求被合并次數(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隊列非空的時間比率

對于這些列,我們最應該關注的是最后一列%util,本案例中提到磁盤使用率100%,其實就是%util的值為100%。

知識點二:iotop查看哪個進程磁盤讀寫最高

iotop命令是一個用來監(jiān)視磁盤I/O使用狀況的top類工具。iotop具有與top相似的UI,其中包括PID、用戶、I/O、進程等相關信息。iotop命令就是由iotop包安裝得來的,在CentOS下安裝iotop的方法是:

# yum install -y iotop

安裝完成后直接輸入iotop回車,結(jié)果顯示跟top類似,它是動態(tài)實時查看各個進程的磁盤讀寫情況,效果如下:

# 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有幾個快捷鍵,如下:

左右箭頭:改變排序方式,默認是按IO排序。

r:改變排序順序。

o:只顯示有IO輸出的進程。

p:進程/線程的顯示方式的切換。

a:顯示累積使用量。

q:退出。

如果在shell腳本中使用iotop命令,需要加上-b選項,即不使用動態(tài)顯示的模式,當然還需要加另外幾個選項,具體用法如下:

# 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的進程。-n2表示需要統(tǒng)計2次,因為第一次不會顯示任何進程。

本案例參考腳本

#!/bin/bash
##監(jiān)控磁盤IO使用率,并找出哪個進程造成磁盤使用率很高
##該腳本需要寫一個常駐循環(huán)
##作者:阿銘
##日期:2022-11-06


#判斷機器上是否安裝iostat命令
if ! which iostat &>/dev/null
then
    yum install -y sysstat
    #如果你的機器為ubuntu,請使用這個命令:apt-get install -y sysstat
fi


#判斷機器上是否安裝iotop命令
if ! which iotop &>/dev/null
then
    yum install -y iotop
    #如果你的機器為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
    #獲取所有設備,對所有設備名遍歷
    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

當然,這個腳本還并不完美,因為一旦發(fā)生磁盤IO使用率很高的情況,則會持續(xù)一段時間,這樣就會頻繁地記錄日志。其實,根據(jù)以前案例二中我們學過的告警收斂的思路,可以把該腳本適當修改。希望你可以動手來寫一寫,這樣才能鍛煉你的邏輯思維能力。另外,你也可以把該腳本改為發(fā)告警郵件的形式。

審核編輯:湯梓紅

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

    關注

    0

    文章

    429

    瀏覽量

    39011
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10770

    瀏覽量

    210429
  • 計算機
    +關注

    關注

    19

    文章

    7292

    瀏覽量

    87519
  • 磁盤
    +關注

    關注

    1

    文章

    356

    瀏覽量

    25138

原文標題:應用卡死可能是因為你的磁盤IO出了問題

文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    晶振不起振也可能是PCB設計的鍋

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

    使用tc397進行收發(fā)的時候沒有響應是因為什么?

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

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

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

    AD仿真,這個錯誤是因為什么?

    這個錯誤是因為什么?
    發(fā)表于 11-03 21:53

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

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

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

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

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

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

    三星折疊手機Galaxy Fold造成屏幕損壞的原因是因為鉸鏈結(jié)構和灰塵

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

    警惕!的電腦變卡可能是因為在幫別人挖礦

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

    PCB銅線脫落可能是因為什么原因

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

    PBGA失效可能是因為什么原因

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

    linux虛擬機下使用IOMETER測試磁盤IO性能

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

    可能是因為蘇伊士運河被堵這個?

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

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

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

    Linux磁盤IO詳細解析

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