17、Linux IO讲解

2021-01-16  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读