我是 c# 和 .net 的初学者。 作为一名 unix 人员,我的目的是为 Windows 团队提供一项服务,从 Windows 服务器收集性能数据并将它们重新编码在 graphite 中。 (通过 StatsD )。
我找到了一个 source code which seems to do exactly that除了它似乎使用了错误的接口(interface)(错误的抽象级别)。例如标签被翻译成本地化的 Windows 版本(这太疯狂了),这使得该服务的使用变得不可行。
使用 wmi 性能计数器似乎是可行的方法,但我想高效查询并发现为此使用更新对象是推荐的解决方案,但我不知道该怎么做。
某种程度上相关I found an answer for querying the values once我将其包含在此处作为引用。
问题是:
- 如何使用刷新器对象来每 5 秒查询上一个链接中显示的磁盘统计信息?
- (加分)我如何整合,我应该对 the service mentioned before 做哪些改变?通过 wmi 而不是性能计数器收集数据?
谢谢
最佳答案
这是我在 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; }
}
}
希望对您有所帮助。如果您还需要答案,请告诉我。
关于c# - 使用更新对象收集 wmi 性能计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15581304/