• 性能案例分析 | 查看哪些进程在大量读写磁盘-I/O很高问题排查


    作者:布丁缘 https://www.ddkiss.com/archives/68.html


    Linux 有很多运维诊断工具,有些用起来很简单,有些功能很强大用起来就有些麻烦。比如I/O等待问题,原因可能有很多种,也很难用某一种工具就能定位。特别是如何找到到底是哪个进程读写了哪个文件引起的?

    最近,从监控上看总是在上午10点左右I/O负载突然就升起来了,连远程SSH都卡住。因为ECS服务器内存有限,我启用了SWAP,内存不足时不至于会崩溃,系统性能肯定有所下降。

    说明:在Centos7中,top ps等是系统自带的工具,iostat iotop lsof等都是需要自行安装的。

    确实系统负载上升是否由于I/O异常导致

    最简单的是用top命令,比如

    1
    2
    3
    4
    Tasks: 102 total,   1 running, 101 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 0.7 us, 0.2 sy, 0.0 ni, 0.2 id, 98.9 wa, 0.0 hi, 0.0 si, 0.0 st
    KiB Mem : 1016396 total, 62276 free, 891072 used, 63048 buff/cache
    KiB Swap: 1048572 total, 804428 free, 244144 used. 8100 avail Mem

    其中wa也就是iowait参数所表示的,有多少比例的CPU在等待I/O

    找到具体读写的是哪个磁盘

    最简单的是iostat命令,比如

    1
    2
    3
    4
    5
    6
    7
    8
    $ 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

    其中-x知指明输出更加详细的信息。2 5表示间隔2秒统计一次总共输出5次。第一行结果是自系统启动以来的统计值,通常排查突发的I/O异常时可忽略。重点看%util列,表示进程使用I/O的比例。

    找出引起高I/O的进程

    最简单的是iotop命令,比如

    1
    2
    3
    4
    Total DISK READ: 404.95 K/s | Total DISK WRITE: 9.91 M/s
    TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
    3153 be/3 root 0.00 B/s 3.78 K/s 0.00 % 6.23 % [jbd2/sda5-8]
    10287 be/4 mysql 253.57 K/s 1858.24 K/s 0.00 % 3.73 % mysqld --defaults-file=/etc/my.cnf --basedir=/opt/my~--pid-file

    iotop命令确实是一个很好用的工具,但是很多Linux发行版中默认并没有安装。如果系统里没有这个命令,又不想安装时,怎么办?有没有更简单的方式?

    能够实现iotop类型功能的ps命令

    首先看下进程状态编码

    1
    2
    3
    4
    5
    6
    7
    8
    PROCESS STATE CODES
    D uninterruptible sleep (usually IO)
    R running or runnable (on run queue)
    S interruptible sleep (waiting for an event to complete)
    T stopped, either by a job control signal or because it is being traced.
    W paging (not valid since the 2.6.xx kernel)
    X dead (should never be seen)
    Z defunct ("zombie") process, terminated but not reaped by its parent.

    注意到,如果进程正在等待I/O,进行的状态码经常为D。通过这个信息,我们可以大概估算出哪些进程在I/O等待中,比如

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@myos ~]# for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done
    ----
    ----
    ----
    D 27456 php-fpm: pool www
    ----
    ----
    ----
    ----
    ----
    ----
    ----

    这里就发现进行 27456 可能有问题。但等待I/O也不一定说明它在疯狂读写磁盘。为了确定它确实读写很多,可以用/proc目录下的信息来定位,比如

    1
    2
    3
    4
    5
    6
    7
    8
    [root@myos ~]# cat /proc/27456/io
    rchar: 42857442
    wchar: 35657666
    syscr: 44932
    syscw: 9744
    read_bytes: 1530859520
    write_bytes: 13824000
    cancelled_write_bytes: 1249280

    需要注意的是,不同的线程参考值不一样。这个得具体问题具体分析。

  • 相关阅读:
    DATAGUARD物理standby角色切换(笔记二)
    深入了解start with .....connect by (一)
    oracle lob字段处理
    InstallShield12命令行模式编译工程的几点问题总结Emma友情赞助转帖
    Installshield实用小函数为字符串截掉头尾空格
    使用Java Service Wrapper将Java程序发布成Windows Service艾泽拉斯之海洋女神出品
    Kevin专栏自定义安装对话框的界面
    Kevin专栏如何制作试用版安装包
    【海洋女神原创】关于installshield“完美卸载”的改进方法
    Installshield的相对路径问题
  • 原文地址:https://www.cnblogs.com/wyf0518/p/12213790.html
Copyright © 2020-2023  润新知