🔥关注墨瑾轩,带你探索编程的奥秘!🚀 🔥超萌技术攻略,轻松晋级编程高手🚀 🔥技术宝库已备好,就等你来挖掘🚀 🔥订阅墨瑾轩,智趣学习不孤单🚀 🔥即刻启航,编程之旅更有趣🚀
一、资源监控的核心:服务器的‘五脏六腑’
1.1 CPU:服务器的‘心脏’
“CPU使用率超过80%?小心服务器‘心梗’!用PerformanceCounter给它‘量血压’!”
代码实战(CPU监控):
using System;
using System.Diagnostics;
public class CPUMonitor
{
private PerformanceCounter _cpuCounter;
public CPUMonitor()
{
_cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
}
public double GetCpuUsage()
{
return _cpuCounter.NextValue(); // 返回百分比,如:85.5
}
}
// 测试:每秒监测一次
var monitor = new CPUMonitor();
while (true)
{
Console.WriteLine($"CPU当前使用率:{monitor.GetCpuUsage()}%");
System.Threading.Thread.Sleep(1000);
}
代码小课堂:
- PerformanceCounter:像‘体温计’,实时测量CPU温度!
- NextValue():第一次调用可能返回0,需‘预热’1秒再读取!
- 运行时可能出现:System.InvalidOperationException,记得检查权限!
1.2 内存:服务器的‘血液’
“内存泄漏像‘贫血’,GC(垃圾回收)是‘造血医生’!用GC.GetTotalMemory()追踪内存‘血红蛋白’!”
代码实战(内存监控):
public class MemoryMonitor
{
public static void CheckMemory()
{
// 强制GC运行,让‘医生’先检查
GC.Collect();
GC.WaitForPendingFinalizers();
// 获取已分配内存(字节)
long totalMemory = GC.GetTotalMemory(false);
Console.WriteLine($"当前已分配内存:{totalMemory / 1024 / 1024} MB");
// 获取GC统计信息
var gcStats = GC.CollectionCount;
Console.WriteLine($"GC已执行次数:Gen0={gcStats(0)}, Gen1={gcStats(1)}, Gen2={gcStats(2)}");
}
}
代码小课堂:
- GC.Collect():像‘人工呼吸’,强制回收内存!但别滥用,否则会‘心肺复苏过度’!
- Gen0是‘新生代’,Gen2是‘老年代’,频繁GC Gen2说明内存‘慢性病’!
1.3 磁盘:服务器的‘肾脏’
“磁盘IO飙高?小心‘肾衰竭’!用DriveInfo给每块硬盘‘做B超’!”
代码实战(磁盘监控):
public class DiskMonitor
{
public static void CheckDisk(string driveLetter)
{
var drive = new DriveInfo(driveLetter);
if (drive.IsReady)
{
Console.WriteLine($"磁盘{drive.Name}状态:");
Console.WriteLine($"总空间:{drive.TotalSize / 1024 / 1024 / 1024} GB");
Console.WriteLine($"剩余空间:{drive.AvailableFreeSpace / 1024 / 1024 / 1024} GB");
Console.WriteLine($"文件系统:{drive.DriveFormat}");
}
else
{
Console.WriteLine("磁盘未就绪!可能是‘肾结石’?");
}
}
}
// 测试:监测C盘
DiskMonitor.CheckDisk("C");
1.4 网络:服务器的‘神经’
“网络延迟飙升?用NetworkInterface给‘神经末梢’做‘心电图’!”
代码实战(网络监控):
using System.Net.NetworkInformation;
public class NetworkMonitor
{
public static void CheckNetwork()
{
foreach (var nic in NetworkInterface.GetAllNetworkInterfaces())
{
if (nic.OperationalStatus == OperationalStatus.Up)
{
Console.WriteLine($"网卡名称:{nic.Name}");
Console.WriteLine($"IP地址:{nic.GetIPProperties().UnicastAddresses[0].Address}");
Console.WriteLine($"接收字节数:{nic.GetIPv4Statistics().BytesReceived / 1024 / 1024} MB");
Console.WriteLine($"发送字节数:{nic.GetIPv4Statistics().BytesSent / 1024 / 1024} MB");
}
}
}
}
二、致命伤:5大资源监控‘陷阱’
2.1 陷阱1:CPU监控的‘假阳性’
“第一次读取NextValue()返回0?别慌!这是‘体温计预热’的正常现象!”
解决方案:
// 预热1秒再读取
_cpuCounter.NextValue();
System.Threading.Thread.Sleep(1000);
double realValue = _cpuCounter.NextValue();
2.2 陷阱2:内存泄漏的‘隐形杀手’
“GC统计次数突然暴增?可能是‘内存贫血’!用GC.GetTotalMemory(true)强制‘全血检测’!”
2.3 陷阱3:磁盘监控的‘幽灵分区’
“调用DriveInfo时出现异常?可能是‘幽灵分区’在作祟!用try-catch‘驱鬼’!”
2.4 陷阱4:跨平台的‘南北差异’
“.NET Core在Linux上监控?记得用System.IO.Abstractions‘方言翻译器’!”
2.5 陷阱5:报告生成的‘格式战争’
“HTML/PDF格式打架?用iTextSharp和HtmlAgilityPack‘双修’!”
三、终极武器:开源库‘MethodTimer.Fody’
“用MethodTimer.Fody给方法‘戴计时器’,揪出‘耗时黑洞’!”
代码实战(方法耗时监控):
// 1. 安装包
// PM> Install-Package Fody
// PM> Install-Package MethodTimer.Fody
// 2. 创建日志拦截器
public static class MethodLogger
{
public static void Log(MethodBase method, TimeSpan elapsed)
{
Console.WriteLine($"方法【{method.Name}】耗时:{elapsed.TotalMilliseconds} ms");
}
}
// 3. 监控目标方法
[Time]
public void HeavyMethod()
{
// 模拟耗时操作
System.Threading.Thread.Sleep(1500);
}
// 运行时输出:
// 方法【HeavyMethod】耗时:1500 ms
四、跨平台监控神器:CZGL.SystemInfo
“用GitHub开源项目CZGL.SystemInfo实现‘全平台CT扫描’!”
代码实战(集成CZGL):
// 1. 安装包
// PM> Install-Package CZGL.SystemInfo
// 2. 获取系统信息
var systemInfo = SystemInfo.GetSystemInfo();
Console.WriteLine($"CPU核心数:{systemInfo.Cpu.CpuCores}");
Console.WriteLine($"总内存:{systemInfo.Memory.TotalMemory / 1024 / 1024} MB");
Console.WriteLine($"磁盘信息:{systemInfo.Disks[0].FreeSpace} 空闲");
五、生成‘健康报告’:从数据到可视化
5.1 HTML报告:用StringBuilder‘拼图’
public static void GenerateHtmlReport()
{
var report = new System.Text.StringBuilder();
report.Append("<!DOCTYPE html><html><body>");
report.Append($"<h1>服务器健康报告</h1>");
report.Append($"<p>CPU使用率:{new CPUMonitor().GetCpuUsage()}%</p>");
report.Append($"<p>内存使用:{GC.GetTotalMemory(false)/1e6} MB</p>");
report.Append("</body></html>");
System.IO.File.WriteAllText("report.html", report.ToString());
}
5.2 发送到Grafana:用HTTP‘快递’数据
public static void SendToGrafana(string jsonData)
{
using (var client = new HttpClient())
{
var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
await client.PostAsync("https://grafana.example.com/api/data", content);
}
}
六、实战案例:电商大促期间的‘急救’
场景:
“双11大促期间,服务器CPU使用率飙升到95%!用代码‘急诊’:”
解决方案:
实时监控:
// 每秒监测CPU
while (true)
{
if (new CPUMonitor().GetCpuUsage() > 90)
{
Console.WriteLine("⚠️ CPU临界!触发报警!");
// 自动发送邮件/短信
}
Thread.Sleep(1000);
}
生成深度报告:
// 生成包含CPU、内存、磁盘的HTML报告
GenerateHtmlReport();
自动扩容:
// 调用云服务API扩容实例
if (cpuUsage > 95 && memoryUsage > 90)
{
AutoScaleService.ScaleUp();
}
七、避坑指南:资源监控的‘十诫’
八、终极代码示例:‘全栈监控系统’实战
// 1. 创建监控服务
public class MonitorService
{
public async Task StartMonitoring()
{
while (true)
{
// 监控CPU
var cpuUsage = new CPUMonitor().GetCpuUsage();
Console.WriteLine($"CPU: {cpuUsage}%");
// 监控内存
var memoryUsage = GC.GetTotalMemory(false) / 1e6;
Console.WriteLine($"内存: {memoryUsage} MB");
// 发送到Grafana
await SendToGrafana($"{{\\"cpu\\":{cpuUsage},\\"memory\\":{memoryUsage}}}");
await Task.Delay(1000);
}
}
}
// 2. 启动监控
var service = new MonitorService();
service.StartMonitoring();
评论前必须登录!
注册