2021年7月15日星期四

Doris开发手记3:利用CoreDump文件快速定位Doris的查询问题

Apache Doris的BE部分是由C++编写,当出现一些内存越界,非法访问的问题时会导致BE进程的Crash。这部分的问题常常较难排查,同时也很难快速定位到对应的触发SQL,给使用者带来较大的困扰。所以下面会介绍通过Linux的CoreDump快速定位到问题SQL,并复现问题的方式。

1.查看日志

当BE进程Crash的时候,可以先查看be.out日志,确认是否存在stack trace的记录。当BE出现进程Crash的时,都会将运行时的堆栈打印到be.out文件中,一般如下图所示:

image.png

但是由于这部分信息并不完整,只能大致的帮助定位到可能的SQL查询。所以需要进一步的通过CoreDump来定位到触发BE Crash的查询。

2. 如何生成CoreDump

  • 查看生成CoreDump文件的开关是否开启,输入命令ulimit -a
core file size   (blocks, -c) 0data seg size   (kbytes, -d) unlimitedscheduling priority    (-e) 0file size    (blocks, -f) unlimitedpending signals     (-i) 513562max locked memory  (kbytes, -l) 64max memory size   (kbytes, -m) unlimitedopen files      (-n) 10240pipe size   (512 bytes, -p) 8POSIX message queues  (bytes, -q) 819200real-time priority    (-r) 0stack size    (kbytes, -s) 10240cpu time    (seconds, -t) unlimitedmax user processes    (-u) 513562virtual memory   (kbytes, -v) unlimitedfile locks      (-x) unlimited

第一行core file size为0,则不会生成CoreDump。使用 ulimit -c [kbytes]命令可以设置系统允许生成的CoreDump的文件大小。

ulimit -c 1024            #设置CoreDump文件大小为1024k

ulimit -c unlimited      #不限制CoreDump文件大小   

执行命令 ulimit -c unlimited,这样当BE进程Crash时就可以生成CoreDump文件。通过BE的start_be.sh脚本启动BE时,脚本会自动设置ulimit的参数。由于CoreDump文件较大,默认情况下不会开启CoreDump,所以这里需要修改BE的启动脚本。

chmod 755 ${DORIS_HOME}/lib/palo_beecho "start time: "$(date) >> $LOG_DIR/be.out#if [ ! -f /bin/limit3 ]; then# LIMIT=#else# LIMIT="/bin/limit -c unlimited -n 65536"#fiulimit -c unlimited -n 65536if [ ${RUN_DAEMON} -eq 1 ]; then nohup $LIMIT ${DORIS_HOME}/lib/palo_be "$@" >> $LOG_DIR/be.out 2>&1 </dev/null &else $LIMIT ${DORIS_HOME}/lib/palo_be "$@" >> $LOG_DIR/be.out 2>&1 </dev/nullfi

直接在启动BE进程之前手动通过ulimit -c unlimited -n 65536的方式开启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/tmp/core_%t_%e_%p

这里显示CoreDump文件被core_pattern定义设置在了/tmp目录下,所以需要到对应的目录查找BE生成的CoreDump文件。

3.利用CoreDump定位问题Query

通过合理的配置之后,BE在Crash时就能正常生成CoreDump文件。利用GDB的打开CoreDump文件就能帮助我们取得对应的Query ID。

  • 使用GDB打开CoreDump文件
gdb be/lib/palo_be core.13610 

通常core文件会生成在BE进程的启动目录,但是如果额外配置过core-pattern,就得到对应的目录上找到对应的coredump文件,然后通过gdb be的binary coredump来打开它。

  • 通过查询栈索引到QueryID

打开之后,用bt命令展开堆栈,得到展开之后详细的堆栈信息

#0 0x00000000013957c6 in std::_Bit_reference::operator bool (this=<optimized out>) at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/stl_bvector.h:916#1 std::_Bit_const_iterator::operator* (this=<optimized out>) at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/stl_bvector.h:348#2 std::vector<bool, std::allocator<bool> >::operator[] (__n=<optimized out>, this=<optimized out>) at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/stl_bvector.h:918#3 doris::RowDescriptor::tuple_is_nullable (this=0xc39f343f8, tuple_idx=-2073834344) at ../src/runtime/descriptors.cpp:357#4 0x000000000113ae73 in doris::SlotRef::prepare(doris::RuntimeState*, doris::RowDescriptor const&, doris::ExprContext*) () at ../src/exprs/slot_ref.cpp:100#5 0x0000000001124a33 in doris::ExprContext::prepare(doris::RuntimeState*, doris::RowDescriptor const&, std::shared_ptr<doris::MemTracker> const&) () at ../src/exprs/expr_context.cpp:61#6 0x000000000111b29e in doris::Expr::prepare(std::vector<doris::ExprContext*, std::allocator<doris::ExprContext*> > const&, doris::RuntimeState*, doris::RowDescriptor const&, std::shared_ptr<doris::MemTracker> const&) () at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/stl_vector.h:1061#7 0x0000000001ae4233 in doris::ResultSink::prepare_exprs(doris::RuntimeState*) () at ../src/runtime/result_sink.cpp:57#8 0x0000000001ae4a07 in doris::ResultSink::prepare(doris::RuntimeState*) () at ../src/runtime/result_sink.cpp:69#9 0x000000000146691b in doris::PlanFragmentExecutor::prepare(doris::TExecPlanFragmentParams const&, doris::QueryFragmentsCtx const*) () at /var/local/thirdparty/installed/include/boost/smart_ptr/scoped_ptr.hpp:109#10 0x00000000013e033e in doris::FragmentExecState::prepare (this=this@entry=0xc8fc6a00, params=...) at ../src/runtime/fragment_mgr.cpp:229#11 0x00000000013e4217 in doris::FragmentMgr::exec_plan_fragment(doris::TExecPlanFragmentParams const&, std::function<void (doris::PlanFragmentExecutor*)>) () at ../src/runtime/fragment_mgr.cpp:609#12 0x00000000013e5e5d in doris::FragmentMgr::exec_plan_fragment(doris::TExecPlanFragmentParams const&) () at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/std_function.h:87#13 0x00000000014ab4e4 in doris::PInternalServiceImpl<doris::PBackendService>::_exec_plan_fragment (this=this@entry=0x8e80ef00, ser_request=...) at ../src/runtime/exec_env.h:117#14 0x00000000014ab59f in doris::PInternalServiceImpl<doris::PBackendService>::exec_plan_fragment (this=0x8e80ef00, cntl_base=<optimized out>, request=<optimized out>, response=0x8b1aa7c00, done=0x7fc493fc0) at /var/local/thirdparty/installed/include/google/protobuf/arenastring.h:231#15 0x0000000002086c97 in brpc::policy::ProcessHttpRequest(brpc::InputMessageBase*) () at ../src/brpc/policy/http_rpc_protocol.cpp:1484#16 0x00000000020540b7 in brpc::ProcessInputMessage (void_arg=void_arg@entry=0x3fd337d50) at ../src/brpc/input_messenger.cpp:135#17 0x0000000002054f7e in brpc::RunLastMessage::operator() (last_msg=0x3fd337d50, this=<synthetic pointer>) at ../src/brpc/input_messenger.cpp:141#18 std::unique_ptr<brpc::InputMessageBase, brpc::RunLastMessage>::~unique_ptr (this=<synthetic pointer>, __in_chrg=<optimized out>) at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/unique_ptr.h:361#19 brpc::InputMessenger::OnNewMessages(brpc::Socket*) () at /opt/rh/devtoolset-10/root/usr/include/c++/10/bits/unique_ptr.h:355#20 0x00000000020fd52e in brpc::Socket::Process......

原文转载:http://www.shaoqun.com/a/879507.html

跨境电商:https://www.ikjzd.com/

acca是什么:https://www.ikjzd.com/w/1370

贸发局:https://www.ikjzd.com/w/1621

知无不言:https://www.ikjzd.com/w/1308


ApacheDoris的BE部分是由C++编写,当出现一些内存越界,非法访问的问题时会导致BE进程的Crash。这部分的问题常常较难排查,同时也很难快速定位到对应的触发SQL,给使用者带来较大的困扰。所以下面会介绍通过Linux的CoreDump快速定位到问题SQL,并复现问题的方式。1.查看日志当BE进程Crash的时候,可以先查看be.out日志,确认是否存在stacktrace的记录。当BE
跨国采购网:https://www.ikjzd.com/w/2270.html
小马哥:https://www.ikjzd.com/w/1655
zozotown:https://www.ikjzd.com/w/2180
2021昆明黑龙潭梅花展是什么时候?:http://www.30bags.com/a/400613.html
2021昆明南博会什么时候开始?:http://www.30bags.com/a/428841.html
2021昆明中秋节天气预报 中秋节昆明气温很低吗?:http://www.30bags.com/a/433436.html
2021拉萨中秋节天气预报 中秋节拉萨会很冷吗?:http://www.30bags.com/a/425390.html
口述强壮的公么征服我 边做菜边摸边爱爱好爽:http://www.30bags.com/m/a/249944.html
这名美国女教师与青少年拘留中心的囚犯发生性关系,被判处7年监禁:http://lady.shaoqun.com/a/423155.html
2021深圳粤港澳大湾区车展展馆分布图:http://www.30bags.com/a/504660.html
2021深圳粤港澳大湾区车展活动介绍:http://www.30bags.com/a/504661.html
深圳粤港澳大湾区车展有什么活动:http://www.30bags.com/a/504662.html

没有评论:

发表评论