利用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>