zoukankan      html  css  js  c++  java
  • Liunx 磁盘IO排查分享

    一、前言

    磁盘通常是计算机最慢的子系统,也是最容易出现性能瓶颈的地方,因为磁盘离 CPU 距离最远而且 CPU 访问磁盘要涉及到机械操作,比如转轴、寻轨等。访问硬盘和访问内存之间的速度差别是以数量级来计算的,就像1天和1分钟的差别一样。

    二、案例分析

    通过案例来讲下通用的排查流程:

    (1)通过top命令来确认是否是I/O导致系统缓慢:

    [root@ZHDYA ~]# top
    top - 15:38:32 up 40 days,  5:59,  3 users,  load average: 0.00, 0.01, 0.05
    Tasks: 128 total,   1 running, 127 sleeping,   0 stopped,   0 zombie
    %Cpu(s):  0.4 us,  0.2 sy,  0.0 ni, 99.2 id,  98 wa,  0.0 hi,  0.0 si,  0.1 st
    KiB Mem:  32520424 total, 31492136 used,  1028288 free,   412772 buffers
    KiB Swap:        0 total,        0 used,        0 free. 25902892 cached Mem
      PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                     
    18988 root      20   0 11.647g 3.611g   7896 S   2.7 11.6 507:57.30 java           
       28 root      20   0       0      0      0 S   0.3  0.0   6:43.31 rcuos/3                                                     
        1 root      20   0   49556   3412   1912 S   0.0  0.0   0:14.60 systemd                                                     
        2 root      20   0       0      0      0 S   0.0  0.0   0:00.01 kthreadd                                                     
        3 root      20   0       0      0      0 S   0.0  0.0   0:48.28 ksoftirqd/0                                                 
        5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H                                                 
        7 root      rt   0       0      0      0 S   0.0  0.0   0:00.83 migration/0                                                 
        8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh                                                       
        9 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0                                                     
       10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/1                                                     
    

    从CPU一行我们可以看到浪费在I/O Wait上的CPU百分比;这个数字越高说明越多的CPU资源在等待I/O权限

    (2)通过iostat -x 3 3 查看那块磁盘正在被写入:

    [root@ZHDYA ~]# iostat -x 3 3
    Linux 3.10.0-123.9.3.el7.x86_64 (iZ23iod5vslZ)  08/14/2017      _x86_64_        (4 CPU)
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.75    0.00    0.17    0.08    0.08   98.91
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    xvda              0.00     2.33    0.00    0.67     0.00    12.00    36.00     0.00    5.50    0.00    5.50   5.50   0.37
    xvdb              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
    xvdc              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
    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
               0.75    0.00    0.17    0.00    0.00   99.08
    Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
    xvda              0.00     3.33    0.00    1.67     0.00    34.67    41.60     0.01    3.00    0.00    3.00   1.60   100.27
    xvdb              0.00     9.00    0.00    1.67     0.00    42.67    51.20     0.01    5.40    0.00    5.40   1.80   0.30
    xvdc              0.00     0.33    0.00    0.67     0.00     4.00    12.00     0.00    2.00    0.00    2.00   2.00   0.13
    

    上述的列子中xvda的 %util(利用率)是100.27%,有进程往磁盘中写入数据。

    (3)通过iotop查找高I/O对应的进程:

    [root@ZHDYA ~]# iotop
    Total DISK READ :       0.00 B/s | Total DISK WRITE :      15.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                                                           
    18793 be/4 root        0.00 B/s    3.92 K/s  0.00 %  0.00 % java -Djava.util.logging.config.file=/usr/to~p org.apache.catalina.startup.Bootstrap start
    18987 be/4 root        0.00 B/s    3.92 K/s  0.00 %  0.00 % cronolog /guojinbao/tomcat/logs/catalina.%Y-%m-%d.out
    18796 be/4 root        0.00 B/s    3.92 K/s  0.00 %  0.00 % java -Djava.util.logging.config.file=/usr/to~p org.apache.catalina.startup.Bootstrap start
    13193 be/4 root        0.00 B/s    3.92 K/s  0.00 %  0.00 % java -Djava.util.logging.config.file=/usr/to~p org.apache.catalina.startup.Bootstrap start
    

    从上述的例子中可以看出进程号为cronolog 18987占用了大量的磁盘IO。

    (4)通过lsof -p [pid]查找由那个文件引起的IOwait:

    [root@ZHDYA ~]# lsof -p 18987
    COMMAND    PID USER   FD   TYPE DEVICE   SIZE/OFF     NODE NAME
    cronolog 18987 root  cwd    DIR 202,17      20480  2400258 /zhdya/tomcat/logs
    cronolog 18987 root  rtd    DIR  202,1       4096        2 /
    cronolog 18987 root  txt    REG  202,1      48627   152798 /usr/local/sbin/cronolog
    cronolog 18987 root  mem    REG  202,1    2107600   132826 /usr/lib64/libc-2.17.so
    cronolog 18987 root  mem    REG  202,1     160240   132819 /usr/lib64/ld-2.17.so
    cronolog 18987 root    0r  FIFO    0,8        0t0 42614018 pipe
    cronolog 18987 root    1w   CHR    1,3        0t0     1028 /dev/null
    cronolog 18987 root    2u   CHR  136,0        0t0        3 /dev/pts/0 (deleted)
    

    lsof 命令可以展示一个进程打开的所有文件,或者打开一个文件的所有进程。从这个列表中,我们可以找到具体是什么文件被写入,根据文件的大小和/proc中io文件的具体数据.

    为了确认我们的怀疑,我们可以使用 /proc文件系统,每个进程目录下都有一个叫io的文件,里边保存这和iotop类似的信息

    [root@ZHDYA ~]# cat /proc/18987/io 
    rchar: 58891582418
    wchar: 58891579778
    syscr: 46556085
    syscw: 46556077
    read_bytes: 212992
    write_bytes: 59580235776
    cancelled_write_bytes: 0
    

    read_bytes和write_bytes是这个进程从磁盘读写的字节数。这个例子中cronolog读取了212992byte(0.2M)数据,写入了59580235776bytes(55.4G)数据到磁盘上。

    (5)通过df -h /zhdya来查看服务器那块磁盘的根目录

    [root@ZHDYA ~]# df -h /zhdya/
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/xvdb1       45G   38G  4.7G  89% /zhdya
    
  • 相关阅读:
    正则表达式
    跨域请求/SpringMVC拦截器
    批量导出
    什么是2MSL以及TIME_WAIT的作用
    使用jstack精确找到异常代码的
    nettry 入站事件如何传递到下一个handler
    netty 引用计数器 ,垃圾回收
    elasticsearch 查询优化
    Spark性能优化指南-高级篇(spark shuffle)
    Broadcast与map进行join,避免shuffle,从而优化spark
  • 原文地址:https://www.cnblogs.com/liuyupen/p/13905952.html
Copyright © 2011-2022 走看看