采集 Elasticsearch 火焰图

背景

有个 ES 集群,业务写数入集群时经常导致集群 CPU 告警和集群端口响应超时(20s无响应),故希望通过采集火焰图分析原因。

工具选择

Arthas

Introduction

Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状态?
  7. 怎么快速定位应用的热点,生成火焰图?

Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

以上描述摘自官方描述~~~

Arthas 自 3.1.5 版本起集成了开箱即用的 Profiler / 火焰图功能,因此首选了通过 Arthas 工具来采集。

Version

笔者在此使用的是 3.2.0 版本 Arthas

#1坑

运行工具自带的测试 demo ,测试采集程序火焰图,出现如下报错:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CNgH2ajF-1588863523157)(%E9%87%87%E9%9B%86Elasticsearch%E7%81%AB%E7%84%B0%E5%9B%BE.assets/image-20200507215651945.png)]

[arthas@16648]$ profiler start
/home/es/gaoyh/arthas/async-profiler/libasyncProfiler-linux-x64.so: /lib64/libc.so.6: version `GLIBC_2.14’ not found (required by /home/es/gaoyh/arthas/async-profiler/libasyncProfiler-linux-x64.so)

从网上查找资料后,发现是 GLIBC 版本不支持。测试机器的 GLIBC 支持版本如下:

strings /lib64/libc.so.6 | grep GLIBC

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xwYrMv3E-1588863523161)(%E9%87%87%E9%9B%86Elasticsearch%E7%81%AB%E7%84%B0%E5%9B%BE.assets/image-20200507220300898.png)]

参考文章:

但生产环境部署 ES 机器的机器,是支持 GLIBC_2.14 的,因不确定升级带来的影响,另找了另外一台和生产环境一致的测试机器进行测试:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LOBYWErG-1588863523164)(%E9%87%87%E9%9B%86Elasticsearch%E7%81%AB%E7%84%B0%E5%9B%BE.assets/image-20200507220532070.png)]
成功采集测试 demo 的火焰图信息。

采集命令参考官方说明文档。

#2坑

似乎没有问题了,接下来,准备采集自测 ES 集群火焰图:

笔者自测 ES 集群环境信息:

ES 版本:V_5.4.2;

JDK 版本:JDK_1.8.0_231;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pYrLvbpr-1588863523167)(%E9%87%87%E9%9B%86Elasticsearch%E7%81%AB%E7%84%B0%E5%9B%BE.assets/image-20200507221059263.png)]

[ERROR] Start arthas failed, exception stack trace:
com.sun.tools.attach.AgentInitializationException: Agent JAR loaded but agent failed to initialize
at sun.tools.attach.HotSpotVirtualMachine.loadAgent(HotSpotVirtualMachine.java:121)
at com.taobao.arthas.core.Arthas.attachAgent(Arthas.java:104)
at com.taobao.arthas.core.Arthas.(Arthas.java:28)
at com.taobao.arthas.core.Arthas.main(Arthas.java:123)
[ERROR] attach fail, targetPid: 37133

在进入 Arthas 对 ES 运行状况查看时即报错,通过查阅资料得知,此问题原因是由于 ES 集群权限限制所致,可查看 Issue#156[https://github.com/alibaba/arthas/issues/156#] ,按照其中讨论,采用在 java.policy 文件(jdk1.8.0_231/jre/lib/security/java.policy)中新增如下配置:

permission java.security.AllPermission;
permission java.lang.RuntimePermission "*";
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
permission java.net.NetPermission "*";
permission java.net.SocketPermission "localhost:0","resolve,listen";
permission java.net.URLPermission "http:*","*:*";
permission java.net.URLPermission "https:*","*:*";
permission org.elasticsearch.ThreadPermission "modifyArbitraryThreadGroup";

新增之后,仍然报原先的错误,重启 ES 节点之后,Arthas 恢复正常,可以正常采集火焰图信息了。

但生产环境,重启 ES 节点,肯定不合适,故此方式不合适。

java.policy 可参考文章:

因此,只能放弃通过 Arthas 工具采集火焰图信息。

async-profiler

Introduction

async-profile 目前支持 Linux 和 macOS 平台(macOS 下只能分析用户空间的代码)。

  • Linux / x64 / x86 / ARM / AArch64
  • macOS / x64

根据系统环境,从 GitHub 上下载对应版本

https://github.com/jvm-profiling-tools/async-profiler

async-profiler 工具进行火焰图采集,从 1.2 版本起已经内置了开箱即用的 SVG 文件生成功能,更早之前的版本生成火焰图则需要 FlameGraph 工具。

更多详细信息可查看官方文档:https://github.com/jvm-profiling-tools/async-profiler

Version

笔者在此使用的是 1.7 版本的 async-profiler 。

过程

async-profiler 工具的安装和使用本文不予介绍,可自行上网查阅资料。

可参考文章:

安装完成之后,对自测 ES 集群进行火焰图采集,一帆风顺哈哈哈哈哈哈哈哈哈

Commands

火焰图采集,命令简析

Arthas
	https://arthas.gitee.io/profiler.html
	
async-profiler
	Usage: ./profiler.sh [action] [options] <pid>
	eg:
		./profiler.sh -d 30 -f profile.svg 3456
		对 PID 为 3456 的 java 进程采样 30 秒,然后生成 profile.svg 结果文件
		默认情况下是分析 CPU 性能,如果要进行其他分析,可以使用 -e 参数:
			-e event     profiling event: cpu|alloc|lock|cache-misses etc.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章