c# - 使用更新对象收集 wmi 性能计数器

标签 c# wmi performancecounter

我是 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/

相关文章:

c# - WP7 XNA : simple photo album

wmi - BIOS 版本号和标识号?

c# - 监视 Outlook 启动/关闭

c# - 如何使用 PerformanceCounter 类计算 CPU 使用率百分比?

c# - 在 C# 中将文本转换为 bool 表达式

c# - 如何在 3d 空间 C# 中给定三个点找到圆的半径

c# - 使用 C# 在 WMI 中返回 CPU 使用率

jmeter - 如何使用开源工具捕获进程cpu、内存利用率

c# - 性能计数器平均计时器如何与其基数相关联?

c# - 在 PC 上以流的形式实时捕获音频