Windows效能計數器監控實踐

靜若清池發表於2019-06-24

Windows效能計數器(Performance Counter)是Windows提供的一種系統功能,它能實時採集、分析系統內的應用程式、服務、驅動程式等的效能資料,以此來分析系統的瓶頸、監控元件的表現,最終幫助使用者對系統進行合理調優。市面上採集Windows效能計數器指標的產品參差不齊,尤其在處理某類應用程式有多個程式例項時,採集的資料更是差強人意。所幸微軟為碼農精心準備了獲得效能計數器指標的介面,用於靈活獲得相關效能計數器指標值,但程式級別Windows效能計數器指標的採集監控,並沒有想象的那麼美好。因此本文結合筆者應用實踐,探討程式級別Windows效能計數器指標統一採集監控方案,以及在應用實踐中遇到的坑,作為避坑指南,供感興趣的同行參考。

程式級別Windows效能計數器指標作為特來電監控平臺的一部分,對深入掌握系統程式級別執行狀態,定位系統存在的問題,以便更快、更準的發現潛在的線上問題,起到了舉足輕重的作用。

針對Windows效能計數器的監控,統一的採集監控方案如下所示:

 

 效能計數器指標統一採集監控方案

本文重點關注指標管理與指標採集,對指標儲存及指標展現只做概要闡述。

一、        指標管理

Windows效能計數器指標類別比較多,因此我們需要對關注的指標進行分類管理。針對程式級別監控,我們主要關注CLR以及程式相關類別指標:.NET CLR Memory、.NET CLR Exception、.NET CLR Jit、.NET CLR Loading、Process等。

一個Windows效能計數器主要由3個屬性來標識:指標類別(Category Name)、指標名稱(Counter Name)、指標例項(Instance Name)。為了能對某類應用程式的多個程式例項進行統一採集,我們不對指標例項進行管理,而對指標例項對應的程式名稱進行管理,同時支援一個效能計數器指標關聯多個程式名稱,並且在執行時動態計算出每個程式名稱對應的多個程式例項,從而大幅降低指標管理的工作量。

二、        指標採集

指標採集主要解決採集外掛執行時的空間(採集範圍)與時間(採集頻率)問題。並不是所有機器都部署了我們關注的應用程式,因此需要通過採集範圍,確定需要對哪些機器上的效能計數器指標進行採集,同時需要確定採集頻率,比如10秒、1分鐘、5分鐘等。

雖然微軟提供了效能計數器介面用於採集對應的指標值,但當一個應用程式有多個程式例項時(比如一個機器上部署了多個IIS站點,程式名稱都是w3wp,在效能計數器中的例項名稱是w3wp、w3wp#1、…、w3wp#n),進行指標採集的坑會比較多,這裡介紹幾個比較典型的問題。

由於效能計數器預設不顯示程式ID,所以無法直接建立程式例項和效能計數器指標例項的關聯關係,相同的效能計數器指標例項名稱,可能屬於一個或多個不同的程式例項。

 

 程式例項與效能計數器例項關聯關係

比如在.NET CLR Memory和Process中例項名稱同為w3wp#1的效能計數器,可能對應同一個程式例項,也可能對應不同的程式例項,這是最詭異的坑!市面上一些監控產品無法準確採集同一應用程式對應多個程式例項的效能計數器指標值,可能與此有關。

為了能建立程式例項與效能計數器例項的關聯關係,需要在顯示效能計數器例項時帶上程式ID。

方案一:修改登錄檔。但潛在的坑也很明顯:只適用於.NET CLR Memory以及Process類別的效能計數器,同時可能會導致第三方監控工具失效,並且修改生產環境的登錄檔風險不可控,不是首選方案。

方案二:動態設定環境變數。針對.NET CLR相關的效能計數器,在呼叫效能計數器介面之前,進行如下環境變數設定:

Environment.SetEnvironmentVariable("COMPlus_ProcessNameFormat", "1");

該方案是程式級別的,設定後得到的效能計數器例項會自動帶上程式ID,並且不會影響到全域性設定或者其它應用程式,是推薦方案。

採集程式級別指標時,有時需要根據IIS站點程式ID獲得對應的應用程式池以及物理路徑:

 

 通過程式ID獲得應用程式池以及物理路徑

方案一:呼叫WMI(Windows Management Instrumentation)介面獲得應用程式池。

Select * from Win32_Process WHERE processID=PID

該方案存在的坑:頻繁呼叫會導致機器CPU飆升,不是首選方案。

方案二:呼叫Appcmd.exe命令獲得應用程式池。

appcmd.exe list wp

該方案通過命令獲得結果後,只需要進行字串解析,即可獲得程式ID與應用程式池的關聯關係,是推薦方案。

三、        指標儲存

指標儲存在時序資料庫中,每個效能計數器類別(Category Name)+效能計數器名稱(Counter Name)對應一個指標表,表中按程式名稱進行分類,每一行表示一個程式例項對應效能計數器例項的指標值。

四、        指標展現

指標展現可以按程式名稱、程式例項、機器等維度進行分類聚合展現,相比登入到每個機器設定效能計數器,指標集中展現大幅提升了工作效率。

五、        總結

本文探討了Windows效能計數器監控實踐,主要涉及指標管理、指標採集、指標儲存、指標展現四個方面,同時介紹了同一應用程式對應多個程式例項時,指標採集中遇到的坑。

相關文章