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服务器 Demo应用  | 
      
        2u4g benchmark.jar  | 
      
        通用计算增强型 | 2vCPUs | 4GiB | c7.large.2,节点的操作系统版本为CentOS 7.9。 根据压测源发起请求,会同时访问MySQL和Redis服务,并返回查询值,使用Spring Cloud、Dubbo实现。  | 
     
约束限制
- Profiler探针版本需要2.4.5版本及以上,请参见JavaAgent更新说明。
 - 采样策略设置探针版本需要2.4.11版本及以上,请参见JavaAgent更新说明。
 
测试流程
- 在不安装探针的情况下,分别使用1TPS、500TPS、1000TPS、2000TPS压测样本,每次的持续时长为30分钟,压测结果将作为基线性能指标。
 - 安装探针,采样策略设置为智能采样和100%采样两种情况下,重复步骤1的压测过程,对比CPU、内存、RT上的差异。
 - 安装带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  | 
     
安装探针性能极限指标
| 
        序号  | 
      
        压测样本  | 
      
        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  | 
     
| 
        序号  | 
      
        压测样本  | 
      
        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  | 
     
报告结论
- JAVA增强型探针对于RT(请求响应时间)影响非常小。
 - JAVA增强型探针默认智能采样会额外造成的CPU和内存开销增长,增长幅度小于主机总量的10%,实际还会随客户应用复杂性有所增加。
 - JAVA增强型探针在100%采样率的情况下,性能开销比智能采样略有上升,在高负载情况下不建议开启100%采样。