有时为什么WMI查询如此缓慢?

11
我在.Net中使用System.Management命名空间来执行各种针对远程服务器的WMI查询。在我的日志中,有时可以看到查询需要30或40秒才能完成,而其他时候则可以在 less than a second 内完成。
当我遇到这些慢速查询时,我尝试使用wbemtest连接该框,并执行查询,但它总是能够快速连接和执行查询。
有任何想法、指针或建议吗?
我在反编译器 reflector 中查看 System.Management.ManagementScope时发现它似乎泄漏了一个 IWbemServices 指针。 看起来这是一个需要调用 RELEASE 的 COM 接口(Marshal.ReleaseComObject())。 我不确定是否相关。在进程的生命周期内,我确实连接到许多不同的服务器。
4个回答

2

我有一个类似的应用程序,对各种设备进行多个WMI查询,我也遇到了相同的问题。使用wbemtest有时更快,但不一定。我发现在同一台机器上执行某些查询与执行其他查询的行为不同,只是因为查询了不同的类。

EnumerationOptions类有一个ReturnImmediately属性,如果您可以一次性获取结果而不是通过网络枚举它们,则可能会帮助您更快地获得结果。

EnumerationOptions options = new EnumerationOptions();
options.ReturnImmediately = false;

您可以尝试并查看是否有所帮助。我知道这不是您想听到的,但我的个人意见是您没有太多可做的。您需要编写代码来解决此问题。真正的答案深藏在DCOM、WMI协议和WMI存储库的深处。

很遗憾,我认为你是正确的。我只需要绕过这个问题。ReturnImmediately设置有所帮助,但并不足以解决问题。 - Josh Clark

2
你可以尝试设置WITHIN字段,看看是否能够强制查询更早地发生。你能否发布一下你正在使用的查询?这可能有助于调试任何进一步的问题。

1

这个问题是特定于一个盒子吗?我曾经在远程调用场景中遇到过同样的问题。我通过重建发起远程调用的盒子上的TCP/IP堆栈来解决了这个问题。


不是所有目标计算机都会出现这种情况,但有几台会。当我在日志中看到慢查询并尝试手动查询时,问题已经解决了。 - Josh Clark
源计算机(发出调用的计算机)怎么样?问题是否特定于它们中的任何一个? - Robert Harvey
是的和不是的 :). 有多台源计算机出现了这个问题,但并非我尝试的每个服务器都有这个问题。 - Josh Clark
2
你可以在进行WMI调用之前设置代码来对机器进行ping测试并记录ping时间。这可能会揭示网络通信是否存在问题。 - Robert Harvey

0

针对您的编程语言,查看WBEM_FLAG_RETURN_IMMEDIATE和WBEM_FLAG_FORWARD_ONLY标志。当使用Scriptomatic(微软提供的用于进行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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接