1. 程式人生 > >Windows應用程序進程級別統一監控實踐

Windows應用程序進程級別統一監控實踐

成功率 框架 count reads 判斷 重點 stat 及其 順序

一般的系統級別指標監控,更多關註CPU、內存、磁盤、網絡等運行情況,對應用程序運行時的進程指標關註不夠,導致不能深入了解系統運行狀態。本文根據筆者應用實踐,探討一下進程級別監控涉及到的監控內容以及監控方式,供感興趣的同行做參考。

技術分享圖片

一、 監控內容

眾所周知,應用軟件最終表現為應用程序,程序是指令、數據及其組織形式的描述,其本身沒有任何運行的含義,是一個靜態的概念;進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是程序的實體,是一個動態的概念。

進程的主要屬性有:進程ID、進程名稱、進程用戶名稱、進程狀態、進程優先級、進程啟動時間、包含的線程、使用的CPU時間、使用的內存、句柄等。進程的屬性雖多,但根據筆者的應用實踐,只要重點監控幾個關鍵指標即可抓住進程的運行狀態,進而對應用程序的健康狀況做出正確的判斷,並在發生故障前快速采取止損措施。

  1. CPU

CPU描述了進程占用的計算資源,監控主要關註進程級別CPU的兩種場景:High CPU、Low CPU。

當進程長時間處於High CPU狀態時,除了正常負載高的情況,程序內部可能:

a.在不斷產生大量異常

b.發生了死循環

c.在頻繁做垃圾回收(Garbage Collection,GC)

當進程長時間處於Low CPU狀態時,程序內部可能:

a.發生了死鎖

b.發生了阻塞

2.內存

內存描述了進程占用的存儲資源,由於Windows資源分為托管資源和非托管資源,因此監控進程級別的內存,應該關註同時包含這兩種資源的提交內存(Commit Size)。

監控主要關註進程級別High Memory場景,當進程長時間處於High Memory狀態時,程序內部可能:

a.發生了內存泄漏,對象一直被使用,無法及時釋放

b.產生了內存碎片,導致內存溢出(Out Of Memory,OOM)

3.端口數

端口數描述了進程占用的網絡資源,通過命令“netstat -ano”可以獲得整個機器的網絡端口數占用情況,但無法直接獲得每個進程的網絡端口數占用情況,因此需要對“netstat -ano”輸出的進程ID做分組匯總,以便獲得每個進程占用的端口數,從而對進程的監控深入一個層次。

當進程占用的端口數過高時,程序內部可能發生了端口泄漏。

4.活躍線程數

進程是線程的容器,一個進程可以包括多個線程,進程和線程都是CPU工作時間段的描述。線程具有生命周期,因此具有很多狀態(新建、就緒、運行、阻塞、死亡),從Windows任務管理器看到的某個進程包含的線程數,是所有狀態的線程數,監控粒度比較粗。

進程級別的線程監控,應該關註活躍線程數,也就是真正在運行的線程數,這可以通過如下方法得到:

private int GetActiveThreadCount()

{

int MaxWorkerThreads, miot, AvailableWorkerThreads, aiot;

ThreadPool.GetMaxThreads(out MaxWorkerThreads, out miot);

AvailableWorkerThreads = aiot = 0;

ThreadPool.GetAvailableThreads(out AvailableWorkerThreads, out aiot);

return MaxWorkerThreads - AvailableWorkerThreads;

}

當進程包含的活躍線程數過高時,程序內部可能發生了線程泄漏。

5.同一進程組流量分布

前面的幾個指標關註的是單一進程,當不同機器上的進程組成一個集群時,需要同時關註這些進程組間的指標,比如流量分布。

當一個集群負載均衡的處理請求時,流量應該是均分到每一個處理進程的,如果監控到某一個進程處理的TPS遠小於整個集群的平均TPS時,該進程很可能發生了阻塞或宕機

6.可用性指標

可用性指標是指可以作為度量系統死活點(Dead Live Point,DLP)的指標,一般關註兩個方面:進程可用性、進程上運行的服務可用性。

進程可用性主要判斷進程是否仍然存活,可以通過調用系統接口判斷進程是否存在,也可以通過進程埋點上報心跳信息。

進程上運行的服務可用性主要關註服務運行的成功率或失敗率,因此涉及到的業務因素比較多,限於篇幅不再展開。如果整個系統基於微服務框架,比如高速服務框架(High Speed Framework,HSF),則可以對服務調用進行統一監控,從而可以統一計算服務可用性。

二、 監控方式

對進程級別的監控由於比較底層,一般采用兩種手段:監控主動收集、進程埋點上報。

  1. 監控主動收集

主動收集又分為兩種方式:通過系統接口獲得機器上所有進程信息、通過性能計數器獲得進程級別監控指標,兩種方式都是非侵入式的,不會影響進程的正常運行,是首要考慮的監控方式。

2.進程埋點上報

埋點是一種常見的數據采集方式,在要精準獲得進程級別監控數據時,代碼埋點可能是最好的選擇。比如前面提到的獲得進程包含的活躍線程數,以及可用性指標,都需要進程埋點上報才能獲得比較精確的監控指標。當然進程埋點並不需要對每個進程都做埋點開發,可以在框架層面進行統一埋點,從而降低埋點開發及實施成本。

三、 總結

只有深刻認識到進程級別監控涉及的監控內容及監控方式,才能更深入的掌握系統運行狀態,並在系統開始惡化前針對不同進程指標快速做出點殺動作(比如通過自動運維進行有順序的進程重啟),從而做到及時止損。

Windows應用程序進程級別統一監控實踐