美文网首页
17、Linux IO讲解

17、Linux IO讲解

作者: 一个反派人物 | 来源:发表于2021-01-16 14:51 被阅读0次

    1 IO性能参数

    1.1 每秒 I/O 数(IOPS 或 tps)

    对于磁盘来说,一次磁盘的连续读或者连续写称为一次磁盘 I/O, 磁盘的 IOPS 就是每秒磁盘连续读次数和连续写次数之和。当传输小块不连续数据时,该指标有重要参考意义。

    1.2 吞吐量(Throughput)

    指硬盘传输数据流的速度,传输数据为读出数据和写入数据的和。其单位一般为 Kbps, MB/s 等。当传输大块不连续数据的数据,该指标有重要参考作用。

    1.3 平均 I/O 数据尺寸

    平均 I/O 数据尺寸为吞吐量除以 I/O 数目,该指标对揭示磁盘使用模式有重要意义。一般来说,如果平均 I/O 数据尺寸小于 32K,可认为磁盘使用模式以随机存取为主;如果平均每次 I/O 数据尺寸大于 32K,可认为磁盘使用模式以顺序存取为主。

    1.4 磁盘活动时间百分比(Utilization)

    磁盘处于活动时间的百分比,即磁盘利用率,磁盘在数据传输和处理命令(如寻道)处于活动状态。磁盘利用率与资源争用程度成正比,与性能成反比。也就是说磁盘利用率越高,资源争用就越严重,性能也就越差,响应时间就越长。一般来说,如果磁盘利用率超过 70%,应用进程将花费较长的时间等待 I/O 完成,因为绝大多数进程在等待过程中将被阻塞或休眠。

    1.5 服务时间(Service Time)

    指磁盘读或写操作执行的时间,包括寻道,旋转时延,和数据传输等时间。其大小一般和磁盘性能有关,CPU/ 内存的负荷也会对其有影响,请求过多也会间接导致服务时间的增加。如果该值持续超过 20ms,一般可考虑会对上层应用产生影响。

    1.6 I/O 等待队列长度(Queue Length)

    指待处理的 I/O 请求的数目,如果 I/O 请求压力持续超出磁盘处理能力,该值将增加。如果单块磁盘的队列长度持续超过 2,一般认为该磁盘存在 I/O 性能问题。需要注意的是,如果该磁盘为磁盘阵列虚拟的逻辑驱动器,需要再将该值除以组成这个逻辑驱动器的实际物理磁盘数目,以获得平均单块硬盘的 I/O 等待队列长度。

    1.7 等待时间(Wait Time)

    指磁盘读或写操作等待执行的时间,即在队列中排队的时间。如果 I/O 请求持续超出磁盘处理能力,意味着来不及处理的 I/O 请求不得不在队列中等待较长时间。

    2 磁盘 I/O 性能监控命令iostat

    iostat包含在sysstat包中

    2.1 常用参数

    用法: iostat [ 选项 ] [ <时间间隔> [ <次数> ] ]
    -c 只显示cpu统计信息,即单独输出avg-cpu结果,不包括device结果
    -d 单独输出device结果,不包括cpu结果
    -x 输出更详细的io统计信息
    iostat -d 1每秒显示一次device的io信息

    2.2 iostat 输出参数

    avg-cpu:总体cpu使用情况统计,对于多核cpu,这里为所有cpu的平均值。重点关注iowait值,表示CPU用于等待io请求的完成时间。
    %user:CPU处于用户模式下的时间百分比
    %nice:CPU处于带Nice值用户模式下的时间百分比
    %system:CPU处于系统模式下的时间百分比
    %iowait:CPU等待输入输出完成时间百分比
    %steal:管理程序维护另一个虚拟处理器时,虚拟CPU无意识等待时间百分比
    %idle:CPU空闲时间百分比

    Device:设备名称
    tps:每秒进程下发的IO读、写请求数量
    kB_read/s:每秒从驱动器读入的数据量,单位为K
    kB_wrtn/s:每秒从驱动器写入的数据量,单位为K
    kB_read:读入数据总量,单位为K
    kB_wrtn:写入数据总量,单位为K

    2.3 iostat -x输出参数

    rrqm/s:每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
    wrqm/s:每秒对该设备的写请求被合并次数
    r/s:每秒完成的读取次数
    w/s:每秒完成的写次数
    rkB/s:每秒读取数据量(kB为单位)
    wkB/s:每秒写数据量(kB为单位)
    aqu-sz(sysstat12版本):平均等待处理的IO请求队列长度,如果持续大于2,说明有瓶颈
    svctm(sysstat10版本):平均每次设备I/O操作的服务时间 (毫秒)
    %util:采样周期内用于IO操作的时间比率,即IO队列非空的时间比率

    3 用shell脚本监控iostat

    #!/bin/bash
    
    #函数:监控磁盘IO队列长度
    function io_monitor {
    #设备数量
    dev_num=`iostat -d | egrep "sd." | wc -l`
    #打印磁盘IO队列长度
    iostat -d -x 1 3 | egrep "sd."  | tail -n +$[dev_num+1] | awk '{io_len[$1]+=$(NF-1)}END{for(i in io_len){print i,io_len[i]}}'
    }
    
    #函数:根据队列长度,产生输出告警
    function io_alarm {
    #创建临时文件,用于存储io信息结果,消息格式是"sdx io队列长度"
    TEMP_FILE=`mktemp temp_file.XXX`
    io_monitor > $TEMP_FILE
    #读入io信息的每一行
    while read line
    do
            DEV=`echo $line | awk '{print $1}'`
            #队列长度是2位浮点数,只取整数部分
            LEN=`echo $line | awk -F "[ \.]" '{print $2}'`
            #如果大于等于2,报警
            if [ $LEN -ge 2 ]
            then
                    echo "Dev $DEV has io problem"
            else
                    echo "Dev $DEV is ok"
            fi
    done<$TEMP_FILE
    rm -f $TEMP_FILE
    }
    io_alarm
    

    4 iotop监控io较高的进程

    4.1 常用参数

    -o:只显示正在产生I/O的进程或线程,运行过程中,可以通过按o随时切换
    -b:非交互模式下运行,一般用来记录日志
    -n NUM:设置监控(显示)NUM次,主要用于非交互模式。默认无限
    -d SEC:设置显示的间隔秒数,支持非整数
    -p PID:只显示指定进程(PID)的信息
    -u USER:显示指定的用户的进程的信息
    -k:显示使用KB单位
    -t:非交互模式下,加上时间戳
    -q:只在第一次监测时显示列名. 去除头部一些行:这个参数可以设置最多3次来移除头部行:-q列头部只在最初交互显示一次;-qq列头部不显示;-qqq,I/O的总结不显示
    -P:只显示进程,不显示所有线程

    4.2 iotop交互模式快捷键

    r:反向排序,iotop -b -o -n 10 -d 5 -t
    o:切换至选项--only,
    p:切换至--processes选项,
    a:切换至--accumulated选项
    q:退出
    i:改变线程的优先级

    4.3 使用例子

    只显示正在产生I/O的进程
    iotop -o
    使用非交互模式将iotop命令输出信息
    iotop -b -o -n 10 -d 5 -t -k -qqq -p PID

    5 使用dd评估磁盘io性能

    dd if=/dev/zero of=/root/bigfile bs=1M count=1024
    
    1024+0 records in
    1024+0 records out
    1073741824 bytes (1.1 GB) copied, 0.654028 s, 1.6 GB/s
    

    相关文章

      网友评论

          本文标题:17、Linux IO讲解

          本文链接:https://www.haomeiwen.com/subject/wysaaktx.html