`

linux disk io moniter shell

阅读更多

转 http://wangchengtai.blog.hexun.com/39388948_d.html

 

 

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 包的例子。

iostat -d -x 10 3

Device:  rrqm/s  wrqm/s  r/s  w/s  rsec/s  wsec/s avgrq-sz avgqu-sz  await  svctm  %util
主要字段含义如下:

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 请求所占用的时间的百分比,即设备利用率。
#sar -pd 10 3
输出的主要字段含义如下:

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 请求所占用的时间的百分比,即设备利用率
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, 我们的脚本在 RHEL 5.3、SLES 11、AIX 5.3 和 AIX 6.1 上测试通过。

脚本 IOAnalyzer.sh 的第一部分先进行了初始化,检验并处理输入参数,对未输入的参数指定默认值。

清单 6. IOAnalyzer.sh 脚本初始化部分

01.#!/bin/sh
02. # ================================================================
03. # Script Name:  IOAnalyzer.sh
04. # Desciption:   To analyze output of 'iostat -d', send an alert to admin
05. #              if disk utilization counter reach defined threshold
06. # Date:         May 19, 2009
07. #================================================================
08. 
09.# -----------------------------------------------------------------
10. # Function definitions...                                定义函数
11. #----------------------------------------------------------------
12. 
13.function usage {
14. echo ""
15. echo "usage: IOAnalyzer.sh -i inIostatFile [ -l outLogFile ] \
16. [ -a outAlertFile ] [ -u dishUtil ] [ -r rateGEUtil ]"
17. echo ""
18. echo "For example: IOAnalyzer.sh -i /tmp/iostat.out -l /tmp/logFile \
19. -a /tmp/aletFile -u 80 -r 70"
20. echo "For AIX, please run 'iostat -d [ <interval> [ <count> ] \
21. to create inIostatFile"
22. echo "For Linux, please run 'iostat -d -x [ <interval> [ <count> ] \
23. to create inIostatFile"
24. exit 1
25. }
26. 
27.# ----------------------------------------------------------------
28. # Process command-line arguments                          命令行参数处理
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. # Input validation                                       输入验证
44. #----------------------------------------------------------------
45. 
46.if [ ! -f "$inIostatFile" ]
47. then
48. echo "error: invalid Augument inIostatFile in OPTION -i "
49. usage
50. exit 1
51. fi
52. #---------------------------------------------------------------
53. 
54.# Set values, if unset                                   设置变量
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 输出文件待分析部分

01.# ----------------------------------------------------------------
02. # Identify the lines to be analyzed between StartLine and Endline
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 输出

01.# ----------------------------------------------------------------
02. # Analyze 'iostat' output, append "Alarm" or "OK" at the end of each# 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 "not support $OS operating system!"
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 触发告警

01.# ----------------------------------------------------------------
02. # Send admin an alert if disk utilization counter reach defined
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 "DISK IO Alert"  root@localhost< ${outAlertFile}.tmp
21. fi

最后,脚本将分析活动归档,便于下次分析时定位起始行;另外,分析过程中产生的文件将被删除。

清单 10. IOAnalyzer.sh 记录分析活动日志和清除临时文件

01.#----------------------------------------------------------------
02. # Clearup temporary files and logging
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

# 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

分享到:
评论

相关推荐

    OS + Linux Disk disk lvm / disk partition / disk mount / disk io

    标题 "OS + Linux Disk: 磁盘管理详解——LVM、分区、挂载与I/O" 提到的是Linux系统中的磁盘管理核心概念,主要包括逻辑卷管理(LVM)、磁盘分区、磁盘挂载以及磁盘I/O。下面将详细解释这些主题。 **逻辑卷管理...

    基于fs007c文件系统的rtc部分底层函数 作为diskio.c的补充

    基于fs007c文件系统的rtc部分底层函数 作为diskio.c的补充,这样新建文件更改文件时,就会根据rtc自行完成文件时间的写入。在网上没找到现成的函数,自己移植了一个不敢独享。使用的时候只需替换原先diskio.c下面的...

    电子-diskio.c

    电子-diskio.c,单片机/嵌入式STM32-F0/F1/F2

    Linux下IO读写工具abu-1.0

    `ru`(run time)和`adu`(average disk utilization)是经典的Linux系统监控工具。`ru`用于收集和显示系统运行时的资源使用统计信息,包括CPU使用率、内存利用率等。而`adu`则专注于磁盘I/O性能,可以监测磁盘的...

    Disk IO especially SSD optimization step by step share

    《深入解析:SSD I/O优化步骤详解》 SSD(Solid State Drive)因其高速读写性能和低延迟特性,广泛应用于现代计算机系统,尤其是数据库、云计算等领域。然而,为了充分发挥SSD的优势,对其进行有效的I/O优化至关...

    cacti _diskio087d.tar.gz

    《Cacti与Disk IO监控:深入理解cacti _diskio087d.tar.gz》 Cacti是一款开源的网络监控系统,主要用于图表绘制和性能数据收集,尤其在监控网络设备和服务器资源方面表现出色。在我们讨论的文件“cacti _diskio087d...

    scsi-disk.rar_linux disk driver_scsi disk

    总之,`scsi-disk.rar`是一个包含Linux SCSI Disk驱动程序源代码的压缩包,它的主要目标是使Linux系统能够高效、可靠地与SCSI硬盘进行交互。通过分析`scsi-disk.c`和`scsi-disk.h`,我们可以深入理解Linux内核如何...

    Disk Free Monitor

    Disk Free Monitor is a utility which will inform you of the free space on your various disks. The program is conveniently placed in the traybar (right corner of the Windows taskbar). If you find the ...

    ide-disk.rar_IDE LINUX_ide_linux_linux disk_硬盘

    标题中的"ide-disk.rar"表明这是一个关于IDE硬盘在Linux环境下的相关代码资源。IDE(Integrated Drive Electronics)是早期广泛使用的硬盘接口类型,它将控制器集成在硬盘驱动器内部,与计算机主板通过IDE接口线连接...

    DiskIO-开源

    低级磁盘对文件或其他驱动器扇区的读/写“ physicaldiskX”扇区。 磁盘克隆的极其基本的原理。 经过测试的Windows NT / 2000 / XP。 命令行。 适用于实时Windows系统卷。 自由。 可用资源。 小心。

    windows-Disk-IO.rar_disk io_windows 磁盘_磁盘

    在Windows操作系统中,磁盘I/O(Input/Output,输入/输出)是计算机与存储设备进行数据交换的关键过程。磁盘I/O涉及到读取和写入数据到硬盘、固态驱动器(SSD)或其他类型的存储介质。了解磁盘I/O的工作原理对于优化...

    linux-用shell编程调度的实验报告.doc

    实验报告“Linux-用Shell编程调度”探讨了如何在Linux操作系统中使用Shell脚本来实现自动化的数据备份任务,以及如何通过cron调度系统定时执行这些任务。以下是对实验内容的详细说明: 1. **Shell编程**: Shell是...

    Disk File Monitor-开源

    Disk File Monitor是一款优秀的开源工具,专为Linux用户设计,用于实时追踪和分析物理磁盘的I/O请求。它不同于常规的文件I/O监控工具,它并不关注文件读写是否命中内存缓存,而是专注于那些实际触发磁盘活动的文件...

    构建可定制的U-DISK Linux 系统

    构建可定制的U-DISK Linux系统,是一项技术性较强的任务,涉及到对Linux系统的深入理解和操作。根据提供的实验目的和步骤,我们可以将整个过程分为几个关键的知识点进行详细解析。 ### 知识点一:理解U-DISK Linux...

    DIRMON.zip_C Builder_DirMon_disk monitor_zip

    标题中的"DIRMON.zip_C++ Builder_DirMon_disk monitor_zip"揭示了这是一个关于C++ Builder开发的名为"DirMon"的磁盘监控工具。这个工具可能是用于监视和记录磁盘活动,比如文件读写、创建、删除等操作。C++ Builder...

    check_diskstat:Linux磁盘IO检查。 直接读取sys文件系统以查询tps,读取,写入和avg。 请求大小,平均队列大小和平均等待时间

    检查磁盘状态Linux磁盘IO检查。 直接读取/ sys文件系统以查询tps,读取,写入和avg。 请求大小,平均队列大小和平均等待时间。 如iostat -x所示,能够对磁盘队列长度进行图形化显示和警报。 安装例子: wget ...

    基于Linux平台下的Web Disk软件系统开发.pdf

    本文主要探讨的是在Linux平台上开发Web Disk软件系统的过程和技术要点。Web Disk是一种基于浏览器的文件管理系统,它提供了网络存储和文件共享服务,用户可以通过注册获取存储空间,并通过付费方式扩展空间。此外,...

    Corel Linux boot disk

    Boot disk for Corel Linux systems

    Extreme Linux Performance Monitoring Part II

    Disk IO subsystems are the slowest part of any Linux system. This is due mainly to their distance from the CPU and the fact that disks require the physics to work (rotation and seek). If the time ...

Global site tag (gtag.js) - Google Analytics