接入阿里云JavaAgent上报的Java程序性能数据

Continuous Profiler Agent为阿里云JVM团队自研性能采集工具,具有高性能、稳定、大规模生产验证等优势。您可以通过Logtail接入Continuous Profiler Agent上报的Java程序性能数据到全栈可观测应用中,进行可视化的性能监控和分析。

前提条件

已创建全栈可观测实例。具体操作,请参见创建实例

使用限制

  • Logtail为Linux Logtail 1.7及以上版本。

  • 支持CentOS、Redhat、Alibaba Cloud Linux、Ubuntu、Debian发行版等操作系统,内核版本需为2.6.32-431.23.3.el6.x86_64及以上版本,支持glibc和musl libc。

  • JDK版本

    引擎类型

    CPU

    内存

    AUTO引擎

    • OpenJDK 8u272及以上、JDK 11、JDK 17都支持

    • OracleJDK 11、OracleJDK 17都支持

    • OracleJDK 8不支持

    • OpenJDK8u352及以上、OpenJDK 11.0.17及以上、OpenJDK 17.0.5及以上都支持

    • OracleJDK8不支持

    • OracleJDK 11.0.21及以上、OracleJDK 17.0.9及以上都支持

    async_profiler引擎

    所有OpenJDK/OracleJDK 8、11、17都支持

    所有OpenJDK/OracleJDK 8、11、17都支持

性能消耗说明

在一般压力情况下(也就是生产环境的常见压力),Java程序性能剖析的开销低于5%。

步骤一:创建Logtail配置

  1. 登录日志服务控制台

  2. 日志应用区域的智能运维页签下,单击全栈可观测

  3. SLS全栈可观测页面,单击目标实例。

  4. 在左侧导航栏中,单击性能监控

    首次在该实例中使用性能监控时,请单击立即开启

  5. 在左侧导航栏中,单击数据接入,然后在数据接入配置页面,找到通用推送接入

    首次创建目标监控项的接入配置时,打开创建开关,可进入配置页面。如果您已创建过接入配置,则单击创建图标,可进入配置页面。

  6. 创建机器组。

    • 如果您已有可用的机器组,请单击使用现有机器组

    • 如果您还没有可用的机器组,请执行以下操作。

      1. 确认您的服务器类型。

        • 如果是同账号下的ECS,请在ECS机器页签中,通过手动选择实例方式选择目标ECS实例,单击创建

          具体操作,请参见安装Logtail(ECS实例)

        • 如果是与日志服务属于不同账号的ECS、其他云厂商的服务器和自建IDC,请您在服务器上手动安装Linux Logtail 1.7及以上版本。具体操作,请参见安装Logtail(Linux系统)

          重要

          手动安装Logtail后,您必须在该服务器上手动配置用户标识。具体操作,请参见配置用户标识

        • 如果是Kubernetes集群,请参见接入Kubernetes资源监控数据安装Logtail组件。

      2. 安装完成后,单击确认安装完毕

      3. 创建机器组页面,输入名称,单击下一步

        日志服务支持创建IP地址机器组和用户自定义标识机器组,详细参数说明请参见创建IP地址机器组创建用户自定义标识机器组

        重要

        如果是在Kubernetes集群安装Logtail,会自动生成名为{instanceId}-{clusterId}-k8s-cluster的机器组,请跳过此步骤。

  7. 机器组配置中,将目标机器组从源机器组移动到应用机器组,然后单击下一步

    重要

    如果创建机器组后立刻应用,可能因为连接未生效,导致心跳为FAIL,您可单击自动重试。如果还未解决,请参见Logtail机器组无心跳进行排查。

  8. 数据源设置配置向导中,配置如下参数,然后单击完成

    参数

    说明

    配置名称

    自定义设置Logtail采集配置名称。

    集群

    自定义设置集群的名称。

    设置该参数后,日志服务会为通过该Logtail采集配置采集到的性能监控数据添加cluster=集群名称的标签。

    重要

    请确保该集群名称唯一,否则可能出现数据冲突。

    地址

    设置采集地址。默认为http://:4040,表示以本地地址启动HTTP Server,4040为Pyroscope的默认端口。

    • 如果是ECS,需配置为目标ECS的IP地址:4040

    • 如果是Kubernetes集群,需配置为logtail-kubernetes-metrics.sls-monitoring:4040

    • 如果是其他云厂商的服务器和自建IDC,需配置为目标服务器的IP地址:4040

    端点

    Pyroscope的默认端点,默认值为/ingest

    读取超时时间

    数据读取超时时间,默认为10秒。

    最大Body大小

    支持的最大Body大小。

设置完成后,日志服务将自动生成Metricstore等资产。更多信息,请参见资产说明

步骤二 下载Java Agent

  • 中国地域

    wget https://logtail-release-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/jvm/continuous-profile-collector-agent-1.9.0.jar
  • 非中国地域

    wget https://logtail-release-ap-southeast-1.oss-ap-southeast-1.aliyuncs.com/jvm/continuous-profile-collector-agent-1.9.0.jar

步骤三: 配置Java程序推送性能数据

  • JVM参数方式

  • java \
    -Dprofiling.app.name=your_service_name \
    -Dprofiling.agent.upload.server="http://{host}:{port}" \
    -Dprofiling.cpu.engine={engine} \
    -javaagent:{path for javaagent} \
    -jar demo.jar

    参数

    说明

    profiling.app.name

    服务名称。

    profiling.agent.upload.server

    数据上传地址。

    • 如果是ECS,需配置为目标ECS的IP地址:4040

    • 如果是Kubernetes集群,需配置为logtail-kubernetes-metrics.sls-monitoring:4040

    • 如果是其他云厂商的服务器和自建IDC,需配置为目标服务器的IP地址:4040

    profiling.cpu.engine

    CPU热点剖析引擎,默认值:off,可选值:auto、async_profiler、jfr、off。

    off表示不打开CPU热点剖析,其他值表示打开。建议选择auto。

  • 环境变量方式

  • export PROFILING_APP_NAME="your_service_name"
    export PROFILING_AGENT_UPLOAD_SERVER="http://{host}:{port}"
    export PROFILING_CPU_ENGINE="{engine}"
    export PROFILING_ALLOC_ENGINE="{engine}"
    

    参数

    说明

    PROFILING_APP_NAME

    服务名称。

    PROFILING_AGENT_UPLOAD_SERVER

    数据上传地址。

    • 如果是ECS,需配置为目标ECS的IP地址:4040

    • 如果是Kubernetes集群,需配置为logtail-kubernetes-metrics.sls-monitoring:4040

    • 如果是其他云厂商的服务器和自建IDC,需配置为目标服务器的IP地址:4040

    PROFILING_CPU_ENGINE

    CPU热点剖析引擎,默认值:off,可选值:auto、async_profiler、jfr、off。

    off表示不打开CPU热点剖析,其他值表示打开。建议选择auto。

    备注说明

    JVM 参数

    环境变量

    说明

    profiling.app.name

    PROFILING_APP_NAME

    应用名

    profiling.agent.upload.server

    PROFILING_AGENT_UPLOAD_SERVER

    JFR文件上传服务器地址,默认值:http://localhost:4040

    • 不以http开头,系统将自动添加http前缀。

    • 不以正斜线(/)结束,系统将自动添加正斜线(/)。

    profiling.agent.timeout

    PROFILING_AGENT_TIMEOUT

    上传JFR文件时的网络超时时间,默认值:10,单位:秒。

    profiling.agent.ingest.max.tries

    PROFILING_AGENT_INGEST_MAX_TRIES

    上传JFR文件时的重试次数,默认值:2。

    profiling.app.http.headers

    PROFILING_APP_HTTP_HEADERS

    上传JFR文件时的HTTP头,默认值:空。例如 SESSION_ID=1111;XXX=YYY。

    profiling.app.labels

    PROFILING_APP_LABELS

    上传JFR文件时的标签,默认值:空。例如env=dev;lang=java;biz=member。

    profiling.agent.log.level

    PROFILING_AGENT_LOG_LEVEL

    日志级别,默认值:info,可选值:info、debug、error。

    profiling.agent.log.file

    PROFILING_AGENT_LOG_FILE

    日志文件路径,默认值:输出到Java的标准输出,可选值:/path/to/profiling.log。

    profiling.period

    PROFILING_PERIOD

    上传周期,即每隔多久上传一次剖析数据。默认值:1分钟。

    profiling.delay

    PROFILING_DELAY

    剖析延迟时间,默认值:0,启动后马上开始剖析。其中值表示延迟对应秒数再开启剖析。

    profiling.start.at.zero.second

    PROFILING_START_AT_ZERO_SECOND

    如果希望在每分钟的0秒开始剖析,则设置为true。例如设置为true,且当前时间是30秒,则会自动等待30后后再开启剖析。

    默认值:false。

    profiling.compression.mode

    PROFILING_COMPRESSION_MODE

    压缩方式,默认值:none,可选值:gzip、none。

    • none:文件后缀为.jfr。

    • gzip:文件后缀为.jfr.gzip。

    profiling.trigger.mode

    PROFILING_TRIGGER_MODE

    触发模式,自动周期性触发或者单次触发。默认值:periodic, 可选值:periodic、api。

    agent模式适合periodic。

    profiling.output.format

    PROFILING_OUTPUT_FORMAT

    文件格式,默认值:jfr,可选值:jfr、collapsed。

    profiling.cpu.engine

    PROFILING_CPU_ENGINE

    CPU热点剖析引擎,默认值:off,可选值:auto、async_profiler、jfr、off。

    off表示不打开CPU热点剖析,其他值表示打开。建议选择auto。

    profiling.cpu.interval

    PROFILING_CPU_INTERVAL

    CPU热点剖析的间隔,值越小开销越大。 默认值:10,单位:毫秒。

    profiling.wallclock.engine

    PROFILING_WALLCLOCK_ENGINE

    墙钟热点剖析引擎,默认值:off,可选值:auto、async_profiler、off。

    off表示不打开墙钟热点剖析,其他值表示打开,建议选择off。

    profiling.wallclock.interval

    PROFILING_WALLCLOCK_INTERVAL

    墙钟热点剖析的间隔,值越小开销越大。默认值:20,单位:毫秒。

    profiling.wallclock.thread.filter

    PROFILING_WALLCLOCK_THREAD_FILTER

    墙钟热点剖析的线程过滤器, 默认值0,不剖析任何线程。

    可选值:

    • 空:""

    • 单个线程:123

    • 多个线程:122,123

    线程范围:122-134。

    profiling.wallclock.threads.per.tick

    PROFILING_WALLCLOCK_THREADS_PER_TICK

    墙钟热点剖析每次剖析的线程数上限,默认值:8。

    profiling.alloc.engine

    PROFILING_ALLOC_ENGINE

    Alloc(内存申请)热点剖析引擎,默认值:off,可选值:auto、async_profiler、jfr、off。

    off表示不打开Alloc热点剖析,其他值表示打开,建议选择auto。

    profiling.alloc.interval

    PROFILING_ALLOC_INTERVAL

    内存申请热点剖析的间隔, 值越小开销越大。默认值256,单位:kilo bytes。

    profiling.jfr.max.size

    PROFILING_JFR_MAX_SIZE

    JFR文件的体积上限,超过后自动丢弃数据,默认值64m,可选值:256k、10m。

    profiling.jfr.max.age

    PROFILING_JFR_MAX_AGE

    JFR文件的时间上限,超过后会会自动丢弃数据,默认值:10m,可选值:1m、1h、1d。

    profiling.jfr.max.stack.depth

    PROFILING_JFR_MAX_STACK_DEPTH

    JFR采样时的栈深度限制,默认值:64。

后续步骤

接入性能数据后,您可以通过性能监控探索功能进行性能问题排查。具体操作,请参见数据查询数据对比