背景
Doris集群的角色分为FE和BE。在存储层面FE负责存储和维护集群的元数据。在计算方面FE负责接收和解析用户的查询请求,规划查询计划,调度查询结果。BE负责数据的主要存储和计算,以及根据FE生成的物理执行计划,然后进行分布式查询。
因此对于Doris来说其实主要的内存和CPU的使用主要集中在BE,但是实际运行环境中偶尔也会出现有的同学线上FE环境出现CPU使用过高的问题。并且这种情况可能只出现在线上特点的环境上,想要线下复现难度很大,这个是时候就需要我们通过对线上FE进程的CPU使用情况进行分析和定位问题,同时也适用于FE执行慢或者卡住等问题的排查。
因为FE是基于Java编写的,那么问题就变为如何对FE的JVM进程的CPU使用进行分析的问题。JVM内存分析工具比较多,这里介绍最常用jstack的使用方式。
基于jstack进行FE线程分析
jstack是堆栈跟踪工具,一般用于查看某个进程内线程的情况。比较典型的应用是分析占用CPU时间最多的代码块,具体步骤如下。
-
进行进程号查询,执行ps -ef|grep FE 或者直接jps 命令查看该FE应用进程号,可以看到结果为4108340。
-
执行“top -Hp 4108340” 打开TOP视图,然后在线程视图中按 P 键,按照 CPU 使用率降序排列线程,找出 CPU 占用率高的线程。我们以4112817号线程测试。
-
中的线程 ID 是以十进制显示的,而 Java 中的线程 ID 是以十六进制显示的。你可以使用 printf 命令将线程 ID 转换为十六进制。
[liyuanyuan@VM-10-6-centos ~]$ printf "%x\n" 4112817
-
使用jstack定位问题,执行“ jstack 4108340 |grep 3ec1b1 -A 27”命令过滤出进程4108340上线程3ec1b1中的线程调用栈情况,这样便快能定位到占用CPU时间最长的代码块。(附图是测试,无实际问题)
-
如果线上分析时间有限,也可以通过jstack 4108340 > fe.jstack.log命令将进程号为4108340的FE进程的栈信息保存起来后续分析。
jstack 4108340 > fe.jstack.log