之前已經介紹過通過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分鍾內完成檢測了。