背景

7月14版本上线,7月16日doris集群BE节点短时间内陆续挂掉,暂时重启解决,7月17日周一上班,BE节点开始反复挂掉影响使用

问题定位:

1、查看doris BE节点日志

be.out日志如下所示,由第7行(doris::PlanFragmentExecutor)可看出是因为sql执行引发的问题,需要进一步的通过CoreDump来定位到触发BE的查询

*** Aborted at 1689488662 (unix time) try "date -d @1689488662" if you are using GNU date ***
*** SIGSEGV unkown detail explain (@0x0) received by PID 44257 (TID 0x7fb793b90700) from PID 0; stack trace: ***
0# doris::signal::(anonymous namespace)::FailureSignalHandler(int, siginfo_t*, void*) at /mnt/disk2/ygl/code/github/apache-doris/be/src/common/signal_handler.h:420
1# 0x00007FB7CC97C400 in /lib64/libc.so.6
2# doris::vectorized::IAggregateFunctionHelper<doris::vectorized::AggregateFunctionCountNotNullUnary>::add_batch(unsigned long, char**, unsigned long, doris::vectorized::IColumn const**, doris::vectorized::Arena*) const at /mnt/disk2/ygl/code/github/apache-doris/be/src/vec/aggregate_functions/aggregate_function.h:151
3# doris::vectorized::AggFnEvaluator::execute_batch_add(doris::vectorized::Block*, unsigned long, char**, doris::vectorized::Arena*) at /mnt/disk2/ygl/code/github/apache-doris/be/src/vec/exprs/vectorized_agg_fn.cpp:131
4# doris::vectorized::AggregationNode::_execute_with_serialized_key(doris::vectorized::Block*) at /mnt/disk2/ygl/code/github/apache-doris/be/src/vec/exec/vaggregation_node.cpp:864
5# std::_Function_handler<doris::Status (doris::vectorized::Block*), std::_Bind_result<doris::Status, doris::Status (doris::vectorized::AggregationNode::*(doris::vectorized::AggregationNode*, std::_Placeholder<1>))(doris::vectorized::Block*)> >::_M_invoke(std::_Any_data const&, doris::vectorized::Block*&&) at /mnt/disk2/ygl/installs/ldbtools/include/c++/11/bits/std_function.h:293
6# doris::vectorized::AggregationNode::open(doris::RuntimeState*) at /mnt/disk2/ygl/code/github/apache-doris/be/src/vec/exec/vaggregation_node.cpp:375
7# doris::PlanFragmentExecutor::open_vectorized_internal() at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/plan_fragment_executor.cpp:286
8# doris::PlanFragmentExecutor::open() at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/plan_fragment_executor.cpp:259
9# doris::FragmentExecState::execute() at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/fragment_mgr.cpp:248
10# doris::FragmentMgr::_exec_actual(std::shared_ptr<doris::FragmentExecState>, std::function<void (doris::PlanFragmentExecutor*)>) at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/fragment_mgr.cpp:481
11# std::_Function_handler<void (), std::_Bind_result<void, void (doris::FragmentMgr::*(doris::FragmentMgr*, std::shared_ptr<doris::FragmentExecState>, std::function<void (doris::PlanFragmentExecutor*)>))(std::shared_ptr<doris::FragmentExecState>, std::function<void (doris::PlanFragmentExecutor*)>)> >::_M_invoke(std::_Any_data const&) at /mnt/disk2/ygl/installs/ldbtools/include/c++/11/bits/std_function.h:291
12# doris::ThreadPool::dispatch_thread() at /mnt/disk2/ygl/code/github/apache-doris/be/src/util/threadpool.cpp:578
13# doris::Thread::supervise_thread(void*) at /mnt/disk2/ygl/code/github/apache-doris/be/src/util/thread.cpp:407
14# start_thread in /lib64/libpthread.so.0
15# clone in /lib64/libc.so.6

2、如何生成CoreDump

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

core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 1544256
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                     (-n) 655350
pipe size           (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority             (-r) 0
stack size             (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes             (-u) 655350
virtual memory         (kbytes, -v) unlimited
file locks                     (-x) unlimited

  第一行可以看到此服务器的core file size为不限制(若为0则不生成),可以通过命令来改变CoreDump的大小,也可以在be启动脚本中增加ulimit -c unlimited -n 65536

ulimit -c 1024 #设置CoreDump文件大小为1024k
ulimit -c unlimited #不限制CoreDump文件大小
  • 查看CoreDump文件的路径

  默认情况下,CoreDump生成的文件名为core,而且就在运行启动BE脚本目录下,新生成的CoreDump文件会覆盖旧的CoreDump文件。而如果proc/sys/kernel/core_uses_pid内容为1,则CoreDump文件会以core.进程id的方式被生成。(这里建议通过系统管理员将该开关打开)。如果在运行启动BE脚本目录下没有找到对应的CoreDump文件的话,可能是系统管理员修改了core_pattern。可以执行cat /proc/sys/kernel/core_pattern来查看core目录

3、利用CoreDump定位问题SQL

  gdb ../lib/palo_be core.xxxx
  • 通过查询栈索引得到QueryID

    执行完上一步之后再次输入bt命令打开堆栈,找到doris::PlanFragmentExecutor(可以不断按回车键查看下一批),此处日志可以看到在栈449

    #0  add (row_num=0, columns=0x556361d9a9b8, place=0x556361cb7018 "", this=0x55638449a790)
      at /mnt/disk2/ygl/code/github/apache-doris/be/src/vec/common/pod_array.h:342
      ····················
    #447 0x0000561787fe19d8 in doris::ScanNode::prepare(doris::RuntimeState*) ()
      at /mnt/disk2/ygl/code/github/apache-doris/be/src/exec/scan_node.cpp:30
    #448 0x00005617880bedea in doris::OdbcScanNode::prepare(doris::RuntimeState*) ()
      at /mnt/disk2/ygl/code/github/apache-doris/be/src/exec/odbc_scan_node.cpp:57
    #449 0x0000561787990495 in doris::PlanFragmentExecutor::prepare(doris::TExecPlanFragmentParams const&, doris::QueryFragmentsCtx*) ()
      at /mnt/disk2/ygl/installs/ldbtools/include/c++/11/bits/unique_ptr.h:421
    #450 0x000056178790106d in doris::FragmentExecState::prepare (this=this@entry=0x5617b76a2000, params=...)
      at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/fragment_mgr.cpp:227
    #451 0x0000561787906b87 in doris::FragmentMgr::exec_plan_fragment(doris::TExecPlanFragmentParams const&, std::function<void (doris::PlanFragmentExecutor*)>) () at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/fragment_mgr.cpp:646
    #452 0x0000561787908bd0 in doris::FragmentMgr::exec_plan_fragment(doris::TExecPlanFragmentParams const&) ()
      at /mnt/disk2/ygl/installs/ldbtools/include/c++/11/tuple:746
    #453 0x0000561787a00cb6 in doris::PInternalServiceImpl<doris::PBackendService>::_exec_plan_fragment (this=0x5617906fe4e0,
       ser_request=..., version=<optimized out>, compact=<optimized out>)
      at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/exec_env.h:150
    ---Type <return> to continue, or q <return> to quit---q
    Quit

    输入q再回车退出,再次输入f 449切换到栈449,再次输入p _query_id得到query_id(用hi的值即可),输入p /x query_id将query_id转换为16进制

    (gdb) f 449
    #449 0x0000561787990495 in doris::PlanFragmentExecutor::prepare(doris::TExecPlanFragmentParams const&, doris::QueryFragmentsCtx*) ()
      at /mnt/disk2/ygl/installs/ldbtools/include/c++/11/bits/unique_ptr.h:421
    421 /mnt/disk2/ygl/installs/ldbtools/include/c++/11/bits/unique_ptr.h: 没有那个文件或目录.
    (gdb) p _query_id
    $1 = {<apache::thrift::TBase> = {_vptr.TBase = 0x56178ca192a0 <vtable for doris::TUniqueId+48>}, hi = -2521141818464581758,
    lo = -7080784611811882727}
    (gdb) p /x -2521141818464581758
    $2 = 0xdd031adfaa094782

    此时需要查询所有FE的fe.audit.log来搜索(grep对应日期的fe.audit.log日志)query_id如下所示,此处通过Stmt属性看出问题sql`

[root@localhost log]# grep dd031adfaa094782 fe.audit.log.20230717-1
2023-07-17 14:08:06,389 [query] |Client=10.196.166.3:34996|User=root|Db=default_cluster:ssom_doris|State=ERR|Time=3377|ScanBytes=0|ScanRows=0|ReturnRows=0|StmtId=14121202|QueryId=dd031adfaa094782-9dbbffe941e68919|IsQuery=true|feIp=10.196.166.4|Stmt=SELECT   columns FROM table_name   WHERE  del_flag='0' AND ((condition1 = '113.108.173.100' AND condition2 = 3602959022916898816) OR (condition1 = '61.147.93.7' AND condition2 = null) OR (condition1 = '120.197.38.18' AND condition2 = null) OR (condition1 = '61.147.96.60' AND condition2 = null) OR (condition1 = '119.34.177.100' AND condition2 = null) OR (condition1 = '14.125.55.70' AND condition2 = null)....)|CpuTimeMS=0|SqlHash=e332b6574b085aa6a57425e79cbf4104|peakMemoryBytes=0

参考链接:https://www.jianshu.com/p/60a5df15093c

https://wizardforcel.gitbooks.io/100-gdb-tips/content/display-instruction-pc.html

Doris-BE节点集体挂掉问题排查的更多相关文章

  1. Apache Doris 单节点(可多节点)Docker集群制作教程

    集群制作Author:苏奕嘉脚本研发Author:种益调研测试Author:杨春东 前言 Apache Doris是当下非常火热和流行的MPP架构OLAP数据库,很多同学想自学/测试Doris的使用和 ...

  2. 一次erlang 节点CPU严重波动排查

    新服务上线后观察到,CPU在10 ~ 70%间波动严重,但从每秒业务计数器看业务处理速度很平均. 接下来是排查步骤: 1. dstat -tam 大概每10s一个周期,网络流量开始变得很小,随后突然增 ...

  3. Cloudera Manager Service Monitor 定期挂掉问题排查

    显示:查询 Service Monitor 时发生内部错误(Error sending messages to firehose: mgmt-SERVICEMONITOR-) 1.初步排查出是smon ...

  4. 一次galera cluster集群故障节点无法启动问题排查

    现象 环境: Server version: 10.0.25-MariaDB-wsrep MariaDB Server, wsrep_25.13.raf7f02e 配置文件: [root@node-2 ...

  5. K8S中POD节点状态ContainerCreating原因排查

    现象: # kubectl get pods -n kube-system |grep dashboard kubernetes-dashboard-6685cb584f-dqkwk 0/1 Cont ...

  6. Doris FE负载均衡配置

    0 背景概述 Doris完全兼容了mysql协议,并且Doris FE本身通过多follower选举机制选举出master,可以保证fe本身的高可用性,也可以通过加入observer fe节点来提高f ...

  7. HBase管理与监控——HMaster或HRegionServer自动停止挂掉

    问题描述 HBase在运行一段时间后,会出现以下2种情况: 1.HMaster节点自动挂掉: 通过jps命令,发现HMaster进程没了,只剩下HRegionServer,此时应用还能正常往HBase ...

  8. Consul的一个更新:服务端节点故障后重连

    研究了一段时间Consul,想写个攻略来着,但太赖了而且表达能力非正常人...今天发现HashiCorp果然接纳大众意见改了点东西.. 场景是: 假如Consul集群内有三个Server Node 时 ...

  9. Cassandra1.2文档学习(2)——节点间通信协议之gossip协议

    参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...

  10. Redis随笔(四)Centos7 搭redis3.2.9集群-3主3从的6个节点服务

    1.虚拟机环境 使用的Linux环境已经版本: Centos 7   64位系统 主机ip: 192.168.56.180 192.168.56.181 192.168.56.182 每台服务器是1主 ...

随机推荐

  1. 用QT、QImage来制作简单图像处理工具

    用QT.QImage来制作简单图像处理工具 源码地址: https://github.com/dependon/simple-image-filter 下载地址(windows版本) github 下 ...

  2. 使用Streamlit构建批量二维码生成器

    Streamlit是一个优秀的Python库,让数据科学家和开发者能够快速创建交互式Web应用.今天,我将展示如何使用Streamlit和qrcode库构建一个简单而实用的批量二维码生成器. 技术栈 ...

  3. 为什么构建容器需要Namespace?

    1.什么是Namespace? Namespace 是 Linux 内核的一个特性,该特性可以实现在同一主机系统中,对进程 ID.主机名.用户 ID.文件名.网络和进程间通信等资源的隔离.Docker ...

  4. 2025AI元年,常见智能体盘点

    你好,小钗在医疗AI.教育AI.管理AI有丰富的经验 关注公众号,回复1,与我交个朋友吧 2025被成为国内AI应用元年,抛开各个公司正在自研的各种产品,有两类产品是比较红火的:Agent平台以及智能 ...

  5. Es简单条件查询

    一:先看一下es的语句以及查询结果:  我这边使用的条件是is_device要么是工控要么是资产 二:java代码部分 关于es的操作,java里面不需要添加mapper层,只要在service以及c ...

  6. 给Markdown渲染网页增加一个目录组件(Vite+Vditor+Handlebars)(下)

    1 引言 在上一篇文章<给Markdown渲染网页增加一个目录组件(Vite+Vditor+Handlebars)(上)>中笔者介绍了如何实现在Markdown渲染网页中加一个目录组件.不 ...

  7. 在Linux下使用wxWidgets进行跨平台GUI开发(三)

    创建wxWidgets应用程序 在本文中,我们将了解创建wxWidgets应用程序所需的基础知识.首先创建一个简单的示例程序,展示如何显示图标:接着通过另一个示例演示事件的使用方法:最后探讨wxWid ...

  8. NOIP 2024 游寄

    别让我担心 派蒙可爱! 天气晴 风平浪静 沙滩上混乱的脚印 钓鱼竿 两份孤单 会飞的落汤鸡 是故事的开局 青橙紫绿 留影机塞满了回忆 可我却无比思念 遇见你的那一集 才发现我们早已 走了很远很远 多少 ...

  9. Mybatis - 精巧的持久层框架 - 注解开发深刻理解

    Mybaits的注解开发是现代Java项目(特别是Spring Boot项目)中非常主流的开发方式.它能让你摆脱繁琐的XML文件,以一种更"Java-Native"的方式编写数据访 ...

  10. 从Rust想到C#

    近几年,RUST语言越来越受大家的喜爱,排除去一些跟风者,大部分的人喜欢RUST的内存安全性和高效的性能.但编译速度始终是它的短板. 这几天,突然有一个想法,如果C#或者说.NET的编译器也做成RUS ...