應用性能管理(APM, Application Performance Management)總結
當下成熟的互聯網公司都建立有從基礎設施到應用程序的全方位監控係統,力求及時發現故障進行處理並為優化程序提供性能數據支持,降低整體運維成本。國內外商業的APM有Compuware、iMaster、博睿Bonree、聽雲、New Relic、雲智慧、OneAPM、AppDyn、Amics等。 本文主要針對Java技術體係介紹APM的關鍵實現技術以及業界主流APM工具的功能特點。
一、APM核心功能
APM被形象的稱為應用程序的私人醫生,越來越收到青睞,比起通過日誌方式記錄關鍵數據顯然要更加實用,APM主要包含如下核心功能:
1. 應用係統存活檢測
2. 應用程序性能指標檢測(CPU利用率、內存利用率等等。。。)
3. 應用程序關鍵事件檢測
4. 檢測數據持久化存儲並能夠多維度查詢
5. 服務調用跟蹤
6. 監控告警
二、關鍵技術
2.1 獲取JVM性能數據
Java程序運行時性能指標可通過Java.lang.Runtime、java.lang.Management中的方法采集。除此之外,著名的Metrics類庫也能夠通過這些底層技術獲取Java程序性能指標。Cpu利用率等基礎數據的采集僅僅是性能監控的一部分,Metrics提供了更為豐富的五個基本度量類型,可在此基礎上開發滿足需求的監控指標。
1. Gauges(度量)
2. Counters(計數器)
3. Histograms(直方圖數據)
4. Meters(TPS計算器)
5. Timers(計時器)
參考文章:
1. 隻用五分鍾為係統實現基於JMX的監控 https://my.oschina.net/zhongl/blog/29075
2. 使用Metrics監控應用程序的性能 https://www.cnblogs.com/yangecnu/p/Using-Metrics-to-Profiling-WebService-Performance.html
2.2 服務調用追蹤
大型係統中每次請求往往都由若幹個獨立的服務調用組成,一次從上遊到下遊的調用被稱為一次Trace,為了監控程序性能,需要知道每個獨立服務的執行時間以及網絡通信開銷時間,Google曾經發表過一個介紹其內部實現Dapper的論文,Twitter參照此論文實現了一個名為Zipkin的服務調用追中係統並已開源。
Trace係統設計的核心技術就是攔截每次服務請求,在請求中加入標識符,記錄一次完整的Trace各階段的執行時間。當然也可以侵入式的寫監控代碼主動向Trace Server發送執行時間。
2.3 時間序列
應用程序向APM發送的采集數據,通常都是格式,為了實現節約存儲空間、計時查詢,通常使用時間序列數據庫存儲采集數據。
參考文章:
1. 時間序列數據庫的秘密 https://blog.csdn.net/pkueecser/article/details/50610796
2.4 告警
TODO
三、開源APM
3.1 ZipKin
ZipKin是Twitter開源的Trace工具,通過Java程序中引入客戶端,可隱式攔截Http、Thrift等形式服務調用。通過Http、Kafka、Scribe等方式同步監控數據到服務端,ZipKin帶有Web UI,但沒有告警功能。
參考文章:
1. 分布式跟蹤係統:Zipkin的背景和設計 https://blog.csdn.net/manzhizhen/article/details/52811600
3.2 大眾點評網 CAT
Cat是大眾點評開源的功能完備的APM係統,支持JVM性能數據采集、服務Trace、告警等功能,但需要寫監控代碼。
參考文章:
1. 大眾點評網監控平台剖析https://www.infoq.com/cn/presentations/public-comments-monitoring-platform-analyse/
3.4 Prometheus
Prometheus從官方介紹來說,他是一個開源的係統監控和報警工具,最初由SoundCloud推出。自2012成立以來,許多公司和組織都采用了Prometheus,項目有一個非常活躍的開發者和用戶社區。它現在是一個獨立的開源項目,並獨立於任何公司。Prometheus具有以下主要特性:
1. 多維度數據模型(由鍵/值對確定的時間序列數據模型)。
2. 具有一個靈活的查詢語言來利用這些維度。
3. 不依賴分布式存儲;單個服務器節點工作。
4. 時間序列的采集是通過HTTP pull的形式,解決很多push架構的問題。
5. 通過中介網關支持短時間序列數據的收集。
6. 監控目標是通過服務發現或靜態配置。
7. 多種數據展示麵板支持,例如Grafana。
Prometheus主要缺點:
1. 單機缺點,單機下存儲量有限,根據你的監控量局限你的存儲時間。
2. 內存占用率大,prometheus集成了leveldb,一個能高效插入數據的數據庫,在ssd盤下io占用比較高。同時可能會有大量數據堆積內存。但是這是可以配置的。
Prometheus既可以使用定時輪詢應用程序Http接口獲取性能數據,也可以使用嵌入到應用程序中Prometheus client主動收集數據推送給Prometheus Server。除了收集應用程序性能數據外,Prometheus還可以收集主機性能數據,真對不同性能指標Prometheus提供了不同的Exports,也可以自己開發Exports收集數據傳遞給Prometheus。Prometheus隻支持性能采集告警,不支持服務Trace追中。
3.5 Hawkular
Hawkular是一個功能完備的APM係統,應用程序中嵌入Hawkular客戶端,主動將采集數據通過Http或者Kafka傳遞給Hawkular。Hawkular支持JVM性能數據采集、服務Trace、告警等功能。其中JVM性能數據采集使用JMX,服務Trace使用Zipkin客戶端。
3.6 Pinpoint
韓國開源的一個功能完備的APM係統,支持JVM性能數據采集、服務Trace、告警等功能。
3.7 Appdash
Appdash是sourcegraph開源的一款用Go實現的分布式係統跟蹤工具套件,它同樣是以google的 dapper為原型設計和實現的,目前用於sourcegraph平台的性能跟蹤和監控。
3.7 Apache HTrace
Apache HTrace是Cloudera開源出來的一個分布式係統跟蹤框架,支持HDFS和HBase等係統。該項目目前還在孵化階段。
3.9 京東Hydra
京東開源的基於Dubbo的調用分布跟蹤係統,類似ZipKin,功能不夠完善。
3.11 Cicada
宜人貸開源的類似ZipKin分布式跟蹤係統,功能不夠完善。
3.12 Spring Boot Admin
可視化展示Spring Boot Metrics,監控數據不能持久化存儲,沒有Trace功能,沒有監控告警功能,但可周期性采集metrics,發送給其他監控軟件如slack進行告警處理,同時也可以實現監控數據存儲。
3.13 綜合評價
我們希望一個功能完善的APM係統具有JVM性能監控、服務調用追中、監控告警功能,大眾點評Cat、PinPoint、Hawkular相對來講功能更為完備,推薦使用。
附錄 A 閉源APM
- Google Dapper
- 淘寶 鷹眼Tracing
- 新浪Watchman
- 美團 MTrace
最後更新:2017-06-21 21:02:33