zoukankan      html  css  js  c++  java
  • 磁盘IO性能监控(Linux 和 Windows)[转]

    作者:终南   <li.zhongnan@hotmail.com>

    磁盘的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_wrtn
    sda               3.53        26.66        54.76   30122033   61864280
    sda1              0.51         1.07         1.73    1207649    1949740
    sda2              0.00         0.00         0.00        538        256
    sda3             13.84        25.59        53.03   28913291   59914092

    Time: 03:15:27 PM
    Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
    sda             275.38         0.00      1738.69          0       3460
    sda1             14.57         0.00        58.29          0        116
    sda2              0.00         0.00         0.00          0          0
    sda3            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").objectSet

    If Wscript.Arguments.Count = 0 Then
    objRefresher.Refresh
    For Each objDisk in colDisks
       Wscript.Echo objDisk.Name & " " & objDisk.DiskReadBytesPerSec & " " & objDisk.DiskWriteBytesPerSec
    Next
    End If

    If Wscript.Arguments.Count = 1 Then
    Interval = CInt(Wscript.Arguments(0)) * 1000
    Do While True
       objRefresher.Refresh

       Wscript.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
    Loop
    End If

    If Wscript.Arguments.Count = 2 Then
    i = 0
    Interval = CInt(Wscript.Arguments(0)) * 1000
    Count = CInt(Wscript.Arguments(1))
    Do While i < Count
       objRefresher.Refresh

       Wscript.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 + 1
    Loop
    End If

    Function FormatStr(str, tLen, direction)
    sLen = Len(str)
    fStr = ""
    num = tLen - sLen

    j = 0
    Do While j < num
       fStr = fStr & " "
       j = j + 1
    Loop

    If direction = 1 Then
       fStr = fStr & str
    Else
       fStr = str & fStr
    End If
    FormatStr = fStr
    End 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。

  • 相关阅读:
    webpack高级概念,Dllplugin打包性能配置(系列十八)
    webpack高级概念,resolve配置(配置文件格式以及文件路径变量)(系列十七)
    webpack高级概念,eslint配置(系列十六)
    webpack高级概念,解决单页面应用路由问题(vue用脚手架,404找不到页面二)(系列十五)
    webpack高级概念,webpack-dev-server解决单页面应用路由问题(手动搭建webpack,不是用脚手架,404找不到页面,一)(系列十五)
    webpack高级概念,使用 WebpackDevServer 实现请求转发二(系列十四)
    webpack高级概念,使用 WebpackDevServer 实现请求转发一 (系列十四)
    webpack高级概念,typeScript的打包配置(系列十三)
    DevEco Device Tool 2.1 Beta1 的Hi3861在Windows平台的编译体验
    最全HarmonyOS文档和社区资源使用技巧
  • 原文地址:https://www.cnblogs.com/SUNBOY/p/1338257.html
Copyright © 2011-2022 走看看