Doris BE宕机问题排查指南

文摘   2024-10-27 00:00   重庆  

  导读   本文主要分享 Doris BE 宕机异常分类、BE Crash 排查和BE OOM 分析。

全文目录:

  1. 背景介绍

  2. BE宕机分类

  3. BE Crash排查

  4. BE OOM 分析



一、背景介绍

在实际线上生产环境中,大家可能遇到过BE 宕机的问题,Apache Doris 的BE部分是由C++编写,当出现一些内存越界,非法访问的问题时会导致BE进程的Crash,同时也比较难排查,我们通过几个例子来带大家一起分析下。同时一般为了减小此类问题对线上业务造成影响,大家都会通过一些特殊方案来避免,比如:

1. 容灾备份、读写分离、建设两地三中心等: 跨集群数据同步 

2. 手动配置 Service 自动拉起:服务自动拉起 - Apache Doris

3. 服务自动拉起 Manager 接管集群进行服务自动拉起:Doris Manager

二、BE宕机分类

目前一般遇到的有这么几种情况:

1. BE 进程非正常退出 

    a. 有 bug 导致BE进程Crash 

    b. BE 进程OOM 

2. BE 进程正常退出 

这里我们主要看非正常退出这块。因为其实有部分情况是这样的,有些同学和运维同学内部没有对齐,可能服务器reboot了或者什么情况,所以一般出现问题后,可以先和社区的同学对齐下,看看是否有其它操作。

如何判断是 BE 进程是 Crash还是OOM?

1. 首先可以看be/log/be.out中是否有堆栈信息,如果有堆栈信息输出就是crash了,如下:

2. 如果没有堆栈信息,只有一些启动信息的话,可以通过执行dmesg -T 看看是否是OOM,如果是OOM会有Killed的日志:

三、BE Crash排查

BE Crash 后如何排查: 

1. 首先BE core了之后先不要着急,可以先尝试将服务拉起来(建议配置自动拉起),后续继续排查。首先观察堆栈信息,堆栈中有一个 Query id ,这个一般是导致BE core的query

2. 通过 query_id 定位下是哪条sql导致的,需要去fe下fe.audit.log中grep下,注意要去所有FE 节点进行搜索,因为如果是做了负载均衡的话可能是发送到其中一个fe节点执行的,因为查询这种不涉及元数据操作的sql是不会转发到master的。比如:

grep "58a4a56ad38f4f57-b958cc1374948c85" fe/log/fe.audit.log

3. 定位出是哪条sql导致的,可以先把这条sql禁止掉,同时方便的话可以整理下涉及到的表的schema信息等,把be.out + 整理的信息提供给社区同学,方便复现和定位问题

4. 等待社区同学进行分析和判断,同时可以判断下这个问题的影响面:

    a. 如果这个问题比较严重,且是未知问题,可以先等社区分析和修复,着急的话可以联系社区同学提供patch包(patch包没有经过回归测试,所以需要评估)

    b. 如果是已知问题,并且在新版本已经修复,那么可以考虑通过升级解决这个问题

特殊情况

有时候问题比较难复现,排查问题的周期也会比较长,如果问题比较严重,那么对用户业务的影响面还是比较大的,所以有时需要用户环境生成的 core 文件来配合进行debug,来尽快的定位和fix问题。下边介绍下如何取core文件:

1. 查看生成CoreDump文件的开关是否开启,输入命令 ulimit -a

2. 第一行 core file size 为0,则不会生成CoreDump。使用 ulimit -c [kbytes] 命令可以设置系统允许生成的CoreDump的文件大小。所以在BE启动时,加入以下命令 即可ulimit -c unlimited -n 65536 && sh start_be.sh --daemon启动后可以通过 cat /proc/{be pid}/limits 确认是否成功开启coredump,core file size是 unlimited 则表示已经成功打开


3. 此时,就会在BE Crash的时候,生成CoreDump文件,默认的位置是在BE目录下,如果BE目录下没有core文件,执行以下命令,这里显示CoreDump文件被core_pattern定义设置在了/tmp目录下,所以需要到对应的目录查找BE生成的CoreDump文件

cat /proc/sys/kernel/core_pattern/tmp/core_%t_%e_%p

4. 方便的话可以把core文件进行压缩上传到对象存储上,然后提供给社区同学进行问题的定位和fix

四、BE OOM 分析

一般大家在使用的过程中会遇到内存泄漏不释放,或者是因为一些大query和load任务导致OOM的情况,下文带大家一起实操一把,如何进行分析。首先可以参考官网OOM的分析以及memtracker如何看:

BE OOM分析 - Apache Doris:

https://doris.apache.org/zh-CN/docs/admin-manual/memory-management/be-oom-analysis/?_highlight=oom#%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90

内存跟踪器 - Apache Doris:

https://doris.apache.org/zh-CN/docs/admin-manual/memory-management/memory-tracker/?_highlight=mem&_highlight=tracker#%E9%A6%96%E9%A1%B5-mem_tracker

1. Cache 没及时释放导致BE OOM(2.0.3-rc04)

1. BE 出现宕机,且已经通过 dmesg -T 确定是OOM


2. 这时候如果有部署监控,可以通过监控看下具体内存的使用情况

3. 通过BE重启的时间节点,找到最后一次打印的memtracker的统计信息进行分析

4. 从这个日志中可以详细的看到各个模块在内存的使用情况

BE 进程总共使用了209.01 GB
内存中 导入69G,其中 LoadChannelMgr 33G
page cache 46G
jemalloc cache 15G
brpc IOBufBlockMemory 5G
SegCompaction 13G
orphan 77
其中应该大部分是 segment cache、tablet schema 等元数据内存

分析: 

minor gc 只会淘汰过期的cache,full gc才会淘汰所有cache,
因为 GC 线程卡住,一直没到full gc,所以page cache等一直没释放,最终导致OOM。

临时规避方式: 

1. 调低 jemalloc purge dirty page 时间,be.conf 中修改 JEMALLOC_CONF,
把 dirty_decay_ms:15000 改成 dirty_decay_ms:3000, 
预期对性能的影响很小
2. be.conf 中增加 soft_mem_limit_frac=1,mem_limit=75%,确保只会触发full gc

补充:
目前2.0最新的tag,已经将 jemalloc purge dirty page改成异步的了,不会再阻塞gc过程

2. 大查询导致BE OOM

1. 通过BE重启的时间节点,找到最后一次打印的memtracker的统计信息进行分析

2. 从这里memtracker统计信息中能看到query占了156.74 GB

    a. 557061ef69164835-91b49a23b5ad2e86, 11:25:50.78提交,11:26:00系统内存不足被cancel

    b. 44fe8d21b1bc464e-8b76ebd5616b5a2e, 11:25:50.58提交,11:26:01.53系统内存不足被cancel

    c. 21fbdf757857472f-acc7b3019a9cf5c7,11:25:50.62 提交,11:26:02.12系统内存不足被cancel

MemTrackerLimiter Label=Query#Id=557061ef69164835-91b49a23b5ad2e86, Type=query, Limit=2.00 GB(2147483648 B), Used=19.71 GB(21161637576 B), Peak=19.71 GB(21161637576 B)
    MemTrackerLimiter Label=Query#Id=44fe8d21b1bc464e-8b76ebd5616b5a2e, Type=query, Limit=2.00 GB(2147483648 B), Used=19.48 GB(20918726034 B), Peak=19.48 GB(20918726034 B)
    MemTrackerLimiter Label=Query#Id=cdab77b22af4838-bf091a81792ce980, Type=query, Limit=2.00 GB(2147483648 B), Used=19.03 GB(20434770852 B), Peak=19.03 GB(20434770852 B)
    MemTrackerLimiter Label=Query#Id=970a709426054d7c-adb669c4a0149008, Type=query, Limit=2.00 GB(2147483648 B), Used=18.06 GB(19391774018 B), Peak=18.06 GB(19391774018 B)
    MemTrackerLimiter Label=Query#Id=21fbdf757857472f-acc7b3019a9cf5c7, Type=query, Limit=2.00 GB(2147483648 B), Used=17.97 GB(19289808376 B), Peak=17.97 GB(19289808376 B)
    MemTrackerLimiter Label=Query#Id=7b588343d6b44405-a6133ba172430450, Type=query, Limit=2.00 GB(2147483648 B), Used=17.63 GB(18927825655 B), Peak=17.63 GB(18927825655 B)
    MemTrackerLimiter Label=Query#Id=b3d4d075f39f48bd-89ab45378d20a028, Type=query, Limit=2.00 GB(2147483648 B), Used=17.07 GB(18332161696 B), Peak=17.07 GB(18332161696 B)

结论

query cancel不及时导致OOM,情况比较极端:

    a. 11:25:50 同一时间提交了10个左右大查询,每个内存都在10G+ 

    b. 11:26:00 - 11:26:02 GC发现系统内存不足陆续cancel了这10个query,此时系统可用内存只剩3G 

    c. 11:26:04 BE进程OOM,query没有cancel完成

目前2.1 版本上目前修复了一些 query cancel 慢的问题,规避方式:

be.conf 中增加 
max_sys_mem_available_low_water_mark_bytes=6871947672   (默认1.6G,改成6.4G或3.2G) 








关于社区






Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。 
如果您对 Apache Doris 感兴趣,可以通过以下入口访问官方网站、社区论坛、GitHub和dev邮件组:
💡官网文档:https://doris.apache.org 
💡社区论坛:https://ask.selectdb.com 
💡GitHub:https://github.com/apache/doris 
💡dev邮件组:dev@doris.apache.org
非常欢迎您在社区论坛中与其他用户分享您的使用经验和技巧,或者向dev邮件组提交反馈和意见。
相信,您的参与将帮助Apache Doris变得更加完善。

大数据技能圈
分享大数据前沿技术,实战代码,详细文档
 最新文章