Windows性能計數器(Performance Counter)是Windows提供的一種系統功能,它能實時採集、分析系統內的應用程序、服務、驅動程序等的性能數據,以此來分析系統的瓶頸、監控組件的表現,最終幫助用戶對系統進行合理調優。市面上採集Windows性能計數器指標的產品良莠不齊,尤爲在處理某類應用程序有多個進程實例時,採集的數據更是差強人意。所幸微軟爲碼農精心準備了得到性能計數器指標的接口,用於靈活得到相關性能計數器指標值,但進程級別Windows性能計數器指標的採集監控,並無想象的那麼美好。所以本文結合筆者應用實踐,探討進程級別Windows性能計數器指標統一採集監控方案,以及在應用實踐中遇到的坑,做爲避坑指南,供感興趣的同行參考。數據庫
進程級別Windows性能計數器指標做爲特來電監控平臺的一部分,對深刻掌握系統進程級別運行狀態,定位系統存在的問題,以便更快、更準的發現潛在的線上問題,起到了舉足輕重的做用。app
針對Windows性能計數器的監控,統一的採集監控方案以下所示:工具
性能計數器指標統一採集監控方案性能
本文重點關注指標管理與指標採集,對指標存儲及指標展示只作概要闡述。spa
1、 指標管理插件
Windows性能計數器指標類別比較多,所以咱們須要對關注的指標進行分類管理。針對進程級別監控,咱們主要關注CLR以及進程相關類別指標:.NET CLR Memory、.NET CLR Exception、.NET CLR Jit、.NET CLR Loading、Process等。3d
一個Windows性能計數器主要由3個屬性來標識:指標類別(Category Name)、指標名稱(Counter Name)、指標實例(Instance Name)。爲了能對某類應用程序的多個進程實例進行統一採集,咱們不對指標實例進行管理,而對指標實例對應的進程名稱進行管理,同時支持一個性能計數器指標關聯多個進程名稱,而且在運行時動態計算出每一個進程名稱對應的多個進程實例,從而大幅下降指標管理的工做量。orm
2、 指標採集blog
指標採集主要解決採集插件運行時的空間(採集範圍)與時間(採集頻率)問題。並非全部機器都部署了咱們關注的應用程序,所以須要經過採集範圍,肯定須要對哪些機器上的性能計數器指標進行採集,同時須要肯定採集頻率,好比10秒、1分鐘、5分鐘等。接口
雖然微軟提供了性能計數器接口用於採集對應的指標值,但當一個應用程序有多個進程實例時(好比一個機器上部署了多個IIS站點,進程名稱都是w3wp,在性能計數器中的實例名稱是w3wp、w3wp#一、…、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與應用程序池的關聯關係,是推薦方案。
3、 指標存儲
指標存儲在時序數據庫中,每一個性能計數器類別(Category Name)+性能計數器名稱(Counter Name)對應一個指標表,表中按進程名稱進行分類,每一行表示一個進程實例對應性能計數器實例的指標值。
4、 指標展示
指標展示能夠按進程名稱、進程實例、機器等維度進行分類聚合展示,相比登陸到每一個機器設置性能計數器,指標集中展示大幅提高了工做效率。
5、 總結
本文探討了Windows性能計數器監控實踐,主要涉及指標管理、指標採集、指標存儲、指標展示四個方面,同時介紹了同一應用程序對應多個進程實例時,指標採集中遇到的坑。