利用windows性能计数器进行服务器性能监控
using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; using System.Threading; using System.Management; using System.Runtime.InteropServices; using System.Data; using System.Data.SqlClient; using System.DirectoryServices; using System.Collections; using System.Configuration; using System.Collections.Specialized; using System.IO; namespace MON.Client { public static class SysInfo { static Dictionary< string , PerformanceCounter> dic; static double DiskUsePercent; static double SysDiskUsePercent; static SysInfo() { try { dic = new Dictionary< string , PerformanceCounter>(); foreach ( string setting in ConfigurationManager.AppSettings) { var arr = ConfigurationManager.AppSettings[setting].Split( '#' ); if (arr[arr.Length - 1] == "IsCounter" ) { try { var pc = new PerformanceCounter(arr[0], arr[1], arr[2]); dic.Add(setting, pc); } catch (Exception ex) { Console.WriteLine(arr[0] + "找不到" ); Log.WriteLog(ex.Message); } } } } catch (Exception ex) { Console.WriteLine(ex.Message); Log.WriteLog(ex.Message); } } static void initDiskInfo() { #region 备忘 //只获取系统盘代码如下 //ManagementObject CPANInfo = new ManagementObject(string.Format("win32_logicaldisk.deviceid=\"{0}\"", System.Environment.SystemDirectory.Substring(0, 2))); //CPANInfo.Get(); //var s = Convert.ToDouble(CPANInfo["Size"]); //var l = Convert.ToDouble(CPANInfo["FreeSpace"]); //var d = (s - l) / s * 100; //return d; #endregion try { DriveInfo[] drives = DriveInfo.GetDrives(); long totalSize = 0; long freeSize = 0; long CTotalSize = 0; long CFreeSize = 0; foreach (DriveInfo drive in drives) { if (drive.DriveType == DriveType.CDRom) { continue ; } totalSize += drive.TotalSize; freeSize += drive.TotalFreeSpace; if (drive.Name.StartsWith(System.Environment.SystemDirectory.Substring(0, 2))) { CTotalSize += drive.TotalSize; CFreeSize += drive.TotalFreeSpace; } } SysDiskUsePercent = (CTotalSize - CFreeSize) / ( double )CTotalSize * 100; DiskUsePercent = (totalSize - freeSize) / ( double )totalSize * 100; } catch (Exception ex) { Console.WriteLine(ex.Message); Log.WriteLog(ex.Message); } } public static void Init() { //如有取数之前进行的业务可放在这里,提高性能 initDiskInfo(); } public static double GetSysInfo( string InfoKey) { try { if (dic.ContainsKey(InfoKey)) { return dic[InfoKey].NextValue(); } else { if (InfoKey == "SysDiskUsePercent" ) { return SysDiskUsePercent; } else if (InfoKey == "DiskUsePercent" ) { return DiskUsePercent; } else { return -1; } } } catch (Exception ex) { Console.WriteLine(ex.Message); Log.WriteLog(ex.Message); return -1; } } } } |
< appSettings > <!--CPU使用率--> < add key="S_CPU" value="Processor#% Processor Time#_Total#IsCounter"/> <!--网站连接数--> < add key="S_WEB_PORT" value="Web Service#Anonymous Users/sec#默认网站#IsCounter"/> <!--数据库连接数--> < add key="S_CONNECT" value="SQLServer:General Statistics#User Connections##IsCounter"/> <!--实施人员可以无视MS TCP Loopback interface--> < add key="ReceiveDataInfo1" value="Network Interface#Bytes Received/sec#MS TCP Loopback interface#IsCounter"/> < add key="SentDataInfo1" value="Network Interface#Bytes Sent/sec#MS TCP Loopback interface#IsCounter"/> <!--网卡接受字节速率--> < add key="S_FLOW_IN" value="Network Interface#Bytes Received/sec#Realtek PCIe GBE Family Controller#IsCounter"/> <!--网卡发送字节速率--> < add key="S_FLOW_OUT" value="Network Interface#Bytes Sent/sec#Realtek PCIe GBE Family Controller#IsCounter"/> <!--与WIN2003任务管理器性能选项卡 右下角的数据相同 与WIN7此处数据不同 % Committed Bytes In Use 是 Memory\\Committed Bytes 与 Memory\\Commit Limit 之间的比值。 Committed memory 指如果需要写入磁盘时已在页面文件中保留空间的处于使用中的物理内存。 Commit Limit 是由页面文件的大小而决定的。如果扩大了页面文件,该比例就会减小。 这个计数器只显示当前百分比;它不是一个平均值。--> < add key="S_MERMORY" value="Memory#% Committed Bytes In Use##IsCounter"/> <!--数据库连接字符串--> < add key="SQLConnStr" value="Data Source=192.168.1.20;uid=sa;pwd=nj0819;Initial Catalog=CCMS_SH" /> <!--当前监视的服务器--> < add key="ServerID" value="1" /> </ appSettings > |
分类:
C#
, WIN FORM(c#)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2009-10-25 多线程,异步委托,同步委托几种方式的区别