ARMS 应用监控的 Java 探针通过字节码增强实现应用性能管理能力。与其他基于字节码增强技术的方案一样,ARMS 探针会引入一定的性能开销,ARMS 已采用多项技术优化以尽可能减少对应用性能的影响。本报告模拟真实使用场景,测试了 ARMS 探针在不同业务流量下的性能开销,可作为接入 ARMS 应用监控前的性能评估参考。
测试场景
整体架构如下图所示:
Java 应用基于 Spring MVC 框架编写,根据压测源发起的不同请求,分别通过 Druid 框架和 Jedis 框架访问 MySQL 和 Redis 服务。对于请求 ${mall-gateway}/case/api/v1/mysql/execute,Java 应用会访问 MySQL(每接到一次请求,会访问 1~4 次 MySQL);对于请求 ${mall-gateway}/case/api/v1/redis/execute,Java 应用会访问 Redis(每接到一次请求,会访问 1~10 次 Redis)。
测试环境
压测源由阿里云性能测试 PTS 提供。
Java 应用、MySQL、Redis 均部署在同一个阿里云容器服务 ACK 集群中,节点实例类型为
ecs.u1-c1m2.8xlarge,操作系统版本为 Alibaba Cloud Linux 2.1903 LTS 64 位。Java 应用的 Pod 规格为 2 核 4 G,双副本,对应的 JVM 参数如下:
-Xms3500m -Xmx3500m -XX:MetaspaceSize=500mARMS 探针采用 Aliyun JavaAgent 5.1.2 版本。
测试流程
在不安装 ARMS 探针的情况下,分别基于 500/1000/2000 QPS 发起 3 次压测,每次持续 1 小时。每次压测前先基于 100 QPS 流量对 Java 应用进行 3 分钟预热,压测结果作为基线性能指标。
安装 ARMS 探针,将采样策略设置为 10% 固定采样率,重复第 1 步的压测,对比 Java 应用在 CPU 开销、内存开销、RT 上的差异。
安装 ARMS 探针,将采样策略设置为 100% 固定采样率,重复第 1 步的压测,对比 Java 应用在 CPU 开销、内存开销、RT 上的差异。
ARMS 采样策略的设置方法,参见调用链采样模式选择(3.2.8以下探针版本)。
ARMS 应用监控的基本功能均开启,包括统计指标、调用链、分位数等,并开启所有插件功能;部分高阶功能暂时关闭,如调用链压缩、URL 收敛、脱敏开关、持续剖析等。
基线性能指标
对比项 | CPU | 内存 | RT |
500 QPS | 6.752% | 11.48% | 57.8 ms |
1000 QPS | 13.112% | 11.78% | 64.1 ms |
2000 QPS | 26.910% | 12.22% | 70.8 ms |
CPU 指标代表 Pod 使用的 CPU 占总 CPU(2 核)的百分比。
内存指标代表 Pod 使用的内存占总内存的百分比。由于 Pod 使用内存在达到
requests值之前会自然增长,本报告取压测结束时的内存真实占用。RT 指标代表请求的平均响应时间,单位:毫秒。
安装 ARMS 探针后的性能指标
对比项 | 10% 采样率CPU | 10% 采样率内存 | 10% 采样率RT | 100% 采样率CPU | 100% 采样率内存 | 100% 采样率内存 |
500 QPS | 8.492% | 13.66% | 58.6 ms | 9.392% | 13.83% | 59.0 ms |
1000 QPS | 16.932% | 14.07% | 65.2 ms | 18.072% | 14.33% | 65.6 ms |
2000 QPS | 35.120% | 14.61% | 75.1 ms | 35.930% | 14.64% | 76.2 ms |
采样率对 CPU 影响与 QPS 为非线性关系,默认存在每秒 Trace 采集上限阈值。
探针性能开销
对比项 | 10% 采样率CPU | 10% 采样率内存 | 10% 采样率RT | 100% 采样率CPU | 100% 采样率内存 | 100% 采样率内存 |
500 QPS | +1.74% | +2.18% | +0.8 ms | +2.64% | +2.35% | +1.2 ms |
1000 QPS | +3.82% | +2.29% | +1.1 ms | +4.96% | +2.55% | +1.5 ms |
2000 QPS | +8.21% | +2.39% | +4.3 ms | +9.02% | +2.42% | +5.4 ms |
分析结论
ARMS 探针额外造成的 CPU 和内存开销均在 10% 以内。
ARMS 探针对请求响应时间(RT)的影响在 10% 以内,在 1000 QPS 的情况下增加约 1 毫秒。
在 100% 固定采样率的情况下,性能开销比 10% 固定采样率略有上升。
整体来看,5.x 版本 Java 探针的性能开销与 4.x 版本基本一致,测试数据的差异在合理误差范围内。