磁盘IO性能监控(Linux 和 Windows)
作者:终南 <>
磁盘的IO性能是衡量计算机总体性能的一个重要指标。Linux提供了iostat命令来获却磁盘输入/输出(即IO)统计信息,Windows则提供了WMI接口,可以通过编写一个简单的脚本来获取与iostat相当的功能。
1、Linux下的iostat命令
iostat -d -k -t 2
每隔2秒统计一次磁盘IO信息,直到按Ctrl+C终止程序,-d 选项表示统计磁盘信息, -k 表示以每秒KB的形式显示,-t 要求打印出时间信息,2 表示每隔 2 秒输出一次。第一次输出的磁盘IO负载状况提供了关于自从系统启动以来的统计信息。随后的每一次输出则是每个间隔之间的平均IO负载状况。
运行该命令后,输出:
Linux 2.6.9-67.0.7.ELsmp (localhost.localdomain) 11/19/2008
Time: 03:15:25 PM
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 3.53 26.66 54.76 30122033 61864280sda1 0.51 1.07 1.73 1207649 1949740sda2 0.00 0.00 0.00 538 256sda3 13.84 25.59 53.03 28913291 59914092Time: 03:15:27 PM
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnsda 275.38 0.00 1738.69 0 3460sda1 14.57 0.00 58.29 0 116sda2 0.00 0.00 0.00 0 0sda3 419.60 0.00 1678.39 0 3340...
每次输出都会打印时间信息, 接下来显示磁盘IO情况列表。
Device: 显示磁盘名称
tps: 表示每秒钟输出到物理磁盘的传输次数。一次传输就是一个对物理磁盘的 I/O 请求。多个逻辑请求可被并为对磁盘的一个单一 I/O 请求。传输具有中等的大小。kB_read/s: 每秒从磁盘读取的数据量,单位为KB。kB_wrtn/s: 每秒从写入磁盘的数据量,单位为KB。Kb_read: 读取的 KB 总数。 Kb_wrtn: 写入的 KB 总数。2、WMI中的 Win32_PerfFormattedData_PerfDisk_LogicalDisk 对象
Win32_PerfFormattedData_PerfDisk_LogicalDisk 代表逻辑磁盘性能数据对象,利用该对象可以获得磁盘的心能信息。 Win32_PerfFormattedData_PerfDisk_LogicalDisk对象有以下一些主要的属性:
Name: 磁盘名称
DiskTransfersPerSec:每秒磁盘传输次数。DiskReadBytesPerSec:每秒从磁盘读取得数据量,单位为Byte。DiskWriteBytesPerSec:每秒从磁盘读取得数据量,单位为Byte。PercentFreeSpace:可用磁盘百分比。3、使用 Win32_PerfFormattedData_PerfDisk_LogicalDisk 的注意事项
在使用 Win32_PerfFormattedData_PerfDisk_LogicalDisk 时,需要注意:
(1)不能使用 objWMIService.ExecQuery 执行 Select 语句来获取磁盘性能数据
(2)必须使用 WbemScripting.SWbemRefresher 将 Win32_PerfFormattedData_PerfDisk_LogicalDisk 加入,然后不断调用 Refresh 方法刷新数据来获取性能信息(3)第一次刷新的时候,并不能获取有用的数据,从第二次开始,才能获取到磁盘性能数据(4)以上问题与 WMI 中性能监控使用计数器的机制有关4、使用举例
为了对监控磁盘性能提供一个良好的用户界面,可以利用VBScript编写脚本来获取磁盘性能数据。脚本的代码如下:
'Script File Name: DiskMonitor.vbs
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!//" & strComputer & "/root/cimv2")set objRefresher = CreateObject("WbemScripting.SWbemRefresher")Set colDisks = objRefresher.AddEnum(objWMIService, "Win32_PerfFormattedData_PerfDisk_LogicalDisk").objectSetIf Wscript.Arguments.Count = 0 Then
objRefresher.RefreshFor Each objDisk in colDisks Wscript.Echo objDisk.Name & " " & objDisk.DiskReadBytesPerSec & " " & objDisk.DiskWriteBytesPerSecNextEnd IfIf Wscript.Arguments.Count = 1 Then
Interval = CInt(Wscript.Arguments(0)) * 1000Do While True objRefresher.RefreshWscript.Echo
Wscript.Echo "Time: " & " " & Time() Wscript.Echo FormatStr("Device:", 15, 0) & FormatStr("tps", 7, 1) & FormatStr(" kB_read/s", 13, 1) & FormatStr("kB_wrtn/s", 13, 1) & FormatStr("Free Space", 13, 1)For Each objDisk in colDisks
Wscript.Echo FormatStr(objDisk.Name, 15, 0) & FormatStr(objDisk.DiskTransfersPerSec, 7, 1) & FormatStr(objDisk.DiskReadBytesPerSec, 13, 1) & FormatStr(objDisk.DiskWriteBytesPerSec, 13, 1) & FormatStr(objDisk.PercentFreeSpace & "%", 13, 1) Next Wscript.Sleep IntervalLoopEnd IfIf Wscript.Arguments.Count = 2 Then
i = 0Interval = CInt(Wscript.Arguments(0)) * 1000Count = CInt(Wscript.Arguments(1))Do While i < Count objRefresher.RefreshWscript.Echo
Wscript.Echo "Time: " & " " & Time() Wscript.Echo FormatStr("Device:", 15, 0) & FormatStr("tps", 7, 1) & FormatStr(" kB_read/s", 13, 1) & FormatStr("kB_wrtn/s", 13, 1) & FormatStr("Free Space", 13, 1)For Each objDisk in colDisks
Wscript.Echo FormatStr(objDisk.Name, 15, 0) & FormatStr(objDisk.DiskTransfersPerSec, 7, 1) & FormatStr(objDisk.DiskReadBytesPerSec, 13, 1) & FormatStr(objDisk.DiskWriteBytesPerSec, 13, 1) & FormatStr(objDisk.PercentFreeSpace & "%", 13, 1) Next Wscript.Sleep Interval i = i + 1LoopEnd IfFunction FormatStr(str, tLen, direction)
sLen = Len(str)fStr = ""num = tLen - sLenj = 0
Do While j < num fStr = fStr & " " j = j + 1LoopIf direction = 1 Then
fStr = fStr & strElse fStr = str & fStrEnd IfFormatStr = fStrEnd Function 使用举例:(1)CSCript DiskMonitor.vbs
止刷新一次 Win32_PerfFormattedData_PerfDisk_LogicalDisk 对象,不会获取到有用的数据。(2)CSCript DiskMonitor.vbs 2
每隔 2 秒获取一次磁盘性能数据并输出,直到按 Ctrl+C 终止程序。(3)CSCript DiskMonitor.vbs 2 100
每隔 2 秒获取一次磁盘性能数据并输出,总共获取 100 次,然后退出。该脚本输出的信息包括 DiskTransfersPerSec、DiskReadBytesPerSec、DiskWriteBytesPerSec 和 PercentFreeSpace。
转载:
http://blog.csdn.net/forandever/article/details/5464902