C# 不提供 Windows 性能计数器(在 Azure 辅助角色上)

Posted

技术标签:

【中文标题】C# 不提供 Windows 性能计数器(在 Azure 辅助角色上)【英文标题】:Windows Performance Counter not available from C# (on Azure worker role) 【发布时间】:2017-06-12 13:31:21 【问题描述】:

我正在尝试读取 Azure 辅助角色应用程序 (C#) 中“HTTP 服务请求队列”类别中的性能计数器。

默认情况下,应用程序无法从该类别中获取任何计数器,即

  string performanceCategoryName = "HTTP Service Request Queues";
  var httpQueueCategory = PerformanceCounterCategory.GetCategories().FirstOrDefault(category => category.CategoryName == performanceCategoryName);

给出空值。

但是,如果我远程桌面进入实例并启动 perfmon,我可以在那里看到类别。如果我从 perfmon 查看它然后重新启动应用程序,那么应用程序也可以读取计数器。好像 perfmon 创建了计数器,但默认情况下它不存在。

有人知道解决这个问题的方法吗?

【问题讨论】:

【参考方案1】:

我通过启动一个 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 侦听器后进行列表很重要。否则您的实例将不可用。我注意到这一点是因为我试图在工作角色开始之前将 cmd 作为启动任务运行,但这没有用。

【讨论】:

以上是关于C# 不提供 Windows 性能计数器(在 Azure 辅助角色上)的主要内容,如果未能解决你的问题,请参考以下文章

使用刷新对象收集 wmi 性能计数器

C# 性能计数器帮助,Nvidia GPU

如何读取 Windows 性能计数器?

如何访问代码中的 C# 性能计数器?

Windows 窗体应用程序中的多线程调用?

Windows 性能计数器端口到 Linux、HP-UX 和 AIX