Windows性能计数器无法从C#(在Azure worker角色上)获得
我正在尝试读取Azure worker角色应用程序(C#)中“HTTP服务请求队列”类别中的性能计数器 默认情况下,应用程序无法从该类别获取任何计数器,即Windows性能计数器无法从C#(在Azure worker角色上)获得,c#,azure,performancecounter,azure-worker-roles,C#,Azure,Performancecounter,Azure Worker Roles,我正在尝试读取Azure worker角色应用程序(C#)中“HTTP服务请求队列”类别中的性能计数器 默认情况下,应用程序无法从该类别获取任何计数器,即 string performanceCategoryName = "HTTP Service Request Queues"; var httpQueueCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => categor
string performanceCategoryName = "HTTP Service Request Queues";
var httpQueueCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == performanceCategoryName);
给出空值
但是,如果我将远程桌面连接到实例并启动perfmon,我可以在那里看到类别。如果我从perfmon查看它,然后重新启动应用程序,那么应用程序也可以读取计数器。好像perfmon创建了计数器,默认情况下它不在那里
有人知道解决这个问题的方法吗?我通过启动cmd进程并在启动owin侦听器后从应用程序中调用“typeperf-q”解决了这个问题 这与打开perfmon的效果相同,即默认情况下不存在的类别现在可用于我的应用程序。 确保在尝试访问计数器类别之前等待typeperf列表完成(对于一个小型azure worker角色实例,这需要约20秒) 这就是我的工作原理:
var startInfo = new ProcessStartInfo()
{
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "cmd.exe",
Arguments = "/C typeperf.exe -q",
};
Process p = new Process() { StartInfo = startInfo };
p.Start();
p.WaitForExit(2*60*1000);
string performanceCategoryName = "HTTP Service Request Queues";
var httpQueueCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == performanceCategoryName);
请注意,在注册应用程序http侦听器之后执行该列表非常重要。否则您的实例将不可用。我注意到了这一点,因为我试图在worker角色启动之前将cmd作为启动任务运行,但没有成功。我通过启动cmd进程并在启动owin侦听器后从应用程序中调用“typeperf-q”来解决这一问题 这与打开perfmon的效果相同,即默认情况下不存在的类别现在可用于我的应用程序。 确保在尝试访问计数器类别之前等待typeperf列表完成(对于一个小型azure worker角色实例,这需要约20秒) 这就是我的工作原理:
var startInfo = new ProcessStartInfo()
{
WindowStyle = ProcessWindowStyle.Hidden,
FileName = "cmd.exe",
Arguments = "/C typeperf.exe -q",
};
Process p = new Process() { StartInfo = startInfo };
p.Start();
p.WaitForExit(2*60*1000);
string performanceCategoryName = "HTTP Service Request Queues";
var httpQueueCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == performanceCategoryName);
请注意,在注册应用程序http侦听器之后执行该列表非常重要。否则您的实例将不可用。我注意到了这一点,因为我试图在worker角色启动之前将cmd作为启动任务运行,但这不起作用