远程 WMI 查询慢

Posted

技术标签:

【中文标题】远程 WMI 查询慢【英文标题】:Remote WMI query slow 【发布时间】:2014-08-17 00:39:33 【问题描述】:

我正在开发一个程序,该程序查询三个不同的服务器以获取 CPU 和 LogicalDisk 信息。

我查询的每台服务器都会在 6 到 15 秒内返回值(取决于服务器)。因此,获取所有值总共需要 31 秒(第一台服务器 15 秒,第二台服务器 6 秒,第三台服务器 10 秒)。

我尝试对每个查询进行多线程处理,它为每个服务器减少了 1 秒的执行时间,所以我认为这不是解决方案。

我还尝试在服务器中直接使用 powershell 运行查询:

第一台服务器:检索信息需要 10 秒(而不是 15 秒)

第二台服务器:检索信息需要 10 秒(就像我远程操作时一样)

第三台服务器)大约需要 1 秒(而不是 6 秒)

这是我的疑问:

SELECT LoadPercentage From WIN32_Processor

SELECT Size, FreeSpace From WIN32_LogicalDisk

我的问题是:在我的服务器上可以做些什么来使查询更容易吗? 我已经尝试停用防火墙和防病毒软件。

PS:我正在查询 Windows 2003 R2 服务器、Win XP pro 和 Win 7 服务器,它们都与我的本地计算机在同一个域中。

【问题讨论】:

你能把你正在使用的WQL句子包括进来吗? 【参考方案1】:

也许它可以通过使用 CIM 而不是 WMI 来加快整个过程。

在这里你可以找到性能对比:http://community.spiceworks.com/topic/332657-powershell-cmdlet-performance-get-wmiobject-vs-get-ciminstance

当然,您也可以在 C# 中获取特定的 CimInstance: https://msdn.microsoft.com/en-us/library/dn313201(v=vs.85).aspx

【讨论】:

【参考方案2】:

尝试在本地查询以调查性能问题。如果仍然很慢,请调查您的查询。

我不知道您的项目规格是什么,但我会这样处理: 1)创建一个查询的控制台应用程序 2) 每 10-15 分钟在服务器上安排一次启动 3) 通过 MSMQ 推送或登录到数据库或 Web 服务。 4) 控制台应用程序应部署为 clickonce,以便在需要额外性能计数器时可以单点更新。

【讨论】:

我尝试在本地运行查询,正如我在问题中所说,结果几乎相同。我将尝试将其部署为 clickonce【参考方案3】:

由于您列出了两个不同的查询,因此很想知道它们是两个都很慢还是其中一个很慢。

过去我曾经历过在某些 Windows 版本上对 WIN32_Processor 的查询可能会很慢。如果是这种情况,也许您可​​以从其他(希望响应更快)对象获取所需信息,例如 Win32_PerfFormattedData_Counters_ProcessorInformation:

SELECT PercentProcessorTime FROM Win32_PerfFormattedData_Counters_ProcessorInformation

【讨论】:

【参考方案4】:

查看您的语言的 WBEM_FLAG_RETURN_IMMEDIATE 标志。当使用 Scriptomatic(来自 MS 的用于进行 WMI 调用的小型 VBScript GUI)时,此选项会自动添加为选项的一部分。 48 表示 WBEM_FLAG_RETURN_IMMEDIATE | WBEM_FLAG_FORWARD_ONLY。 VBScript 示例:

objWMIService.ExecQuery ("Select * from Win32_NetworkConnection",,48)

https://msdn.microsoft.com/en-us/library/aa390880(v=vs.85).aspx

【讨论】:

【参考方案5】:

您可以尝试两件事来检查它是否适合您。

    尝试使用 PowerShell 脚本。 http://www.powershellpro.com/powershell-tutorial-introduction/powershell-scripting-with-wmi/

    或者您可以使用 Windows 中可用的工具 - 名为 wbemtest。 如果您不是从任何编程语言查询以上 WQL,那么您应该尝试以上两个选项。

【讨论】:

以上是关于远程 WMI 查询慢的主要内容,如果未能解决你的问题,请参考以下文章

C# - Windows 服务 - 远程 WMI 查询抛出错误:找不到 RPC

Win32_Printer 远程 WMI 查询真的很慢

什么是WMI 有什么用?

使用 WMI 拉回远程 netstat 数据

从远程计算机访问 SQL - WMI 命名空间

WMI 访问被拒绝问题