以前已經介紹過經過WMI接口獲取服務器硬件信息、收集服務器性能數據,從而實現對服務器性能的監控。但因爲監控項目較多,並且經過WMI獲取服務器信息的方式速度相對較慢,所以有必要根據不一樣狀況對程序進行優化。
1、使用多線程並行處理
最初設計服務器監控程序的時候,僅使用一個for循環來處理,當時須要監控的項目較少,所以能在5分鐘時間內完成一次完整的檢測過程。隨着時間的推動,須要監控的項目也愈來愈多,進行一次檢測也由5分鐘變成了12分鐘。這樣的性能顯然是沒法讓人滿意的,必須進行優化。
在這種狀況下,最有效的提高性能的方法顯然是使用多線程進行並行處理。當時監控程序使用的.net framework3.5,所以就使用了ThreadPool的QueueUserWorkItem方法實現多線程處理。程序修改後,運行速度果真提高明顯,由12分鐘提升到了1分鐘。
2、使用TPL(任務並行庫)
前些天,對服務器進行了升級,由Win2003 32位升級爲Win2008 64位,升級以後,監控程序運行一次由1分鐘變成了5分鐘。開頭懷疑是程序未編譯成64位的關係,但重編譯後仍是如此,思考再三決定把程序的運行環境改爲.net framework4.0,看看.net在TPL中是否對ThreadPool的調度進行過優化,從而能得到性能的提高。遺憾的是程序修改後在Win2008 64位下運行仍然須要5分鐘。
3、更換操做系統
接下來只能把問題的矛頭指向了操做系統。因而簡單的寫了一個測試小程序,在該程序中利用WMI接口獲取一臺服務器的內存信息。將測試程序放在Win2003 32位下運行僅需0.3秒,在Win2008 64位下運行則須要2秒多,在Win2008 32位下運行仍是須要2秒多,看來果真是操做系統的緣由。在網上搜索了一下,找到一篇老外對WMI性能進行測試的文章《The WMI Performance Test (2012 Edition)》,測試結果代表Win2008的WMI性能確實有問題。小程序
根據測試結果,將程序遷到了Win2008 R2上運行,終於又能在1分鐘內完成檢測了。服務器