您的位置:首页 > 运维架构 > Linux

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

2013-09-26 09:06 441 查看
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:服务时间(ServiceTime)指磁盘读或写操作执行的时间,包括寻道,旋转时延,和数据传输等时间。其大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致服务时间的增加。如果该值持续超过20ms,一般可考虑会对上层应用产生影响。指标6:I/O等待队列长度(QueueLength)指待处理的I/O请求的数目,如果I/O请求压力持续超出磁盘处理能力,该值将增加。如果单块磁盘的队列长度持续超过2,一般认为该磁盘存在I/O性能问题。需要注意的是,如果该磁盘为磁盘阵列虚拟的逻辑驱动器,需要再将该值除以组成这个逻辑驱动器的实际物理磁盘数目,以获得平均单块硬盘的I/O等待队列长度。指标7:等待时间(WaitTime)指磁盘读或写操作等待执行的时间,即在队列中排队的时间。如果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宜直接存取原始磁盘分区(rawpartition)或者利用绕过文件系统缓存的DIO技术(directIO)
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中,是基本系统(BaseOperatingSystem)的一部分,在缺省安装情况下无需进行任何配置或任何额外包安装。Linux环境下,iostat和sar包含在sysstat包中。sysstat是Linux系统中的常用工具包。不同的Linux系统或不同的硬件平台,安装包名字和具体命令可能会有微小差异。清单1为一个在RHEL5.3上安装sysstat包的例子。iostat-d-x103Device:rrqm/swrqm/sr/sw/srsec/swsec/savgrq-szavgqu-szawaitsvctm%util
主要字段含义如下:r/s每秒读操作数。w/s每秒写操作数。rsec/s每秒从设备读取的扇区数量。wsec/s每秒向设备写入的扇区数量。avgrq-szI/O请求的平均扇区数。avgqu-szI/O请求的平均队列长度。awaitI/O请求的平均等待时间,单位为毫秒。svctmI/O请求的平均服务时间,单位为毫秒。%util处理I/O请求所占用的时间的百分比,即设备利用率。
#sar-pd103
输出的主要字段含义如下:DEV正在监视的块设备tps每秒钟物理设备的I/O传输总量rd_sec/s每秒从设备读取的扇区数量wr_sec/s每秒向设备写入的扇区数量avgrq-szI/O请求的平均扇区数avgqu-szI/O请求的平均队列长度awaitI/O请求的平均等待时间,单位为毫秒svctmI/O请求的平均服务时间,单位为毫秒%utilI/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”命令本身的参数指定。3.告警机制一般来说,如果磁盘使用率长时间达到75%或80%,通常会视为磁盘较忙,一般需进行调整磁盘布局,调整应用使用分配等管理活动,如果磁盘使用率偶尔较高,只需要继续监视即可。因此告警既不能对于偶发现象频繁告警,也不能放过持续时间较长的现象,本例的告警机制设定为“在一定时间间隔内的一定比例的监控记录超出设定的磁盘利用率门限值即告警”4.日志要保留磁盘I/O,分析活动,告警信息等原始信息,便于以后进行问题分析,定位。磁盘I/O分析和告警自动脚本结合上文设计思路,笔者开发了磁盘I/O分析和告警脚本I/OAnalyzer.sh,我们的脚本在RHEL5.3、SLES11、AIX5.3和AIX6.1上测试通过。脚本IOAnalyzer.sh的第一部分先进行了初始化,检验并处理输入参数,对未输入的参数指定默认值。清单6.IOAnalyzer.sh脚本初始化部分viewsourceprint?
01.
#!/bin/sh
02.
#================================================================
03.
#ScriptName:IOAnalyzer.sh
04.
#Desciption:Toanalyzeoutputof'iostat-d',sendanalerttoadmin
05.
#ifdiskutilizationcounterreachdefinedthreshold
06.
#Date:May19,2009
07.
#================================================================
08.
09.
#-----------------------------------------------------------------
10.
#Functiondefinitions...定义函数
11.
#----------------------------------------------------------------
12.
13.
function
usage{
14.
echo
""
15.
echo
"usage:IOAnalyzer.sh-iinIostatFile[-loutLogFile]\
16.
[-aoutAlertFile][-udishUtil][-rrateGEUtil]"
17.
echo
""
18.
echo
"Forexample:IOAnalyzer.sh-i/tmp/iostat.out-l/tmp/logFile\
19.
-a/tmp/aletFile-u80-r70"
20.
echo
"ForAIX,pleaserun'iostat-d[<interval>[<count>]\
21.
tocreateinIostatFile"
22.
echo
"ForLinux,pleaserun'iostat-d-x[<interval>[<count>]\
23.
tocreateinIostatFile"
24.
exit
1
25.
}
26.
27.
#----------------------------------------------------------------
28.
#Processcommand-linearguments命令行参数处理
29.
#----------------------------------------------------------------
30.
while
getopts
:i:l:a:u:r:opt
31.
do
32.
case
"$opt"
in
33.
i)inIostatFile=
"$OPTARG"
;;
34.
l)outLogFile=
"$OPTARG"
;;
35.
a)outAlertFile=
"$OPTARG"
;;
36.
u)diskUtil=
"$OPTARG"
;;
37.
r)rateGEUtil=
"$OPTARG"
;;
38.
\?)usage;;
39.
esac
40.
done
41.
42.
#----------------------------------------------------------------
43.
#Inputvalidation输入验证
44.
#----------------------------------------------------------------
45.
46.
if
[!-f
"$inIostatFile"
]
47.
then
48.
echo
"error:invalidAugumentinIostatFileinOPTION-i"
49.
usage
50.
exit
1
51.
fi
52.
#---------------------------------------------------------------
53.
54.
#Setvalues,ifunset设置变量
55.
#----------------------------------------------------------------
56.
57.
outLogFile=${outLogFile:-${inIostatFile}.log}
58.
outAlertFile=${outAlertFile:-${inIostatFile}.alert}
59.
diskUtil=${diskUtil:-'80'}
60.
rateGEUtil=${rateGEUtil:-'60'}
接下来,IOAnalyzer.sh脚本查询日志,通过计算起止行的办法定位IO输出文件的待分析文本。清单7.IOAnalyzer.sh脚本定位I/O输出文件待分析部分viewsourceprint?
01.
#----------------------------------------------------------------
02.
#IdentifythelinestobeanalyzedbetweenStartLineandEndline
03.
#定位日志中待分析文本
04.
05.
#----------------------------------------------------------------
06.
07.
if
[!-f
"$outLogFile"
]||[!
tail
-1
"$outLogFile"
|
grep
'ENDLINE']
08.
then
09.
StartLineNum=1;
10.
else
11.
CompletedLine=`
tail
-1
"$outLogFile"
|
grep
'ENDLINE'|\
12.
awk
'{print$4}'|
cut
-d:-f2`
13.
StartLineNum=`
expr
1+$CompletedLine`
14.
fi
15.
16.
eval
"sed-n'${StartLineNum},\$p'$inIostatFile"
>${inIostatFile}.
tail
17.
18.
LineCount=`
cat
${inIostatFile}.
tail
|
wc
-l|
awk
'{print$1}'`
19.
EndLineNum=`
expr
$LineCount+$StartLineNum`
清单7中的脚本实现了按行分析上文定位的iostat输出,如果某行磁盘利用率小于先前定义的门限值,则在行尾标记“OK”,如果某行磁盘利用率大于等于先前定义的门限值,则在行尾标记“Alarm”。并且脚本中对于AIX和Linux输出格式和磁盘命名的不同作了相应处理。清单8.IOAnalyzer.sh按行分析iostat输出viewsourceprint?
01.
#----------------------------------------------------------------
02.
#Analyze'iostat'output,append"Alarm"or"OK"attheendofeach#line
03.
04.
#----------------------------------------------------------------
05.
OS=`
uname
`
06.
case
"$OS"
in
07.
AIX)
08.
diskUtilLabel=
"%tm_act"
09.
diskUtilCol=2
10.
diskPrefix=
"hdisk"
11.
;;
12.
Linux)
13.
diskUtilLabel=
"%util"
14.
diskUtilCol=14
15.
diskPrefix=
"hd|sd"
16.
;;
17.
*)
echo
"notsupport$OSoperatingsystem!"
18.
exit
1;
19.
;;
20.
esac
21.
22.
eval
"
cat
${inIostatFile}.
tail
|
egrep
'${diskPrefix}'\
23.
|
awk
'{
if
(\$${diskUtilCol}*100<${diskUtil})\
24.
{\$20=\
"OK\";print\$1\"\t\"\$${diskUtilCol}\"\t\"
\$20}\
25.
else
{\$20=\
"Alarm\";print\$1\"\t\"\$${diskUtilCol}\"\t\"\$20}}'"
\
26.
>${outLogFile}.tmp
下文脚本给出一个告警触发的例子,如果过高的磁盘利用率计数占总分析行数的比率达到或超出预定的比率,脚本会给root用户发一封告警邮件。清单9.IOAnalyzer.sh触发告警viewsourceprint?
01.
#----------------------------------------------------------------
02.
#Sendadminanalertifdiskutilizationcounterreachdefined
03.
#threshold
04.
05.
#----------------------------------------------------------------
06.
Alert=
"NO"
07.
for
DISK
in
`
cut
-f1${outLogFile}.tmp|
sort
-u`
08.
do
09.
numAlarm=`
cat
${outLogFile}.tmp|
grep
"^$DISK.*Alarm$"
|
wc
-l`
10.
numRecord=`
cat
${outLogFile}.tmp|
grep
"^$DISK"
|
wc
-l`
11.
rateAlarm=`
expr
$numAlarm\*100/$numRecord`
12.
if
[$rateAlarm-
ge
$rateGEUtil];
then
13.
echo
"DISK:${DISK}TIME:`
date
+%Y%m%d%H%M`\
14.
RATE:${rateAlarm}THRESHOLD:${rateGEUtil}">>${outAlertFile}.tmp
15.
Alert=
"YES"
16.
fi
17.
done
18.
if
[$Alert=
"YES"
];
then
19.
cat
${outAlertFile}.tmp>>${outAlertFile}
20.
mail-s
"DISKIOAlert"
root@localhost<${outAlertFile}.tmp
21.
fi
最后,脚本将分析活动归档,便于下次分析时定位起始行;另外,分析过程中产生的文件将被删除。清单10.IOAnalyzer.sh记录分析活动日志和清除临时文件viewsourceprint?
01.
#----------------------------------------------------------------
02.
#Clearuptemporaryfilesandlogging
03.
#----------------------------------------------------------------
04.
05.
echo
"IOSTATFILE:${inIostatFile}TIME:`
date
+%Y%m%d%H%M`\
06.
STARTLINE:${StartLineNum}ENDLINE:${EndLineNum}ALERT:${Alert}"\
07.
08.
>>${outLogFile}
09.
10.
rm
-f${outLogFile}.tmp
11.
rm
-f${outAlertFile}.tmp
12.
rm
-f${inIostatFile}.
tail
13.
14.
exit
0
脚本使用示例以下为IOAnalyzer.sh脚本在AIX上使用示例1.后台执行iostat,并将输出重定向到文件中清单11.后台执行iostat#nohupiostat-d5>/root/iostat.out&
(对于Linux,运行iostat-d–x5>/root/iostat.out&)2.编辑crontab文件,每10分钟运行一次IOAnalyzer.sh脚本,-u70–r80,表示在距上次运行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-u70\
-r80>/tmp/iostat.out2>&13.用户收到告警邮件,需要进一步查询历史记录时,可查看日志文件清单13.查看日志文件#cat/root/iostat.out.log|more
IOSTATFILE:/root/iostat.outTIME:200905200255STARTLINE:7220ENDLINE:7580ALARM:YES
IOSTATFILE:/root/iostat.outTIME:200905200300STARTLINE:7581ENDLINE:7940ALARM:YES
IOSTATFILE:/root/iostat.outTIME:200905200305STARTLINE:7941ENDLINE:8300ALARM:YES[AIXn01]>cat/root/iostat.out.alert|more
DISK:hdisk4TIME:200905200250RATE:84THRESHOLD:70
DISK:hdisk5TIME:200905200250RATE:84THRESHOLD:70
DISK:hdisk6TIME:200905200250RATE:84THRESHOLD:70

阅读(141)|评论(0)|转发(0)|

0
上一篇:qemu-kvm(inlibvirt)couldnotopendiskimage

下一篇:LinuxFindOutVirtualMemoryPAGESIZE

相关热门文章

linux常见服务端口

【ROOTFS搭建】busybox的httpd...

什么是shell

linuxsocket的bug??

linux的线程是否受到了保护?...

关于enqueue的dump文件帮看...

tar--newer05/12/2013这个...

请教nginx代理tomcat作为子目...

LDAP安装buserror是什么问...

select语句不修改sql,如何优...

给主人留下些什么吧!~~

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: