如何用C#通过WMI实现服务器性能监控

来源:IPIPP.com作者:头衔:全栈工程师
导读:本期聚焦于小伙伴创作的《如何用C#通过WMI实现服务器性能监控》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何用C#通过WMI实现服务器性能监控》有用,将其分享出去将是对创作者最好的鼓励。

服务器性能监控是运维和开发过程中保障服务稳定运行的重要环节,通过WMI可以便捷地获取Windows服务器的各类底层性能数据。下面我们就来看具体的实现方法。

如何用C#通过WMI实现服务器性能监控

WMI技术简介

WMI全称为Windows Management Instrumentation,是Windows系统提供的管理框架,允许开发者通过统一的接口获取系统硬件、软件、网络等各类信息。在C#中我们可以通过System.Management命名空间下的类来调用WMI接口,实现服务器性能数据的查询和采集。

环境准备

首先需要确保项目引用了System.Management程序集,如果你使用的是.NET Framework项目,可以在项目引用中添加该组件;如果是.NET Core及以上版本,需要通过NuGet安装System.Management包。安装完成后在代码文件中引入对应命名空间即可。

using System;
using System.Management;

namespace WmiMonitorDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("开始获取服务器性能数据:");
            // 调用各个监控方法
            GetCpuInfo();
            GetMemoryInfo();
            GetDiskInfo();
            GetNetworkInfo();
            Console.WriteLine("性能数据获取完成");
        }
    }
}

常见性能指标获取实现

CPU使用率监控

我们可以通过WMI查询Win32_PerfFormattedData_PerfOS_Processor类来获取CPU相关的性能数据,该类中PercentProcessorTime字段表示CPU的使用率。

static void GetCpuInfo()
{
    try
    {
        // 查询所有CPU核心的使用率,Total表示整体CPU使用率
        string query = "SELECT PercentProcessorTime FROM Win32_PerfFormattedData_PerfOS_Processor WHERE Name='_Total'";
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
        foreach (ManagementObject obj in searcher.Get())
        {
            // 获取CPU使用率,转换为字符串输出
            string cpuUsage = obj["PercentProcessorTime"].ToString();
            Console.WriteLine($"当前CPU使用率:{cpuUsage}%");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"获取CPU信息失败:{ex.Message}");
    }
}

内存使用情况监控

内存信息可以通过Win32_OperatingSystem类获取,该类包含了总物理内存、可用物理内存等字段,通过计算可以得到内存使用率。

static void GetMemoryInfo()
{
    try
    {
        string query = "SELECT TotalVisibleMemorySize,FreePhysicalMemory FROM Win32_OperatingSystem";
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
        foreach (ManagementObject obj in searcher.Get())
        {
            // TotalVisibleMemorySize和FreePhysicalMemory的单位是KB
            double totalMem = Convert.ToDouble(obj["TotalVisibleMemorySize"]) / 1024;
            double freeMem = Convert.ToDouble(obj["FreePhysicalMemory"]) / 1024;
            double usedMem = totalMem - freeMem;
            double memUsage = (usedMem / totalMem) * 100;
            Console.WriteLine($"总内存:{totalMem:F2}MB,已用内存:{usedMem:F2}MB,内存使用率:{memUsage:F2}%");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"获取内存信息失败:{ex.Message}");
    }
}

磁盘使用情况监控

磁盘信息可以通过Win32_LogicalDisk类获取,该类包含了各个逻辑磁盘的总大小、可用空间等数据。

static void GetDiskInfo()
{
    try
    {
        // 查询固定磁盘的信息,DriveType=3表示本地固定磁盘
        string query = "SELECT Name,Size,FreeSpace FROM Win32_LogicalDisk WHERE DriveType=3";
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
        foreach (ManagementObject obj in searcher.Get())
        {
            string diskName = obj["Name"].ToString();
            // Size和FreeSpace的单位是字节,转换为GB
            double totalSize = Convert.ToDouble(obj["Size"]) / 1024 / 1024 / 1024;
            double freeSize = Convert.ToDouble(obj["FreeSpace"]) / 1024 / 1024 / 1024;
            double usedSize = totalSize - freeSize;
            double diskUsage = (usedSize / totalSize) * 100;
            Console.WriteLine($"磁盘{diskName}:总大小{totalSize:F2}GB,已用{usedSize:F2}GB,使用率{diskUsage:F2}%");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"获取磁盘信息失败:{ex.Message}");
    }
}

网络流量监控

网络流量可以通过Win32_PerfFormattedData_Tcpip_NetworkInterface类获取,该类中BytesTotalPerSec表示每秒的总网络流量。

static void GetNetworkInfo()
{
    try
    {
        string query = "SELECT Name,BytesTotalPerSec FROM Win32_PerfFormattedData_Tcpip_NetworkInterface";
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
        foreach (ManagementObject obj in searcher.Get())
        {
            string netName = obj["Name"].ToString();
            // BytesTotalPerSec单位是字节/秒,转换为KB/秒
            double speed = Convert.ToDouble(obj["BytesTotalPerSec"]) / 1024;
            Console.WriteLine($"网络接口{netName}:当前每秒流量{speed:F2}KB");
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"获取网络信息失败:{ex.Message}");
    }
}

注意事项

  • 运行程序的账号需要有WMI的查询权限,否则会出现权限不足的错误
  • 部分WMI类在高版本的Windows系统中可能存在差异,需要根据实际系统调整查询语句
  • 频繁查询WMI会对服务器产生一定的性能开销,建议合理设置查询间隔,不要过于频繁地调用
  • 如果需要监控远程服务器,可以在ManagementScope中指定远程服务器的地址和登录凭据

以上就是使用C#通过WMI实现服务器性能监控的完整方法,开发者可以根据实际需求扩展更多性能指标的采集,也可以将采集到的数据上报到监控系统实现可视化展示。

C#WMI服务器性能监控.NET性能计数器修改时间:2026-05-29 04:34:57

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。