一、apm介绍
随着微服务架构的流行,一次请求往往需要涉及到多个服务,因此服务性能监控和排查就变得更复杂:
如何串联整个调用链路,快速定位问题?
如何澄清各个微服务之间的依赖关系?
如何进行各个微服务接口的性能分析?
如何追踪各个业务流程的调用处理顺序?
因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题,这就是APM系统,全称:Application Performance Management tools,AMP最早是谷歌公开的论文提到的 Google Dapper。其后越来越多的apm或类apm工具出现在人们眼前,在此,我将一些主流的工具进行对比。
注:此文章有引用别处文章,先汇总如下,大家也可以作为参考:
https://zhuanlan.zhihu.com/p/60436915?utm_source=wechat_session
二、对比
2.1、基本信息
以下信息的统计时间为2022-03-20 15:30
# github
1、pinpoint
# Pinpoint专注于链路和性能监控,韩国研发团队开源,埋点无侵入,UI功能较强。
https://github.com/pinpoint-apm/pinpoint
2、skywalking
# Skywalking是一个国产的开源框架,2015年有吴晟个人开源,2017年加入Apache孵化器,国人开源的产品,主要开发人员来自于华为。Skywalking专注于链路和性能监控,埋点无侵入,UI功能较强。能够加入Apache孵化器,设计思想及代码得到一定认可,后期应该也会有更多的发展空间及研发人员投入。目前使用厂商最多。版本更新较快。
https://github.com/apache/skywalking
3、zipkin
# Zipkin由Twitter开源,调用链分析工具,基于spring-cloud-sleuth得到广泛使用,非常轻量,使用部署简单。
https://github.com/openzipkin/zipkin
4、cat
# CAT是一个更综合性的平台,提供的监控功能最全面,国内几个大厂生产也都在使用。但研发进度及版本更新相对较慢。
https://github.com/dianping/cat
名称 | 用途 | 研发者 | github star |
---|---|---|---|
pinpoint | 分布式链路追踪系统、APM | naver | 12.1k |
skywalking | 分布式链路追踪系统、APM | 2017年加入Apache孵化器 | 18.9k |
zipkin | 分布式链路追踪系统 | 15.2k | |
cat | 应用实时监控 | 携程、大众店品 | 16.5k |
2.2、埋点方式
名称 | 埋点方式 | 入侵性 |
---|---|---|
pinpoint | java探针 | 低 |
skywalking | java探针 | 低 |
zipkin | http拦截器 | 中 |
cat | 代码埋点(拦截器/注解/过滤器) | 高 |
2.3、埋点数据传输性能
名称 | 数据采集 | 消息传输 | 业务吞吐量影响 | cpu及mem影响 |
---|---|---|---|---|
pinpoint | 系统层:cpu/mem/disk/load;应用层:jvm/链路/调用关系/执行耗时,业务层: | thrift | 中高 | <10% |
skywalking | 同pinpoint | grpc | 小 | <10% |
zipkin | 系统层:无,应用层:链路追踪,执行耗时,业务层:无 | 消息队列/http | 中 | 10% |
cat | 系统层:cpu/mem/disk/load;应用层:jvm/链路/调用关系/执行耗时,业务层:业务kpi数据(手动埋点) | netty | 小 | 10% |
除了zipkin采集数据较单一,其他组件采集数据差不多
网络传输上消息队列应该优于其他,因为在大数据量场景下,消息中间件能够缓冲客户端与服务端吞吐量不平衡的情况,同时实时数据的分流处理,共享更灵活。其他方式要么将数据持久化到本地,要么占用大量内存,要么直接丢弃。
性能影响上Pinpoint相对于其他相对更大
cpu和mem影响都在10%的可接受范围内
2.4、数据存储
名称 | 存储方式 |
---|---|
pinpoint | hbase |
skywalking | es/mysql/tidb/h2/sharding sphere |
zipkin | mysql/es/cassandra |
cat | 本地/hdfs/mysql |
CAT的数据存储选型较落后,无法适应目前大数据量的查询,特别是一些精确查询
Pinpoint选择Hbase存储,局限于Hbase基于rowkey查询的限制,对于非rowkey字段的查询不支持
目前看来Elasticsearch是作为实时查询,时序查询比较好的一个选择,时间较长的重要历史数据可考虑同步到hive中。同时支持Elasticsearch作为数据源的开源报表工具也很多,如kibana,grafana等
2.5、架构设计
2.5.1、pinpoint
官网:
https://pinpoint-apm.gitbook.io/pinpoint/want-a-quick-tour/overview
pinpoint architecture
2.5.2、skywalking
https://skywalking.apache.org/docs/main/latest/en/concepts-and-designs/overview/
skywalking architecture 官网
skywalking architecture 知乎
2.5.3、zipkin
官网:
https://zipkin.io/pages/architecture.html
zipkin architecture 官网
zipkin architecture 知乎
2.5.4、cat
cat architecture 知乎
采集端,CAT和Zipkin直接嵌入项目或框架,CAT需要机器特定目录下额外的配置文件,Skywalking和Pinpoint也需要在机器实现在机器目录下由agent的jar包,如果后面通过容器发布,可以文件打入镜像中,需要使用的业务方直接在Dockerfile中使用相应的镜像,并配置-javaagent启动参数即可。
CAT和Skywalking都在数据存储之前提供了分析,预聚合功能,用于提升后续页面查询的效率,Pinpoint的页面功能基本都是基于原始数据进行分析,因此在数据量较大时页面展示会出现加载非常慢的情况。
CAT生产部署要求极其配置较高,堆大小至少10G以上