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配置
登录日志服务控制台。
在日志应用区域的智能运维页签下,单击全栈可观测。
在SLS全栈可观测页面,单击目标实例。
在左侧导航栏中,单击性能监控。
首次在该实例中使用性能监控时,请单击立即开启。
在左侧导航栏中,单击数据接入,然后在数据接入配置页面,找到通用推送接入。
首次创建目标监控项的接入配置时,打开创建开关,可进入配置页面。如果您已创建过接入配置,则单击图标,可进入配置页面。
创建机器组。
如果您已有可用的机器组,请单击使用现有机器组。
如果您还没有可用的机器组,请执行以下操作。
确认您的服务器类型。
如果是同账号下的ECS,请在ECS机器页签中,通过手动选择实例方式选择目标ECS实例,单击创建。
具体操作,请参见安装Logtail(ECS实例)。
如果是与日志服务属于不同账号的ECS、其他云厂商的服务器和自建IDC,请您在服务器上手动安装Linux Logtail 1.7及以上版本。具体操作,请参见安装Logtail(Linux系统)。
重要手动安装Logtail后,您必须在该服务器上手动配置用户标识。具体操作,请参见配置用户标识。
如果是Kubernetes集群,请参见接入Kubernetes资源监控数据安装Logtail组件。
安装完成后,单击确认安装完毕。
在创建机器组页面,输入名称,单击下一步。
日志服务支持创建IP地址机器组和用户自定义标识机器组,详细参数说明请参见创建IP地址机器组和创建用户自定义标识机器组。
重要如果是在Kubernetes集群安装Logtail,会自动生成名为{instanceId}-{clusterId}-k8s-cluster的机器组,请跳过此步骤。
在机器组配置中,将目标机器组从源机器组移动到应用机器组,然后单击下一步。
重要如果创建机器组后立刻应用,可能因为连接未生效,导致心跳为FAIL,您可单击自动重试。如果还未解决,请参见Logtail机器组无心跳进行排查。
在数据源设置配置向导中,配置如下参数,然后单击完成。
参数
说明
配置名称
自定义设置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 | 数据上传地址。
|
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 | 数据上传地址。
|
PROFILING_CPU_ENGINE | CPU热点剖析引擎,默认值:off,可选值:auto、async_profiler、jfr、off。 off表示不打开CPU热点剖析,其他值表示打开。建议选择auto。 |
不以http开头,系统将自动添加http前缀。
不以正斜线(/)结束,系统将自动添加正斜线(/)。
none:文件后缀为.jfr。
gzip:文件后缀为.jfr.gzip。
空:""
单个线程:123
多个线程:122,123
备注说明
JVM 参数 | 环境变量 | 说明 |
profiling.app.name | PROFILING_APP_NAME | 应用名 |
profiling.agent.upload.server | PROFILING_AGENT_UPLOAD_SERVER | JFR文件上传服务器地址,默认值:http://localhost:4040。 |
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文件时的标签,默认值:空。例如 |
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。 |
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,不剖析任何线程。 可选值: 线程范围: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。 |