async-profiler 是非常主流的 Java Profiling 工具之一,且对 Linux 支持良好,适合分析运行在服务器上的 Java 应用程序在 CPU 和内存上的占用情况。本文介绍一下 async-profiler 的安装和使用方法。
1. 安装
wget https://github.com/jvm-profiling-tools/async-profiler/releases/download/v2.9/async-profiler-2.9-linux-x64.tar.gz
sudo tar -zxvf async-profiler-2.9-linux-x64.tar.gz -C /opt/
sudo ln -s /opt/async-profiler-2.9-linux-x64/profiler.sh /usr/bin/profiler
# 配置 Linux 内核 允许所有用户使用 perf_events 捕捉调用堆栈
# 否则对 CPU Profiling 时会报错
sudo sh -c 'echo 1 >/proc/sys/kernel/perf_event_paranoid'
sudo sh -c 'echo 0 >/proc/sys/kernel/kptr_restrict'
CPU分析
我们以在 EMR 上分析 RegionServer 进程的CPU占用情况为例:
service_name_keyword=RegionServer
sudo profiler -d 600 -e cpu -f /tmp/$(hostname)-regionserver-cpu.html $(pgrep -f $service_name_keyword)
注意:输出文件要放到一个广泛可写入的位置,例如上述命令中的/tmp
,否则汇报无权写入文件的错误。输出结果:
内存分析
我们以在 EMR 上分析 RegionServer 进程的内存占用为例:
service_name_keyword=RegionServer
sudo profiler -d 600 -e alloc -f /tmp/$(hostname)-regionserver-alloc.html $(pgrep -f $service_name_keyword)
注意:输出文件要放到一个广泛可写入的位置,例如上述命令中的/tmp
,否则汇报无权写入文件的错误。输出结果:
如何理解火焰图
async-profiler 生成的分析报告是一种火焰图,这种图并不难理解,只需知道关键的两点即可:
-
横向条宽代表占用内存的比例,条越宽表示占用内存的比例越大
-
纵向堆栈代表占用程序的调用堆栈(完全遵循源代码中的调用堆栈)
之所以是“火焰”形状,就是因为图的整体布局是按调用堆栈分布的,下层堆栈的CPU和内存在上层堆栈会分化和细分,自然形成锥形的火焰状布局。
已知错误
[ERROR] No access to perf events. Try --fdtransfer or --all-user option or ‘sysctl kernel.perf_event_paranoid=1’
这是由于没有配置 Linux 内核 允许所有用户使用 perf_events 捕捉调用堆栈导致的,只需执行如下命令即可解决问题:
sudo sh -c 'echo 1 >/proc/sys/kernel/perf_event_paranoid'
sudo sh -c 'echo 0 >/proc/sys/kernel/kptr_restrict'