使用刷新对象收集 wmi 性能计数器

Posted

技术标签:

【中文标题】使用刷新对象收集 wmi 性能计数器【英文标题】:collecting wmi performance counters with refresher object 【发布时间】:2013-03-22 23:12:47 【问题描述】:

我是 C# 和 .net 的初学者。 作为一个 unix 人,我的目的是为 windows 团队提供一项服务,从 windows 服务器收集性能数据并将它们重新编码到graphite(通过StatsD)。

我发现了一个source code which seems to do exactly that,只是它似乎使用了错误的接口(错误的抽象级别)。例如标签被翻译成本地化的 Windows 版本(这太疯狂了),这使得使用此服务不可行。

使用 wmi 性能计数器似乎是要走的路,但我想有效地查询,发现为此使用刷新对象是推荐的解决方案,但我不知道该怎么做。

不知何故与I found an answer for querying the values once 相关,我在此将其作为参考。

问题是:

如何使用 refresher 对象每 5 秒查询上一个链接中显示的磁盘统计信息? (用于奖励积分)如何集成,我应该对 the service mentioned before 进行哪些更改以通过 wmi 而不是性能计数器收集数据?

谢谢

【问题讨论】:

我探索了更多,似乎刷新对象只是 vbscript。乍一看,它似乎是一个通用概念。 【参考方案1】:

这是我在 C# 中通过 WMI 收集有关磁盘使用情况的信息:

private List<DiskInfo> GetDiskInfo()

    List<DiskInfo> disks = new List<DiskInfo>();
    SelectQuery query = new SelectQuery("SELECT Size, FreeSpace, Name, FileSystem FROM Win32_LogicalDisk WHERE DriveType = 3");

    ManagementObjectSearcher moSearcher = new ManagementObjectSearcher(scope, query);
    ManagementObjectCollection collection = moSearcher.Get();
    foreach (ManagementObject res in collection)
    
        float size = Convert.ToSingle(res["Size"]) / 1024f;
        float usedSpace = size - (Convert.ToSingle(res["FreeSpace"]) / 1024f);
        DiskInfo di = new DiskInfo();
        di.Name = res["Name"].ToString();
        di.Size = ConvertVal(size);
        di.UsedSpace = ConvertVal(usedSpace);
        if (size > 0)
        
            di.PercentUsed = ((usedSpace / size) * 100).ToString("N0");
        
        else
        
            di.PercentUsed = "0";
        
        if (res["FileSystem"] != null)
        
            di.FileSystem = res["FileSystem"].ToString();
            disks.Add(di);
                                       
    

    return disks;


// handles returning the correct units    
private string ConvertVal(float value)
               
        float K = value;
        float M = value / 1024f;
        float G = M / 1024f;
        float T = G / 1024f;
        string unit = "KB";
        float val = K;            

        if (K >= 1024)
        
            unit = "MB";
            val = M;
        

        if (M >= 1024)
        
            unit = "GB";
            val = G;
        

        if (G >= 1024)
        
            unit = "TB";
            val = T;
        

        return val.ToString("N2") + unit;
    

我主要将上面的代码与完整的 ComputerInfo 类结合使用,我可以每隔几秒在 ASP.NET MVC 服务上从 jQuery AJAX 调用该类,该服务将 JSON 返回到浏览器,并使用数据动态构建页面提供。 这是我的 DiskInfo 类,用于使数据更易于显示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ComputerInfo.Models

    public class DiskInfo
    
        public string Name  get; set; 
        public string Size  get; set; 
        public string UsedSpace  get; set; 
        public string PercentUsed  get; set; 
        public string FileSystem  get; set; 
    

我希望这会有所帮助。如果您在答案中需要其他任何内容,请告诉我。

【讨论】:

我真正需要的是一种以有效方式每 5 秒将一些指标打印到控制台的方法。使用 javascript 刷新是完全不同的场景。 刷新对象msdn.microsoft.com/en-us/library/windows/desktop/…的一些描述

以上是关于使用刷新对象收集 wmi 性能计数器的主要内容,如果未能解决你的问题,请参考以下文章

通过 WMI 访问应用程序的自定义性能计数器

C# WMI、性能计数器和 SNMP 哦,天哪!

WMI 查询 - 2008 性能计数器警报

使用PowerShell收集多台服务器的性能计数器

性能计数器数据收集服务

如何通过sql server远程收集windows性能计数器