1、什么是APM

APM (应用性能管理) – Application Performance Management & Monitoring
在信息科学和系统控制领域,APM致力于监控和管理应用软件性能和可用性。
通过监测和诊断复杂应用程序的性能问题,来保证软件应用程序的良好运行(预期的服务)。

应用性能管理主要指对企业的关键业务应用进行监测、优化,提高企业应用的可靠性和质量,保证用户得到良好的服务,降低IT总拥有成本(TCO)。

一个企业的关键业务应用的性能强大,可以提高竞争力,并取得商业成功,因此,加强应用性能管理(APM)可以产生巨大商业利益。
(京东VS淘宝VS腾讯商城)

APM的覆盖范围包括:终端用户体验,应用架构映射,应用事务的分析,深度应用诊断,和数据分析。

现代APM体系,基本都是参考Google的Dapper(大规模分布式系统的跟踪系统)的体系来做的。
通过跟踪请求的处理过程,来对应用系统在前后端处理、服务端调用的性能消耗进行跟踪。
关于Dapper的介绍可以看这个链接:http://bigbully.github.io/Dapper-translation/

2、apm的主要功能

1)监测企业关键应用性能

过去,企业的IT部门在测量系统性能时,一般重点测量为最终用户提供服务的硬件组件的利用率,如CPU利用率以及通过网络传输的字节数。虽然这种方法也提供了一些宝贵的信息,但却忽视了最重要的因素–最终用户的响应时间。现在通过事务处理过程监测、模拟等手段可真实测量用户响应时间,此外还可以报告谁正在使用某一应用、该应用的使用频率以及用户所进行的事务处理过程是否成功完成。

2)快速定位应用系统性能故障

通过对应用系统各种组件(数据库、中间件)的监测,迅速定位系统故障,如发生Oracle数据库死锁等问题。

3)优化系统性能

精确分析系统各个组件占用系统资源情况,中间件、数据库执行效率,根据应用系统性能要求提出专家建议,保证应用在整个寿命周期内使用的系统资源要求最少,节约TCO。

新一代APM:让整个IT团队参与应用性能监控。
好的APM可以让IT组织中原本孤立的各个方面集中在一起,比如自动生成准确的业务应用系统组件关系视图、关系视图实时更新、准确掌握应用访问逻辑关系等。APM工具可以帮助那些原本一直局限于监控自身领域的管理员,使他们成长为理解应用及其支持基础架构的更有战略价值的性能管理专业人员。

3、常见apm产品介绍

APM产品包括商业产品、开源产品,琳琅满目,非常多,这里就介绍几个常见的,应用比较广泛,广受好评的。

1)Pinpoint

github地址:https://github.com/naver/pinpoint
Pinpoint is an open source APM (Application Performance Management) tool for large-scale distributed systems written in Java.

Pinpoint是一个用Java编写的大规模分布式开源APM工具。
这个是一个韩国团队开源出来的,通过JavaAgent的机制来做字节码代码植入,实现加入traceid和抓取性能数据的目的。
NewRelic、Oneapm之类的工具在java平台上的性能分析也是类似的机制。

文档:
http://www.herohuang.com/2017/03/01/apm-pinpoint/

2)SkyWalking

github地址:https://github.com/wu-sheng/sky-walking
wu-sheng/sky-walking
这是国内一位叫吴晟的兄弟开源的,也是一个对JAVA分布式应用程序集群的业务运行情况进行追踪、告警和分析的系统,在github上也有600+颗星了。
功能相对pinpoint还是稍弱一些,插件还没那么丰富。

3)Zipkin

官网:http://zipkin.io/
OpenZipkin · A distributed tracing system
openzipkin/zipkin:GitHub:https://github.com/openzipkin/zipkin

这个是twitter开源出来的,也是参考Dapper的体系来做的。
Zipkin的java应用端是通过一个叫Brave的组件来实现对应用内部的性能分析数据采集。

Brave的github地址:https://github.com/openzipkin/brave
这个组件通过实现一系列的java拦截器,来做到对http/servlet请求、数据库访问的调用过程跟踪。
然后通过在spring之类的配置文件里加入这些拦截器,完成对java应用的性能数据采集。

在线安装
wget -O zipkin.jar ‘https://search.maven.org/remote_content?g=io.zipkin.java&a=zipkin-server&v=LATEST&c=exec’
java -jar zipkin.jar

java应用:https://github.com/spring-cloud/spring-cloud-sleuth
python支持:https://github.com/Yelp/py_zipkin

4)CAT (大众点评)

github地址:https://github.com/dianping/cat
GitHub – dianping/cat: Central Application Tracking
这个是大众点评开源出来的,实现的功能也还是蛮丰富的,国内也有一些公司在用了。
不过他实现跟踪的手段,是要在代码里硬编码写一些“埋点”,也就是侵入式的。
这样做有利有弊,好处是可以在自己需要的地方加埋点,比较有针对性;
坏处是必须改动现有系统,很多开发团队不愿意。

5)Xhprof/Xhgui

这两个工具的组合,是针对PHP应用提供APM能力的工具,也是非侵入式的。
Xhprof github地址:https://github.com/preinheimer/xhprof (Facebook开源出来的)

GitHub – preinheimer/xhprof: XHGUI is a GUI for the XHProf PHP extension, using a database backend, and pretty graphs to make it easy to use and interpret.

Xhgui github地址:https://github.com/perftools/xhgui
GitHub – perftools/xhgui: A graphical interface for XHProf data built on MongoDB

小结:

前面三个工具里面,推荐的顺序依次是: Pinpoint -> Zipkin -> CAT 。
原因很简单,就是这三个工具对于程序源代码和配置文件的侵入性,是依次递增的:

Pinpoint:基本不用修改源码和配置文件,只要在启动命令里指定java agent参数即可,对于运维人员来讲最为方便;
Zipkin:需要对Spring、web.xml之类的配置文件做修改,相对麻烦一些;
CAT:因为需要修改源码设置埋点,因此基本不太可能由运维人员单独完成,而必须由开发人员的深度参与了,而很多开发人员是比较抗拒在代码中加入这些东西滴;

人们永远没有足够的时间把它做好,但永远有足够的时间重新来过。
可是,因为并不是总有机会重做一遍,你必须做得更好,换句话说,
人们永远没有足够的时间去考虑到底是不是想要它,但永远有足够的时间去为之后悔。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
浅掘千口井,不如深挖一口井!当知识支撑不了野心时,那就静下心来学习吧!运维技术交流QQ群:618354452

个人微信公众号,定期发布技术文章和运维感悟。欢迎大家关注交流。

APM简介-风君雪科技博客