zoukankan      html  css  js  c++  java
  • 监控磁盘读写状况

    你有没有碰到过:没有运行任何程序,磁盘却不断执行读写动作,io指示灯常亮,各种操作迟缓甚至卡顿。碰到这种状况往往会感到束手无策,因为并不是 cpu 居高不下,可以立即结束相关进程。而突然结束进程中断磁盘 io 操作甚至可能导致正在写入的数据丢失。

    什么进程在读写磁盘?

    可能是 firefox,可能是 updatedb,也可能是正在运行的 pacman -Syu,一切皆有可能 ……
    怎么查看是什么进程在不断的读写磁盘呢?
    请使用 iotop 命令查看:
    通过输出结果我们可以清楚地知晓是什么程序在读写磁盘,速度以及命令行, pid 等信息。

    # iotop    
    Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s
        TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND              
        1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
        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 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_sched]
        8 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_bh]
        9 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
        10 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/1]
        11 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/1]
        13 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/1:0H]
        14 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/2]
        15 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/2]
        17 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/2:0H]
        18 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/3]
        19 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/3]
    
    

    使用 arrow 键移动表头焦点,使列表排序,通过 iotop 我们可以轻松辨识频繁读写磁盘的程序。
    可以用左右箭头操作,按 r 是相反方向, 按 o 是动态切换

    用法 iotop -参数

    –version 查看版本信息的
    -h, –help 查看帮助信息的
    -o, –only 只显示在划硬盘的程序
    -b, –batch 批量处理 用来记录日志的
    -n NUM  设定循环几次
    -d SEC, –delay=SEC  设定显示时间间隔
    

    进一步思考:该程序在读写什么文件?

    这个问题其实很简单,通过 lsof 命令我们就可以达到目的:

    lsof -c APPNAME      //后面接程序名称
    lsof FILE            // 也可以根据文件进行查询 
    lsof | grep PATH     // 也可以根据目录进行查询 
    

    其他命令

    top   // 亦可使用 iostat 命令查看,请安装 sysstat 以使用该命令
    
    [root@lab8107 ~]# top
    top - 14:57:05 up 11 days,  4:37,  2 users,  load average: 0.09, 0.06, 0.05
    Tasks: 220 total,   2 running, 218 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 99.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:  24711544k total,  2407312k used, 22304232k free,   219808k buffers
    Swap:  2097148k total,        0k used,  2097148k free,  1319932k cached
    
        PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND               
        2025 root      20   0  178m  10m 3488 S  3.0  0.0   0:21.43 iotop                  
        76 root      39  19     0    0    0 S  1.3  0.0 172:23.93 kipmi0                 
        5347 root      20   0  393m  59m 1836 S  1.0  0.2 164:34.60 glusterfs              
        2189 root      20   0 15228 1216  852 R  0.3  0.0   0:00.01 top                    
        9065 zabbix    20   0  505m 7732 5976 S  0.3  0.0   0:13.75 zabbix_server          
        20306 zabbix    20   0 77568 1588 1164 S  0.3  0.0   1:33.32 zabbix_agentd          
        1 root      20   0 19412 1428 1128 S  0.0  0.0   0:01.45 init                   
        2 root      20   0     0    0    0 S  0.0  0.0   0:00.10 kthreadd   
    

    在 cpu(s) 一行,我们可以看到 wa 项,它就是 io waiting,如果该值过大且持续很久,就证明遇到了 io 瓶颈。需要对软件进行优化,或对硬件进行升级。

    如何进行 io 瓶颈测试?

    大文件 io 测试命令:

    $ time dd if=/dev/zero of=test.file bs=1G count=5 // 生成 5g 大小的文件并输出时间,执行速度等信息
    

    小文件io 测试脚本:

    #!/bin/bash
        var1=1
        while test $var1 -le $1
        do
        touch $var1
        var1=`expr  $var1 + 1`
        done
    

    执行该 shell 脚本前,请先运行 iotop 等程序监控 io 状况。运行脚本:

    sh ./test.sh NUM    //    NUM 为生成的文件数
    

    为什么会产生 io 瓶颈?

    原因是多种多样的,可能是坏道,也可能是程序bug,甚至是电压不稳
    曾经碰到 io 100%,读写速率却只有 2m/s 的移动硬盘,经过检测,大概有 80% 以上区域是坏道部分,还有可能是因为 pv 的直线上升.服务器无法承受如此大的荷载而导致 io 增高,或者 gnome 的 tracker 正在制作索引,也许您忘记了后台正在 making 的程序
    由于原因是多种多样的,在此不能一一列举。读者发现 io 瓶颈后,可以对症下药,先软后硬排除问题,使系统恢复到最佳状态。

    查看磁盘读速度:

    [root@localhost ~]# /sbin/hdparm -t /dev/sda
    /dev/sda:
        Timing buffered disk reads:   84 MB in  4.21 seconds =  19.95 MB/sec
    

    磁盘坏道检测

    建议使用livecd或者liveusb对本地磁盘进行检测。如果是对移动存储设备进行检测,请umount后再进行检测,以免数据受损。

    umount /dev/sd*
    

    对磁盘进行read-only检测:

    sudo badblocks -s  -v  /dev/sd*
    

    因为需要对磁盘进行检测,所以速度非常缓慢,在检测过程中注意不要断电,不要对硬盘进行任何操作,不要移除硬盘,不要物理损伤,不要震动等。
    检测过程可以中途终止,也可以指定区块重新开始。

    sudo badblock -s -v  /dev/sd*   last  start
    

    如果您检测完成后看到

    Pass completed, 0 bad blocks found.
    那么恭喜,此磁盘通过测试,没有坏道,坏块。您可以放心使用。
    

    坏道的修复/屏蔽

    常见坏道分为以下几种类型:

    • 逻辑坏道
    • 0磁道损坏
    • 物理坏道

    坏道一般以单独或者组合形式出现。

    逻辑坏道修复

    fsck -a /dev/sd*
    

    就这么简单
    更多fsck用法您可以查看这里或者查看man手册。

    0磁道损坏修复:

    使用1磁道代替零磁道,操作危险需谨慎:
    大致流程就是全盘格式化,然后重新分区,编辑分区表使用1磁道,从而复活硬盘。

    物理坏道

    物理坏道没有修复可能性,只能进行屏蔽。
    如果您已经进行了坏道检测,那么您肯定已经知道坏道,坏块,大致位置以及坏块大小,您需要,备份硬盘数据,删除所有硬盘分区,根据坏块位置以及大小,估算出所占空间,例如共100个区块,磁盘大小为100g,20-30损坏,则坏块在20-30g这个区间
    进行分区,接上,分区应为 0-15|15-35|35-100,中间的15-35g为有坏道的分区。要对有坏道的分区进行扩容处理,数值不要过小,以免坏道被分到其他分区。隔离15-35g这个分区,即不挂载,不读写,不操作),您的磁盘可用空间减少,但是剩余空间均可用,坏道已经屏蔽
    由于物理坏道具有扩散性,所以建议尽早让磁盘“退休”才是……

    分区表修复工具

    如果您的分区表已经被损坏,建议使用testdisk进行修复。他可以快速回复分区表,真的非常好用,修复我的硬盘n次利器

    更新历史

    why when
    创建 2012年03月23日
    更新 2019年12月11日
  • 相关阅读:
    springBoot、SpringCloud 常用注解
    HashMap
    数据库连接池原理
    三次握手《《=====》》四次握手
    服务器
    二维码
    Nginx
    日志记录
    数据库事务/索引/存储引擎/锁
    Java接口
  • 原文地址:https://www.cnblogs.com/zphj1987/p/13575250.html
Copyright © 2011-2022 走看看