【问题标题】:ManagementObjectSearcher WMIquery very slowManagementObjectSearcher WMIquery 很慢
【发布时间】:2021-08-09 07:53:54
【问题描述】:

我有一个重复运行的 .NET 6.0 代码来监控机器上的 CPU 并将统计信息发送到仪表板服务器:

var stopwatch = Stopwatch.StartNew();
var processorQuery = new ManagementObjectSearcher().WMIquery("select * from Win32_Processor");
Log(stopwatch.ElapsedMilliseconds); // !!! 2 to 10 seconds!

// now process the results
var processors = new JArray();
foreach (var processorMO in processorQuery) {
  var name = processorMO["Name"]?.ToString() ?? "";
  var addressWidth = Double.Parse(processorMO["AddressWidth"]?.ToString() ?? "-1");
  if (name.IndexOf(addressWidth.ToString()) != -1) name = $"{name} x{addressWidth}";
  var maxClockSpeedGHz = Double.Parse(processorMO["MaxClockSpeed"]?.ToString() ?? "-1000") / 1000.0;
  if (name.IndexOf(maxClockSpeedGHz.ToString()) != -1) name = $"{name} {maxClockSpeedGHz}GHz";
  var numberOfCores = Double.Parse(processorMO["NumberOfCores"]?.ToString() ?? "-1");
  name = $"{name} {numberOfCores}cores";
  name = name.Replace("CPU ", " ").Replace(" M ", " M").Replace(" @ ", " ");
  name = string.Join(" ", name.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)); // replace multiple spaces with single
  int loadPercentage = (int)Double.Parse(processorMO["LoadPercentage"]?.ToString() ?? "-1");
  processors.Add(new JObject() { { "Name", name }, { "LoadPercentage", loadPercentage } });
}

我的问题是对WMIquery 的调用非常慢......从 2.5 到 10 秒!

我做错了什么吗?有没有办法更快地获取这些信息?


(PS 还有哪些标签在这里有用?)

【问题讨论】:

    标签: c# wmi


    【解决方案1】:

    您可以使用 GetSystemTimes,它为所有内核提供空闲、内核和用户时间。 如果你这样做,例如每秒钟您都可以以更有效的方式自行计算总体 CPU 利用率。

    【讨论】:

      【解决方案2】:

      这很慢,因为您正在执行select *,其中包括诸如LoadPercentage 之类的东西,这不是 WMI 从其数据库中获取的东西,它是在查询点进行测试并获取的实时信息 至少 秒完成并准确评估负载。因为看起来你实际上需要LoadPercentage,所以除了等待之外你无能为力。我根本不会担心这个,也许更多地关注每个查询抑制的 CPU/IO 损失。

      【讨论】:

      • 谢谢!其他时间是这个查询在 CPU 负载或内存方面很昂贵吗?
      • @kofifus 那是您应该更彻底地测试的部分。我认为这没关系,但它主要用于奇怪的一次性报告或快速检查。对于定期 CPU 负载分析,我们通常使用与 Grafana 或 Windows 附带的性能计数器集成的 3rd 方 devops 工具 (something like this)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2011-03-08
      • 2013-02-23
      • 2015-12-24
      • 2020-10-23
      相关资源
      最近更新 更多