के साथ असंगत है ठीक है, तो मैं मूल रूप से स्थापित प्रदर्शन काउंटर श्रेणियों की एक सूची बनाने की कोशिश कर रहा हूं, जैसा कि आप PerfMon में प्राप्त करते हैं। इसके लिए मैंPerformanceCounterCategory.GetCategories Perfmon
System.Diagnostics.PerformanceCounterCategory.GetCategories()
जो लगता है जैसे कि यह, काम करता है जब तक आप सूची का निरीक्षण किया, और पता है कि कुछ याद कर रहे हैं का उपयोग कर रहा हूँ। पहली बार मैंने लापता देखा था रेडीबॉस्ट कैश था। ऐसा इसलिए था क्योंकि परियोजना "x86" पर संकलित करने के लिए सेट की गई थी। इसे "किसी भी CPU" में बदलना जो उस समस्या को हल करता है।
हालांकि कुछ ऐसे हैं जो अभी भी गायब हैं, उदाहरण के लिए, परीक्षण मशीनों में से एक में "प्राधिकरण प्रबंधक अनुप्रयोग" श्रेणी है (मेरा नहीं है, और कोई भी नहीं जानता कि क्यों, या यह कहां से आता है) हालांकि, उस मशीन पर, प्रदर्शन काउंटर श्रेणी PerfMon में दिखाई देती है, लेकिन सी # से GetCategories()
विधि का आविष्कार करते समय नहीं।
क्या किसी को पता है क्यों? PerformanceCounterCategories
पाने के लिए कोई और विश्वसनीय तरीका है? क्या ऐसा इसलिए है क्योंकि मैं नेट का उपयोग कर रहा हूँ? क्या वहां कुछ मूल एपीआई है जिसका मैं उपयोग कर सकता हूं?
संपादित
मैं माफी चाहता हूँ, मैं अभी भी यह नहीं मिलता है। मैंने इस कोड को शायद बेहतर ढंग से समझाया है:
using System;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
using Microsoft.Win32;
namespace PccHack
{
class Program
{
private static readonly Regex Numeric = new Regex(@"^\d+$");
static void Main(string[] args)
{
var pcc1 = PerformanceCounterCategory.GetCategories();
Console.Out.WriteLine("Getting automatically from the microsoft framework gave {0} results.", pcc1.Count());
string[] counters;
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009"))
{
counters = regKey.GetValue("Counter") as string[];
}
var pcc2 = counters.Where(counter => !Numeric.IsMatch(counter)).ToList();
pcc2.Sort();
Console.Out.WriteLine("Getting manually from the registry gave {0} results.", pcc2.Count());
Console.In.ReadLine();
}
}
}
यह अब मुझे 3236 परिणाम देता है। क्योंकि यह सिस्टम में सभी प्रदर्शन काउंटर प्राप्त करता है। तो मुझे लगता है कि मुझे बस इतना करना है कि उन लोगों को फ़िल्टर करें जो वास्तव में प्रदर्शन काउंटर हैं, मुझे केवल श्रेणियों के साथ छोड़कर। हालांकि प्रदर्शन काउंटर के लिए एक कन्स्ट्रक्टर प्रतीत नहीं होता है जो सिर्फ नाम लेता है (क्योंकि यह अद्वितीय नहीं है), और न ही ऐसा लगता है जो सूचकांक मान लेता है। मैंने प्रदर्शन डेटा हेल्पर नामक एक Win32 एपीआई खोज ली है, लेकिन ऐसा लगता है कि यह कार्यक्षमता नहीं है जो मैं चाहता हूं। इसलिए। यदि मेरे पास एक प्रदर्शन काउंटर इंडेक्स है, तो मैं उस सूचकांक के लिए C# में PerformanceCounterCategory कैसे प्राप्त करूं? PerfMon यह करता है, तो यह संभव होना चाहिए। क्या यह पता लगाने के लिए इंडेक्स "मैजिक नंबर" को पार्स करने का कोई तरीका है?
संपादित 2
ठीक है। तो यह सुझाव दिया कोड तीन अलग अलग तरीकों का उपयोग (नेट/रजिस्ट्री/PowerShell) के नवीनतम संस्करण में मेरे सिर कर रही है:।
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using Microsoft.Win32;
using System.Management.Automation;
namespace PccHack
{
internal class Program
{
private static void Main()
{
var counterMap = new Dictionary<string, string>();
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009"))
{
var counter = regKey.GetValue("Counter") as string[];
for (var i = 0; i < counter.Count() - 1; i += 2)
{
counterMap.Add(counter[i], counter[i + 1]);
}
}
var pcc1 = PerformanceCounterCategory.GetCategories().Select(o => o.CategoryName).ToList();
var pcc2 = new List<string>();
// Get v1 providers
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\services"))
{
foreach (var subKeyName in regKey.GetSubKeyNames())
{
using (var subKey = regKey.OpenSubKey(subKeyName))
{
if (!subKey.GetSubKeyNames().Contains("Performance")) continue;
using (var perfKey = subKey.OpenSubKey("Performance"))
{
var blah = (string) perfKey.GetValue("Object List");
if (blah != null)
{
pcc2.AddRange(blah.Split(' ').Select(b => counterMap[b]));
}
}
}
}
}
// Get v2 providers
using (var regKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\_V2Providers"))
{
foreach (var subKeyName in regKey.GetSubKeyNames())
{
using (var subKey = regKey.OpenSubKey(subKeyName))
{
foreach (var perfKeyName in subKey.GetSubKeyNames())
{
using (var perfKey = subKey.OpenSubKey(perfKeyName))
{
var blah = (string) perfKey.GetValue("NeutralName");
if (blah != null)
{
pcc2.Add(blah);
}
}
}
}
}
}
var ps = PowerShell.Create();
ps.AddCommand("Get-Counter").AddParameter("listSet", "*");
var pcc3 = ps.Invoke().Select(result => result.Members["CounterSetName"].Value.ToString()).ToList();
pcc1.Sort();
pcc2.Sort();
pcc3.Sort();
Console.Out.WriteLine("Getting automatically from the microsoft framework gave {0} results.", pcc1.Count());
Console.Out.WriteLine("Getting manually from the registry gave {0} results.", pcc2.Count());
Console.Out.WriteLine("Getting from PowerShell gave {0} results.", pcc3.Count());
Console.In.ReadLine();
}
}
}
मेरी मशीन पर मैं द्वारा नेट ढांचे, 117 का उपयोग कर 138 मिलता है रजिस्ट्री को पार्स करना, और 157 PowerShell का उपयोग करके (जो सही उत्तर है)।
हालांकि पावरशेल/विंडोज एसडीके स्थापित करने वाले उपयोगकर्ता के आधार पर वास्तव में एक विकल्प नहीं है।
किसी के पास कोई विचार है? क्या रजिस्ट्री में कहीं और छुपा कुछ शीर्ष गुप्त संस्करण 3 प्रदर्शन काउंटर श्रेणियां हैं, जिन्हें मुझे ट्रैक करने की आवश्यकता है? मैंने कोशिश करने के लिए केवल विचारों से बाहर नहीं किया है, मैं भी कोशिश करने के लिए बुरे विचारों से बाहर चला गया है। क्या सभी श्रेणियों को सूचीबद्ध करने के लिए, क्या कोई गुप्त कमांड लाइन स्विच मैं परफॉर्म पर उपयोग कर सकता हूं?
मुझे यह पावरशेल स्निपेट 'गेट-काउंटर -लिस्टसेट * मिला। चयन-ऑब्जेक्ट-एक्सपैंडप्रॉपर्टी पथ '(स्रोत: http://blogs.msdn.com/b/powershell/archive/2009/04/21/v2-quick-tip-monitoring-performance-counters-with-powershell.aspx) । –
धन्यवाद। लेकिन मुझे इसे प्रोग्रामेटिक रूप से करने की ज़रूरत है। सबसे महत्वपूर्ण बात यह है कि मैं PowerShell इंस्टॉल किए गए अंतिम उपयोगकर्ता पर भरोसा नहीं कर सकता। मेरे पास PowerShell इंस्टॉल नहीं है। :) –