Được rồi, Vì vậy, về cơ bản tôi đang cố gắng tạo danh sách các Danh mục truy cập hiệu suất đã cài đặt, giống như danh sách bạn nhận được trong PerfMon. Đối với điều này, tôi đang sử dụngPerformanceCounterCategory.GetCategories không phù hợp với Perfmon
System.Diagnostics.PerformanceCounterCategory.GetCategories()
có vẻ như nó hoạt động, cho đến khi bạn kiểm tra danh sách và tìm ra rằng một số bị thiếu. Cái đầu tiên tôi phát hiện bị thiếu là ReadyBoost Cache. Điều này là do dự án được thiết lập để biên dịch trên "x86". Thay đổi điều này thành "Bất kỳ CPU" đã khắc phục sự cố đó.
Tuy nhiên, vẫn còn một số mất tích, ví dụ, một trong các máy thử nghiệm có Danh mục "Ứng dụng quản lý ủy quyền" (không, và không ai biết tại sao hoặc ở đâu) Tuy nhiên, trên máy đó, Category Counter Performance hiển thị trong PerfMon, nhưng không phải khi gọi phương thức GetCategories()
từ C#.
Có ai biết tại sao không? Có cách nào đáng tin cậy hơn để nhận được PerformanceCounterCategories
không? Đây có phải là vì tôi đang sử dụng .Net? Có một số API gốc tôi có thể sử dụng thay thế không?
EDIT
Tôi xin lỗi, tôi vẫn không nhận được nó. Tôi đã viết mã này để có thể minh họa tốt hơn cho nó:
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();
}
}
}
Điều này giờ đây mang lại cho tôi 3236 kết quả. Bởi vì nó nhận được tất cả các bộ đếm hiệu suất trong hệ thống. Vì vậy, tôi hình tất cả những gì tôi cần làm là lọc ra những người thực sự là quầy hiệu suất, để lại cho tôi chỉ với các loại. Tuy nhiên có vẻ như không phải là một nhà xây dựng cho PerformanceCounter mà chỉ mất tên (vì đây không phải là duy nhất), cũng không có vẻ như là một trong đó có giá trị chỉ số. Tôi đã phát hiện ra một API Win32 có tên Performance Data Helper, nhưng điều này dường như không có chức năng mà tôi muốn. Vì thế. Nếu tôi có một chỉ số hiệu suất truy cập, làm thế nào để tôi, trong C# có được PerformanceCounterCategory, cho chỉ mục đó? PerfMon làm điều đó, vì vậy nó phải có thể. Có cách nào để phân tích Index "Magic Number" để tìm ra cái nào?
EDIT 2
Được rồi. Vì vậy, đây đang làm đầu tôi trong Phiên bản mới nhất của mã bằng cách sử dụng ba cách tiếp cận khác nhau đề nghị (Net/Registry/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();
}
}
}
Trên máy tính của tôi tôi nhận được 138 bằng cách sử dụng .Net framework, 117 bởi phân tích sổ đăng ký và 157 bằng cách sử dụng PowerShell (đó là câu trả lời đúng).
Tuy nhiên tùy thuộc vào người dùng đã cài đặt PowerShell/Windows SDK không thực sự là một tùy chọn.
Bất kỳ ai cũng có ý tưởng nào? Có một số loại phiên bản truy cập hiệu suất 3 bí mật hàng đầu, ẩn ở một nơi khác trong sổ đăng ký, mà tôi cần theo dõi không? Tôi đã không chỉ chạy ra khỏi ý tưởng để thử, tôi đã chạy ra khỏi những ý tưởng xấu để thử là tốt. Có bất kỳ thiết bị chuyển mạch dòng lệnh bí mật nào tôi có thể sử dụng trên perfmon, để có được danh sách tất cả các Danh mục không?
Tôi tìm thấy đoạn mã PowerShell này 'Get-Counter –listSet * | Chọn-Object -ExpandProperty Paths' (nguồn: http://blogs.msdn.com/b/powershell/archive/2009/04/21/v2-quick-tip-monitoring-performance-counters-with-powershell.aspx) . –
Cảm ơn. Nhưng tôi cần phải làm điều này theo chương trình. Quan trọng hơn là tôi không thể dựa vào người dùng cuối có cài đặt PowerShell. Tôi chưa cài đặt PowerShell. :) –