使用刷新对象收集 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 性能计数器的主要内容,如果未能解决你的问题,请参考以下文章