Golang探针性能压测报告

ARMS Go探针通过在编译态增加可观测的监控能力,实现应用性能管理,这不可避免地带来了一定的应用性能开销。ARMS团队采用多项技术对探针进行优化,将探针的性能开销降低,以确保应用的稳定运行。在本篇测试报告中,我们模拟了真实的使用场景,测试ARMS Go探针在不同业务流量下带来的性能开销,您可以参考本篇分析报告,在接入ARMS Go应用监控前,基于性能影响进行充分的评估。

测试场景

整体架构如下图所示:

image

Go应用基于Net/HTTP框架编写,根据压测源发起的不同请求,会分别访问MySQLRedis服务,两种请求各占50%的QPS。

测试环境

  • 压测源由阿里云性能测试服务PTS提供。

  • Go应用、MySQL、Redis都部署在同一个阿里云容器服务ACK集群中,节点实例类型为ecs.c6.2xlarge,节点的操作系统版本为Alibaba Cloud Linux 3.2104 LTS 64位。

  • Go应用的Pod规格为12G,双副本。

  • Go探针采用Aliyun GoAgent 1.0.0版本。

测试流程

  1. 在不安装ARMS Go探针的情况下,分别使用基于500 / 1000 / 2000 QPS,发起3次压测,每次的持续时长为1小时,每次压测前都先基于100 QPS压测流量对Go应用进行3分钟预热,压测结果将作为基线性能指标。

  2. 安装Go探针,在采样策略设置为10%固定采样率的情况下,重复第1步的压测,对比Go应用在CPU开销、内存开销、RT上的差异。

  3. 安装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

分析结论

  1. ARMS Go探针额外造成的CPU开销,都在10%以内, 内存几乎不增长。

  2. ARMS Go探针对于RT(请求响应时间)的影响非常小,在2000 QPS的情况下仅增加了1毫秒。

  3. 100%固定采样率的情况下,性能开销比10%固定采样率有2%左右的上升。