大鸟上撒点盐,生活才能多姿多彩。

Unix/Linux 系统自动化管理 磁盘管理篇(下)

Unix/Linux 磁盘 I/O 性能监控命令

蒋 鹏 和 唐 玉兵
2009 年 10 月 14 日发布

系列内容: 
 
此内容是该系列的一部分:Unix/Linux 系统自动化管理磁盘 I/O 监控是 Unix/Linux 系统管理中一个非常重要的组成部分。它可以监控吞吐量、每秒 I/O 数、磁盘利用率、服务时间等信息,并且在发现异常时,发送告警信息给系统管理员,便于系统管理员进行调整数据布局等管理活动以达到优化系统总体性能的目的。
不同的操作系统监控磁盘 I/O 的命令可能略有不同。本文将介绍 Unix/Linux 操作系统磁盘 I/O 管理命令及相关信息,并讲述 Unix/Linux 操作系统上磁盘 I/O 管理监控的自动化脚本实现。
 
 

磁盘 I/O 性能监控指标和调优方法

在介绍磁盘 I/O 监控命令前,我们需要了解磁盘 I/O 性能监控的指标,以及每个指标的所揭示的磁盘某方面的性能。磁盘 I/O 性能监控的指标主要包括:

指标 1:每秒 I/O 数(IOPS 或 tps)

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

指标 2:吞吐量(Throughput)

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

指标 3:平均 I/O 数据尺寸

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

指标 4:磁盘活动时间百分比(Utilization)

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

指标 5:服务时间(Service Time)

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

指标 6:I/O 等待队列长度(Queue Length)

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

指标 7:等待时间(Wait Time)

指磁盘读或写操作等待执行的时间,即在队列中排队的时间。如果 I/O 请求持续超出磁盘处理能力,意味着来不及处理的 I/O 请求不得不在队列中等待较长时间。
通过监控以上指标,并将这些指标数值与历史数据,经验数据以及磁盘标称值对比,必要时结合 CPU、内存、交换分区的使用状况,不难发现磁盘 I/O 潜在或已经出现的问题。但如果避免和解决这些问题呢?这就需要利用到磁盘 I/O 性能优化方面的知识和技术。限于本文主题和篇幅,仅列出一些常用的优化方法供读者参考:

  1. 调整数据布局,尽量将 I/O 请求较合理的分配到所有物理磁盘中。

  2. 对于 RAID 磁盘阵列,尽量使应用程序 I/O 等于条带尺寸或者为条带尺寸的倍数。并选取合适的 RAID 方式,如 RAID10,RAID5。

  3. 增大磁盘驱动程序的队列深度,但不要超过磁盘的处理能力,否则,部分 I/O 请求会因为丢失而重新发出,这将降低性能。

  4. 应用缓存技术减少应用存取磁盘的次数,缓存技术可应用在文件系统级别或者应用程序级别。

  5. 由于多数数据库中已包括经优化后的缓存技术,数据库 I/O 宜直接存取原始磁盘分区(raw partition)或者利用绕过文件系统缓存的 DIO 技术(direct IO)

  6. 利用内存读写带宽远比直接磁盘 I/O 操作性能优越的特点,将频繁访问的文件或数据置于内存中。

磁盘 I/O 性能监控命令简介

Unix/Linux 提供了两个非常有用的用于磁盘 I/O 性能监控的命令:iostat 和 sar。
iostat 命令主要通过观察物理磁盘的活动时间以及他们的平均传输速度,监控系统输入 / 输出设备负载。根据 iostat 命令产生的报告,用户可确定一个系统配置是否平衡,并据此在物理磁盘与适配器之间更好地平衡输入 / 输出负载。iostat 工具的主要目的是通过监控磁盘的利用率,而探测到系统中的 I/O 瓶颈。不同操作系统命令格式输出格式略有不同,管理员可以通过查看用户手册来确定它的用法。
sar 命令报告 CPU 的使用情况,I/O 以及其它系统行为。sar 命令可以收集,报告以及保存系统行为信息。以这种方式收集到的数据对于确定系统的时间周期特征和决定峰值使用时间是很有用的。但要注意的是,sar 命令自己运行时会产生相当数量的读写,因此最好在没有工作量的情况下运行 sar 统计,看看 sar 对总的统计数字有多大的影响。
AIX 环境下,iostat 和 sar 位于文件集 bos.acct 中,是基本系统 (Base Operating System) 的一部分,在缺省安装情况下无需进行任何配置或任何额外包安装。
Linux 环境下,iostat 和 sar 包含在 sysstat 包中。sysstat 是 Linux 系统中的常用工具包。不同的 Linux 系统或不同的硬件平台,安装包名字和具体命令可能会有微小差异。清单1为一个在 RHEL5.3 上安装 sysstat 包的例子。

清单1:在 RHEL5.3 上安装 sysstat 包

 

在 AIX 系统上监控磁盘 I/O 状况
清单 2 与清单 3 是在一个负载较重的 AIX 节点上运行 iostat 和 sar 的执行结果,每个命令时间间隔设定为 10 秒,总共执行3次。
清单 2:在 AIX6.1 系统上利用 iostat 查看磁盘 I/O 负载

主要字段含义如下:
% tm_act 表示物理磁盘处于活动状态的时间百分比,即磁盘利用率。
Kbps 表示以 KB 每秒为单位的传输(读或写)到驱动器的数据量。
Tps 表示每秒物理磁盘的 I/O 次数。
Kb_read 在设定时间间隔内读取的数据量,以 KB 为单位。
Kb_wrtn 在设定时间间隔内写入的数据量,以 KB 为单位。
清单 3: 在 AIX6.1 系统上使用 sar – d 报告磁盘 I/O 信息

输出的主要字段含义如下:
%busy 处理 I/O 请求所占用的时间,以百分比表示。
avque 在指定的时间间隔没有完成的请求数量的平均值。
r+w/s 每秒 I/O 读写总数。
Kbs/s 每秒字节数,以 KB 为单位。
avwait 传送请求等待队列空闲的平均时间,以毫秒为单位。
avserv 完成 I/O 请求所需平均时间,以毫秒为单位。
本例显示 hdisk1 的利用率居中,每秒 I/O 数居中,但吞吐量最小;hdisk2 的利用率最小,每秒 I/O 数最小,但吞吐量比 hdisk1 高;hdisk3 I/O 利用率最大,每秒 I/O 数和吞吐量也最大,I/O 平均等待时间最长,服务时间也最长。hdisk1 的平均 I/O 尺寸为 1932/31= 62 KB;hdisk2 的平均 I/O 尺寸为 10122/9= 1125 KB;hdisk3 的平均 I/O 尺寸为 39678/75= 529 KB。从中可见,小块随机存取对每秒 I/O 数影响较大,大块顺序读取对吞吐量影响较大。hdisk3 利用率超过 70% 警戒线,虽然其平均 I/O 尺寸比 hdisk2 小约一半,但服务时间却比 hdisk2 增加约 30%,同时等待时间也较长,应该对其采取管理措施。
在 Linux 系统上监控磁盘 I/O 状况
清单 4 与清单 5 是在一个负载较轻的 Linux 节点上 iostat 和 sar 的执行结果,时间间隔设定为 10 秒,总共执行 3 次。
清单 4:在 RHEL5.3 系统上利用 iostat 查看磁盘 I/O 负载

主要字段含义如下:
r/s 每秒读操作数。
w/s 每秒写操作数。
rsec/s 每秒从设备读取的扇区数量。
wsec/s 每秒向设备写入的扇区数量。
avgrq-sz I/O 请求的平均扇区数。
avgqu-sz I/O 请求的平均队列长度。
await I/O 请求的平均等待时间,单位为毫秒。
svctm I/O 请求的平均服务时间,单位为毫秒。
%util 处理 I/O 请求所占用的时间的百分比,即设备利用率。
清单 5:在 RHEL5.3 系统上利用 sar 报告磁盘 I/O 信息

输出的主要字段含义如下:
DEV 正在监视的块设备
tps 每秒钟物理设备的 I/O 传输总量
rd_sec/s 每秒从设备读取的扇区数量
wr_sec/s 每秒向设备写入的扇区数量
avgrq-sz I/O 请求的平均扇区数
avgqu-sz I/O 请求的平均队列长度
await I/O 请求的平均等待时间,单位为毫秒
svctm I/O 请求的平均服务时间,单位为毫秒
%util I/O 请求所占用的时间的百分比,即设备利用率
本例可见磁盘 sda 的 I/O 操作较少,仅分区 sda3 存在 I/O 操作,且利用率低于 1%,平均 I/O 尺寸为 0.15 * 512 = 77B,I/O 操作以小块写入为主。本例中未发现异常输出,不需对磁盘采取管理措施。
Unix/Linux 系统磁盘 I/O 性能监控自动化脚本示例
前文介绍了 AIX 与 Linux 磁盘 I/O 监控的手段,本节将结合实例介绍磁盘 I/O 监控的自动化脚本的设计和实现。
设计思路
1 . 监控指标
前文介绍了多个监控指标,比如吞吐量,每秒 I/O 数,平均单次 I/O 响应时间,磁盘利用率等,用户可以根据自身系统和应用的特点选取监控指标。下文将以磁盘利用率为例进行监控脚本的设计。
2 .监控手段
对于 AIX, 命令“iostat -d”的输出字段“% tm_act”反映磁盘利用率;对于 Linux, 命令“iostat -d -x”的输出字段“%util”反映磁盘利用率。监控的频次可以通过“iostat”命令本身的参数指定。

  1. 告警机制

一般来说,如果磁盘使用率长时间达到 75% 或 80%, 通常会视为磁盘较忙,一般需进行调整磁盘布局,调整应用使用分配等管理活动,如果磁盘使用率偶尔较高,只需要继续监视即可。因此告警既不能对于偶发现象频繁告警,也不能放过持续时间较长的现象,本例的告警机制设定为“在一定时间间隔内的一定比例的监控记录超出设定的磁盘利用率门限值即告警”
4 .日志
要保留磁盘 I/O,分析活动,告警信息等原始信息,便于以后进行问题分析,定位。
磁盘 I/O 分析和告警自动脚本
结合上文设计思路,笔者开发了磁盘 I/O 分析和告警脚本 I/OAnalyzer.sh, 我们的脚本在 RHEL 5.3、SLES 11、AIX 5.3 和 AIX 6.1 上测试通过。
脚本 IOAnalyzer.sh 的第一部分先进行了初始化,检验并处理输入参数,对未输入的参数指定默认值。
清单 6. IOAnalyzer.sh 脚本初始化部分
#!/bin/sh
# ================================================================
# Script Name:  IOAnalyzer.sh
# Desciption:   To analyze output of ‘iostat -d’, send an alert to admin
#              if disk utilization counter reach defined threshold
# Date:         May 19, 2009
#================================================================
 
# —————————————————————–
# Function definitions…                                定义函数
#—————————————————————-
 
function usage {
echo “”
echo “usage: IOAnalyzer.sh -i inIostatFile [ -l outLogFile ] \
[ -a outAlertFile ] [ -u dishUtil ] [ -r rateGEUtil ]”
echo “”
echo “For example: IOAnalyzer.sh -i /tmp/iostat.out -l /tmp/logFile \
-a /tmp/aletFile -u 80 -r 70″
echo “For AIX, please run ‘iostat -d [ <interval> [ <count> ] \
to create inIostatFile”
echo “For Linux, please run ‘iostat -d -x [ <interval> [ <count> ] \
to create inIostatFile”
exit 1
}
 
# —————————————————————-
# Process command-line arguments                        命令行参数处理
# —————————————————————-
while getopts :i:l:a:u:r: opt
do
case “$opt” in
i) inIostatFile=”$OPTARG”;;
l) outLogFile=”$OPTARG”;;
a) outAlertFile=”$OPTARG”;;
u) diskUtil=”$OPTARG”;;
r) rateGEUtil=”$OPTARG”;;
\?) usage;;
esac
done
 
#—————————————————————-
# Input validation                                       输入验证
#—————————————————————-
 
if [ ! -f “$inIostatFile” ]
then
echo “error: invalid Augument inIostatFile in OPTION -i “
usage
exit 1
fi
#—————————————————————
 
# Set values, if unset                                   设置变量
# —————————————————————-
 
outLogFile=${outLogFile:-${inIostatFile}.log}
outAlertFile=${outAlertFile:-${inIostatFile}.alert}
diskUtil=${diskUtil:-’80’}
rateGEUtil=${rateGEUtil:-’60’}
接下来, IOAnalyzer.sh 脚本查询日志,通过计算起止行的办法定位 IO 输出文件的待分析文本。
清单 7. IOAnalyzer.sh 脚本定位 I/O 输出文件待分析部分
# —————————————————————-
# Identify the lines to be analyzed between StartLine and Endline
# 定位日志中待分析文本
 
# —————————————————————-
 
if [ ! -f “$outLogFile” ] || [ ! tail -1 “$outLogFile”|grep ‘ENDLINE’]
then
StartLineNum=1;
else
CompletedLine=tail -1 "$outLogFile" | grep 'ENDLINE' | \
awk '{print $4}'|cut -d: -f2

StartLineNum=expr 1 + $CompletedLine
fi
 
eval “sed -n ‘${StartLineNum},\$p’ $inIostatFile” > ${inIostatFile}.tail
 
LineCount=cat ${inIostatFile}.tail|wc -l|awk '{print $1}'
EndLineNum=expr $LineCount + $StartLineNum
清单 7 中的脚本实现了按行分析上文定位的 iostat 输出,如果某行磁盘利用率小于先前定义的门限值,则在行尾标记“OK”,如果某行磁盘利用率大于等于先前定义的门限值,则在行尾标记“Alarm”。并且脚本中对于 AIX 和 Linux 输出格式和磁盘命名的不同作了相应处理。
清单 8. IOAnalyzer.sh 按行分析 iostat 输出
—————————————————————-
# Analyze ‘iostat’ output, append “Alarm” or “OK” at the end of each# line
 
# —————————————————————-
OS=uname
case “$OS” in
AIX)
diskUtilLabel=”% tm_act”
diskUtilCol=2
diskPrefix=”hdisk”
;;
Linux)
diskUtilLabel=”%util”
diskUtilCol=14
diskPrefix=”hd|sd”
;;
*)      echo “not support $OS operating system!”
exit 1;
;;
esac
 
eval “cat ${inIostatFile}.tail | egrep ‘${diskPrefix}’ \
| awk ‘{if ( \$${diskUtilCol} * 100 < ${diskUtil} ) \
{\$20 = \”OK\”; print \$1\”\t\”\$${diskUtilCol}\”\t\”\$20 } \
else {\$20 = \”Alarm\”; print \$1\”\t\”\$${diskUtilCol}\”\t\”\$20 } }'” \
> ${outLogFile}.tmp
下文脚本给出一个告警触发的例子,如果过高的磁盘利用率计数占总分析行数的比率达到或超出预定的比率,脚本会给 root 用户发一封告警邮件。
清单 9. IOAnalyzer.sh 触发告警
# Send admin an alert if disk utilization counter reach defined
# threshold
 
# —————————————————————-
Alert=”NO”
for DISK in cut -f1  ${outLogFile}.tmp | sort -u
do
numAlarm=cat ${outLogFile}.tmp | grep "^$DISK.*Alarm$" |wc -l
numRecord=cat ${outLogFile}.tmp | grep "^$DISK" |wc -l
rateAlarm=expr $numAlarm \* 100 / $numRecord
if [ $rateAlarm -ge $rateGEUtil ];then
echo “DISK:${DISK}      TIME:date +%Y%m%d%H%M  \
RATE:${rateAlarm}      THRESHOLD:${rateGEUtil}” >> ${outAlertFile}.tmp
Alert=”YES”
fi
done
if [ $Alert= “YES” ];then
cat ${outAlertFile}.tmp >> ${outAlertFile}
mail -s “DISK IO Alert”  root@localhost< ${outAlertFile}.tmp
fi
最后,脚本将分析活动归档,便于下次分析时定位起始行;另外,分析过程中产生的文件将被删除。
清单 10. IOAnalyzer.sh 记录分析活动日志和清除临时文件
 
#—————————————————————-
# Clearup temporary files and logging
# —————————————————————-
 
echo “IOSTATFILE:${inIostatFile}        TIME:date +%Y%m%d%H%M  \
STARTLINE:${StartLineNum}       ENDLINE:${EndLineNum}   ALERT:${Alert}” \
 
>> ${outLogFile}
 
rm -f ${outLogFile}.tmp
rm -f ${outAlertFile}.tmp
rm -f ${inIostatFile}.tail
 
exit 0
 
脚本使用示例
以下为 IOAnalyzer.sh 脚本在 AIX 上使用示例
1 .后台执行 iostat, 并将输出重定向到文件中
清单 11. 后台执行 iostat
nohup iostat -d 5 > /root/iostat.out &
(对于 Linux,运行 iostat -d – x 5 > /root/iostat.out &)
2 .编辑 crontab 文件,每 10 分钟运行一次 IOAnalyzer.sh 脚本,-u 70 –r 80,表示在距上次运行 IOAnalyzer.sh 至今产生的某磁盘的监控记录中的 80% 使用率达到或超过 70%,即发出告警。告警日志和分析日志可通过 IOAnalyzer.sh 的 –l –a 参数指定,本例保持默认值,即在 iostat 的输出文件所在目录产生 iostat.out.log 和 iostat.out.alert 文件。
清单 12. 编辑 crontab
crontab – e
0,10,20,30,40,50 * * * * /root/IOAnalyzer.sh -i /root /iostat.out -u 70 \
-r 80>/tmp/iostat.out 2>&1
3 .用户收到告警邮件,需要进一步查询历史记录时,可查看日志文件
清单 13. 查看日志文件
cat /root/iostat.out.log | more
IOSTATFILE: /root/iostat.out TIME:200905200255 STARTLINE:7220 ENDLINE:7580  ALARM:YES
IOSTATFILE: /root/iostat.out  TIME:200905200300  STARTLINE:7581 ENDLINE:7940 ALARM:YES
IOSTATFILE:/root/iostat.out TIME:200905200305  STARTLINE:7941 ENDLINE:8300 ALARM:YES
 
[AIXn01]> cat /root/iostat.out.alert | more
DISK:hdisk4     TIME:200905200250         RATE:84      THRESHOLD:70
DISK:hdisk5     TIME:200905200250         RATE:84      THRESHOLD:70
DISK:hdisk6     TIME:200905200250         RATE:84      THRESHOLD:70
小结
本文介绍了 Unix/Linux 上的磁盘 I/O 管理命令并通过一个自动化监控脚本详细介绍了如何实现磁盘 I/O 的自动化监控管理。磁盘 I/O 的自动化监控能帮助系统管理员及时发现磁盘 I/O 的异常问题,管理员可通过采取相应的措施使得问题得以消除和缓解。

点赞

发表评论