如何在.NET中提高WMI性能?

11

我继承了一些代码,其中包含许多远程WMI调用。当我重复暂停执行并查看调用堆栈时,几乎总是在ManagementScope.Connect()调用中。每个WQL查询似乎都会建立一个新的连接。

尽管进行了有限的试错尝试,但我尚未找到任何大的改进方法来提高WMI调用的性能。

我已经尝试过缓存之前的结果、重用连接,并避免使用可怕的"select *"语句,但它们没有带来我想要的性能改进。我有兴趣了解环境对WMI性能的影响,但该代码需要在各种可能超出我的控制范围的环境中运行。

在.NET中面向性能的WMI访问中应该注意什么?


你是在对同一台机器进行多次调用还是对多台机器进行调用?如果是后者,你考虑过多线程吗? - serialhobbyist
目前是同一台机器; 该代码用于自动远程安装。 该代码首先确定已安装了哪些依赖项,查询操作系统(确定处理器架构,系统目录,程序文件目录,操作系统版本等)来配置安装,然后使用WMI启动和监视安装。 已经有一个功能请求,要求将其排队并并行运行(例如同时运行5个)。 很好的建议。 - devgeezer
啊哈。我在VBScript中做过非常类似的事情。我的代码既难看又痛苦。祝你好运。 - serialhobbyist
1个回答

6

感谢您提供的优秀内容。我的原始帖子表明我确实尝试了“重用连接”,就像链接的博客文章所示。我进行了一些其他实验,并获得了显着的改进,我计划为每个人编写这些实验结果以供参考。我怀疑在.NET对象上设置某些属性会导致后续操作重新连接。我计划很快写出这些内容。有道理的是,适用于DCOM WMI访问的任何内容可能也适用于.NET类。谢谢! - devgeezer
2
@Devgeezer,你是如何在.NET中进行改进的?你写了一个包装器吗? - JSC
在工作中有其他事情要做,但这是我记得的:我继承的 WMI 代码正在进行大量短而冗余的 WMI 连接。大部分时间都花在连接、对一个 WMI 类进行一次调用、断开连接并重复此过程上。尽可能重用连接,甚至在合理的情况下重用查询结果以及其他管理范围项目。记得在不再需要它们时进行处理。采用缓存方法后,我们的进程从 10 多分钟缩短到约 2.5 分钟 - 在此之后,WMI 不再是进程运行时间最长的部分。 - devgeezer

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