Счетчики производительности PerformanceCounter в C#

Важное замечание, чтобы счетчики давали правдивые результаты их нужно объявить один раз и после этого к ним обращаться скажем по таймеру. Если вы будете постоянно создавать заново счетчики то они будут возвращать значение – 0. Так как им нужно время для сбора данных.
Я приведу пример четырех счетчиков: Процессора, памяти, файла подкачки и сети.

 

public partial class MainWindow : Window
{
PerformanceCounter cpuUsage;
PerformanceCounter memUsage;
PerformanceCounter pageUsage;
List<PerformanceCounter> netUsage = null;
System.Timers.Timer tmr;
public MainWindow()
{
InitializeComponent();
cpuUsage = new PerformanceCounter("Processor", "% Processor Time", "_Total");
memUsage = new PerformanceCounter("Memory", "Available MBytes");
netUsage = GetNetCounters();
pageUsage = new PerformanceCounter("Paging File", "% Usage", "_Total");
tmr = new System.Timers.Timer();
tmr.Elapsed += tmr_Elapsed;
tmr.Interval = 1000;
tmr.Start();
}
void tmr_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
Dispatcher.BeginInvoke(new ThreadStart(delegate
{
cont.Children.Clear();
cont.Children.Add(new Label() { Content = "Processor " + cpuUsage.NextValue()+ " %" });
cont.Children.Add(new Label() { Content = "memory free  " + memUsage.NextValue() +" mb"});
//добавить System.Management
string Query = "SELECT MaxCapacity FROM Win32_PhysicalMemoryArray";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(Query);
foreach (ManagementObject WniPART in searcher.Get())
{
UInt32 SizeinKB = Convert.ToUInt32(WniPART.Properties["MaxCapacity"].Value);
UInt32 SizeinMB = SizeinKB / 1024;
UInt32 SizeinGB = SizeinMB / 1024;
cont.Children.Add(new Label() { Content = "memory " + ((memUsage.NextValue() / SizeinMB)*100)+"% used" });
cont.Children.Add(new Label() { Content = "memory used " + (SizeinMB - memUsage.NextValue())});
cont.Children.Add(new Label() { Content = "page used " + pageUsage.NextValue() });
foreach (var item in netUsage)
{
cont.Children.Add(new Label() { Content = "network  " + item.NextValue() });
}
}
}));
}
private List<PerformanceCounter> GetNetCounters()
{
string filter = "MS TCP Loopback interface";
List<string> nics = new List<string>();
PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface", System.Environment.MachineName);
if (category.GetInstanceNames() != null)
{
foreach (string nic in category.GetInstanceNames())
{
if (!nic.Equals(filter, StringComparison.InvariantCultureIgnoreCase))
{ nics.Add(nic); }
}
List<PerformanceCounter> nicCounters = new List<PerformanceCounter>();
foreach (string nicInstance in nics)
{
nicCounters.Add(new PerformanceCounter("Network Interface", "Bytes Total/sec", nicInstance, System.Environment.MachineName));
}
return nicCounters;
}
else
{
return null;
}
}
}

Счетчики использую стандартные системные счетчики с которых они и берут данные.

Подробнее о счетчиках:

http://msdn.microsoft.com/en-us/library/ms998581.aspx

http://technet.microsoft.com/en-us/library/cc938593.aspx

http://blogs.msdn.com...setting-up-performance-counters-in-your-web-and-worker-roles.aspx

Add comment