
❝如果,你的Doris集群突然表现异常,FE的CPU使用率莫名飙升,而这个问题却像捉迷藏般难以在测试环境中重现。在这个紧要关头,你需要一个可靠的"侦探工具"来破解这个性能之谜。
本文将为你介绍JVM性能分析的一把利器——jstack,看似简单的命令行工具,却能帮你揭开Java线程的神秘面纱...

背景
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时间最多的代码块,具体步骤如下:
1. 进行进程号查询
执行ps -ef|grep FE 或者直接jps 命令查看该FE应用进程号,可以看到结果为4108340。

2. 确定CPU 占用率高的线程
执行“top -Hp 4108340” 打开TOP视图,然后在线程视图中按 P 键,按照 CPU 使用率降序排列线程,找出 CPU 占用率高的线程。我们以4112817号线程测试。

3. 线程 ID 转换为十六进制
上图中的线程 ID 是以十进制显示的,而 Java 中的线程 ID 是以十六进制显示的。你可以使用 printf 命令将线程 ID 转换为十六进制。
[liyuanyuan@VM-10-6-centos ~]$ printf "%x\n" 4112817
4. jstack定位问题
使用jstack定位问题,执行“ jstack 4108340 |grep 3ec1b1 -A 27”命令过滤出进程4108340上线程3ec1b1中的线程调用栈情况,这样便快能定位到占用CPU时间最长的代码块。(附图是测试,无实际问题)

结语
如果线上分析时间有限,也可以通过jstack 4108340 > fe.jstack.log命令将进程号为4108340的FE进程的栈信息保存起来后续分析。
jstack 4108340 > fe.jstack.log
有遇到FE CPU异常可以先按照这个思路去排查下,或者收集下 jstack 给到Doris社区同学协助分析。
下期,我们将一起探讨其它更有趣有用有价值的内容,敬请期待!

一臻数据致力于大数据AI时代的前沿内容分享,会持续分享更多有趣有用有态度的知识。同时也欢迎大家投稿,共建共进,帮助圈友们冲破认知壁垒,实现自我提升!
另外,整理了份《一臻数据知识库》,其中包含 Apache Doris 和 Data+AI 的学习资料、学习课程、白皮书、研究报告、行业标准 和 实践指南 等内容,会持续更新,欢迎关注公众号,免费领取。
资料获取 🔗 欢迎扫描下方二维码图片 备注【Doris】免费领取❗️

往期推荐

点击下方蓝字关注一臻数据




