使用 async-profiler 分析内存

发布时间:2023年12月28日

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'
文章来源:https://blog.csdn.net/bluishglc/article/details/135261247
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。