
# Java增强探针性能对用户性能是否会产生影响？
应用性能管理（APM）探针利用字节码增强技术动态采集性能数据，包括方法调用、异常信息、分布式追踪等，帮助开发和运维团队实时监控和优化系统性能。探针集成不可避免地引入了一定量的性能损耗，通过评估探针对Java应用的性能开销（如CPU、内存、延迟），高负载场景下的稳定性和数据采集完整性，可以确保探针在生产环境中运行可靠，性能影响可控，为优化和部署提供重要依据。
#### 测试环境
| **工具/服务** | **版本/规格**       | **说明**                                                                          |
|:---|:---|:---|
| JVisualVM | 1.8.0_216       | JVisualVM是Java自带性能监控工具，监视和管理控制台JConsole，它可以提供 Java 某个进程的内存、线程、类加载、jvm 概述以及实时信息。 |
| JMeter    | 5.3             | Apache JMeter是Apache组织开发的基于Java的压力测试工具，在本次测试中主要是用于模拟多用户并发调用APM查询图表接口。           |
| JavaAgent | 2.4.11-profiler | Java Agent稳定版本                                                                  |
| ECS服务器    | 2u4g            | 通用计算增强型 \| 2vCPUs \| 4GiB \| c7.large.2，节点的操作系统版本为CentOS 7.9。                   |
| Demo应用    | benchmark.jar   | 根据压测源发起请求，会同时访问MySQL和Redis服务，并返回查询值，使用Spring Cloud、Dubbo实现。                     |
   
#### 约束限制
1. Profiler探针版本需要2.4.5版本及以上，请参见[JavaAgent更新说明](https://support.huaweicloud.com/productdesc-apm2/apm_01_0093.html)。
2. 采样策略设置探针版本需要2.4.11版本及以上，请参见[JavaAgent更新说明](https://support.huaweicloud.com/productdesc-apm2/apm_01_0093.html)。
 
#### 测试流程
1. 在不安装探针的情况下，分别使用1TPS、500TPS、1000TPS、2000TPS压测样本，每次的持续时长为30分钟，压测结果将作为基线性能指标。
2. 安装探针，采样策略设置为智能采样和100%采样两种情况下，重复[1]的压测过程，对比CPU、内存、RT上的差异。
3. 安装带Profiler探针，性能剖析设置为关闭状态，采样策略设置为智能采样和100%采样两种情况下，重复[1]的压测过程，对比CPU、内存、RT上的差异。
 
#### 未安装探针性能极限指标
| 序号 | 压测样本    | RT（ms） | cpu（%） | 内存（MB） |
|:---|:---|:---|:---|:---|
| 1  | 1TPS    | 77.05  | 0.4    | 200    |
| 2  | 500TPS  | 77.42  | 11     | 250    |
| 3  | 1000TPS | 79.17  | 23     | 300    |
| 4  | 2000TPS | 83.19  | 45     | 350    |
   
#### 安装探针性能极限指标
表1智能采样 
| 序号 | 压测样本    | RT（ms） | CPU（%） | 内存（MB） |
|:---|:---|:---|:---|:---|
| 1  | 1TPS    | 78.36  | 0.4    | 250    |
| 2  | 500TPS  | 79.05  | 18     | 300    |
| 3  | 1000TPS | 81.84  | 31     | 350    |
| 4  | 2000TPS | 86.81  | 55     | 400    |
   
表2100%采样 
| 序号 | 压测样本    | RT（ms） | CPU（%） | 内存（MB） |
|:---|:---|:---|:---|:---|
| 1  | 1TPS    | 78.38  | 0.4    | 250    |
| 2  | 500TPS  | 80.39  | 20     | 300    |
| 3  | 1000TPS | 84.51  | 33     | 450    |
| 4  | 2000TPS | 88.72  | 65     | 500    |
   
#### 探针性能开销对比
| **序号** | **压测样本** | **智能采样对比**               ||| **100%采样率对比**            |||
|:---|:---|:---|---|---|:---|---|---|
| -                || **RT**  | **CPU** | **内存** | **RT**  | **CPU** | **内存** |
| 1      | 1TPS     | +1.31ms | +0%     | +50MB  | +1.33ms | +0%     | +50MB  |
| 2      | 500TPS   | +1.63ms | +7%     | +50MB  | +2.97ms | +9%     | +50MB  |
| 3      | 1000TPS  | +2.67ms | +8%     | +50MB  | +5.34ms | +10%    | +150MB |
| 4      | 2000TPS  | +3.62ms | +10%    | +50MB  | +5.53ms | +20%    | +150MB |
   
#### 报告结论
1. JAVA增强型探针对于RT（请求响应时间）影响非常小。
2. JAVA增强型探针默认智能采样会额外造成的CPU和内存开销增长，增长幅度小于主机总量的10%，实际还会随客户应用复杂性有所增加。
3. JAVA增强型探针在100%采样率的情况下，性能开销比智能采样略有上升，在高负载情况下不建议开启100%采样。
 
