ARMS Go探针通过在编译态增加可观测的监控能力,实现应用性能管理,这不可避免地带来了一定的应用性能开销。ARMS团队采用多项技术对探针进行优化,将探针的性能开销降低,以确保应用的稳定运行。在本篇测试报告中,我们模拟了真实的使用场景,测试ARMS Go探针在不同业务流量下带来的性能开销,您可以参考本篇分析报告,在接入ARMS Go应用监控前,基于性能影响进行充分的评估。
测试场景
整体架构如下图所示:
Go应用基于Net/HTTP框架编写,根据压测源发起的不同请求,会分别访问MySQL和Redis服务,两种请求各占50%的QPS。
测试环境
压测源由阿里云性能测试服务PTS提供。
Go应用、MySQL、Redis都部署在同一个阿里云容器服务ACK集群中,节点实例类型为ecs.c6.2xlarge,节点的操作系统版本为Alibaba Cloud Linux 3.2104 LTS 64位。
Go应用的Pod规格为1核2G,双副本。
Go探针采用Aliyun GoAgent 1.0.0版本。
测试流程
在不安装ARMS Go探针的情况下,分别使用基于500 / 1000 / 2000 QPS,发起3次压测,每次的持续时长为1小时,每次压测前都先基于100 QPS压测流量对Go应用进行3分钟预热,压测结果将作为基线性能指标。
安装Go探针,在采样策略设置为10%固定采样率的情况下,重复第1步的压测,对比Go应用在CPU开销、内存开销、RT上的差异。
安装Go探针,在采样策略设置为100%固定采样率的情况下,重复第1步的压测,对比Go应用在CPU开销、内存开销、RT上的差异。
ARMS Go应用监控的基本功能都将开启,包括统计指标、调用链、Runtime等,并开启所有插件功能。
Runtime功能关闭情况下可以降低0.5%的CPU消耗,如果对性能敏感,可以通过应用配置关闭Runtime采集开关。
基线性能指标
对比项 | CPU | 内存 | RT |
500 QPS | 2.42% | 0.71% | 30ms |
1000 QPS | 4.21% | 0.91% | 30ms |
2000 QPS | 8.5% | 1.41% | 30ms |
CPU指标代表Pod使用的CPU占总CPU的百分比。
内存指标代表Pod使用的内存占总内存的百分比。由于Pod使用内存在达到requests值之前会自然增长,此报告取压测结束时的内存真实占用。
RT指标代表请求的平均响应时间,单位:毫秒。
安装ARMS Go探针后的性能指标
对比项 | 10%采样率 | 100%采样率 | ||||
CPU | 内存 | RT | CPU | 内存 | RT | |
500 QPS | 5.15% | 1.25% | 30ms | 5.25% | 1.85% | 31ms |
1000 QPS | 8.42% | 1.52% | 31ms | 10.48% | 2.02% | 32ms |
2000 QPS | 16.2% | 2.5% | 31ms | 18.45% | 2.63% | 32ms |
探针性能开销
对比项 | 10%采样率 | 100%采样率 | ||||
CPU | 内存 | RT | CPU | 内存 | RT | |
500 QPS | +2.73% | +0.54% | - | +2.83% | +1.14% | +1 ms |
1000 QPS | +4.21% | +0.61% | +1 ms | +6.27% | +1.11% | +2 ms |
2000 QPS | +7.7% | +1.09% | +1 ms | +9.95% | +1.22% | +2 ms |
分析结论
ARMS Go探针额外造成的CPU开销,都在10%以内, 内存几乎不增长。
ARMS Go探针对于RT(请求响应时间)的影响非常小,在2000 QPS的情况下仅增加了1毫秒。
在100%固定采样率的情况下,性能开销比10%固定采样率有2%左右的上升。