之前已经介绍过通过WMI接口获取服务器硬件信息、收集服务器性能数据,从而实现对服务器性能的监控。但由于监控项目较多,而且通过WMI获取服务器信息的方式速度相对较慢,因此有必要根据不同情况对程序进行优化。
一、使用多线程并行处理
最初设计服务器监控程序的时候,仅使用一个for循环来处理,当时需要监控的项目较少,因此能在5分钟时间内完成一次完整的检测过程。随着时间的推进,需要监控的项目也越来越多,进行一次检测也由5分钟变成了12分钟。这样的性能显然是无法让人满意的,必须进行优化。
在这种情况下,最有效的提升性能的方法显然是使用多线程进行并行处理。当时监控程序使用的.net framework3.5,因此就使用了ThreadPool的QueueUserWorkItem方法实现多线程处理。程序修改后,运行速度果然提升明显,由12分钟提高到了1分钟。
二、使用TPL(任务并行库)
前些天,对服务器进行了升级,由Win2003 32位升级为Win2008 64位,升级之后,监控程序运行一次由1分钟变成了5分钟。开头怀疑是程序未编译成64位的关系,但重编译后还是如此,思考再三决定把程序的运行环境改成.net framework4.0,看看.net在TPL中是否对ThreadPool的调度进行过优化,从而能获得性能的提升。遗憾的是程序修改后在Win2008 64位下运行仍然需要5分钟。
三、更换操作系统
接下来只能把问题的矛头指向了操作系统。于是简单的写了一个测试小程序,在该程序中利用WMI接口获取一台服务器的内存信息。将测试程序放在Win2003 32位下运行仅需0.3秒,在Win2008 64位下运行则需要2秒多,在Win2008 32位下运行还是需要2秒多,看来果然是操作系统的原因。在网上搜索了一下,找到一篇老外对WMI性能进行测试的文章《The WMI Performance Test (2012 Edition)》,测试结果表明Win2008的WMI性能确实有问题。
根据测试结果,将程序迁到了Win2008 R2上运行,终于又能在1分钟内完成检测了。