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

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实现服务器性能监控的完整方法,开发者可以根据实际需求扩展更多性能指标的采集,也可以将采集到的数据上报到监控系统实现可视化展示。