在 Elasticsearch Docker 容器中,导出堆栈信息
Contents
[TOC]
场景
因为在集群中,GC
频繁:
初步排查
该集群的Heap
是分配了 32G,从图中可以看到,每次都达到了 28G。
查看集群数据总量
|
|
查看各节点的segement memory
和cache
占用量
|
|
Heap Dump 分析
因为通常集群的Dump
文件都非常大,本地开发机器无法进行分析。具体如何分析超大的Dump
文件,可以参考我之前的文章Linux 中分析超大 JVM dump 文件,这里我就不赘述了。
这里主要说另一个问题:Docker
部署的集群,如何导出堆栈信息。
注意:我这里使用的是7.4.0
自带jdk
的集群版本。
Docker
内进行jmap
当我们使用docker exec -it es01 /bin/bash
进入到es
的镜像内后,直接使用jmap
是找不到的命令的。
不过,我们可以在这个图中发现,因为使用的是自带的jdk
,所以我们需要使用jdk/bin/jmap
这样来使用。
我们先尝试使用jps
查看:
|
|
可以看到,当前es
的进程PID
了(在Docker
内,通常都是1
)。
再使用jstack
,尝试查看当前堆栈:
|
|
却得到一个错误:
|
|
通过搜索响应的解决方案,这是因为镜像内执行用户不同导致的。在这里详细说明了如何解决,可以在exec
时,指定用户和用户组,进入后,就可以正常执行了。
|
|
Eclipse MAT
从这里下载MAT Download,因为集群的Dump
文件通常有几十G了,所以在解析时,需要找一台内存大机器以及配置MAT
的最大内存设置:
- 解压缩
MAT
后,修改MemoryAnalyzer.ini
文件,将内存设置为20GB
左右:
|
|
- 将
dump
文件拷贝过来,并执行分析:
|
|
这里,我使用了
nohup
,主要是因为大文件的分析比较耗时,无法保证服务端的shell
活动时间。
等待执行完毕……