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
网友评论