StarRocks BE Jemalloc 堆剖析实战:ADMIN EXECUTE ON 开启 Heap Profile 并可视化内存分配热点

发布时间:2026/9/16 10:36:20
StarRocks BE Jemalloc 堆剖析实战:ADMIN EXECUTE ON 开启 Heap Profile 并可视化内存分配热点 StarRocks BE Jemalloc 堆剖析实战ADMIN EXECUTE ON 开启 Heap Profile 并可视化内存分配热点【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks本文基于 StarRocks 官方文档讲解如何在不重启 BE 的前提下通过ADMIN EXECUTE ON下发 Python 脚本动态开启/关闭 Jemalloc 堆剖析、采集堆快照并将其转换为 Graphviz DOT 格式最终定位 BE 节点的内存分配热点。读完本文你能独立完成一次完整的内存诊断流程开启剖析 → 验证状态 → 导出调用图 → 可视化分析并理解jemalloc_conf中prof相关选项与 BE 侧 heap_prof.cpp 实现的对应关系。:::注意开启 Jemalloc Heap Profiling 可能对 StarRocks 的性能产生一定影响建议在排查窗口内开启、排查完成后关闭。该能力仅在 StarRocks v3.1.6 及之后版本可用文档明确说明。 :::一、前提条件BE 必须以prof:true启动开启剖析的前提是 BE 进程启动时jemalloc_conf配置中包含prof:true否则enable_prof语句会直接失败。这一约束来自 jemalloc 本身profiling 必须在进程初始化阶段JEMALLOC_CONF被解析时声明开启运行期只能切换全局的prof.active开关。StarRocks 在 config.h 中给出的默认值如下jemalloc_conf percpu_arena:percpu,oversize_threshold:134217728,muzzy_decay_ms:5000,dirty_decay_ms:5000, metadata_thp:auto,background_thread:true,prof:true,prof_active:false关键点prof:true允许运行期通过prof.active打开/关闭堆采样prof_active:false进程启动时默认不采样即默认状态下零额外开销需要诊断时再动态打开。从源码结构看heap_prof.cpp 中切换剖析状态的函数正是只操作prof.active这一个 mallctl 节点static int set_jemalloc_profiling(bool enable) { // Only prof.active, which is also what prof_active in JEMALLOC_CONF maps to. return je_mallctl(prof.active, nullptr, nullptr, enable, sizeof(enable)); }值得注意的是该实现刻意不触碰prof.thread_active_init。源码注释解释了原因它不是第二个开关而是在线程创建时复制进thread.prof.active的初始值一旦在进程启动时由运维设为false以只对特定线程采样运行期覆盖它可能永久改变采样范围且无法恢复。这一点也被单元测试 heap_prof_test.cpp 的toggling_the_profile_keeps_thread_active_init用例固化为回归约束切换enable_prof/disable_prof前后prof.thread_active_init的值必须保持不变。查看当前配置当前生效的jemalloc_conf也可以在information_schema.be_configs中确认查询NAME为jemalloc_conf的那一行读取其VALUE中的prof_active选项即可判断剖析当前是否处于激活状态。二、开启 / 验证 / 关闭 Heap Profiling2.1 开启语法ADMIN EXECUTE ON be_id System.print(HeapProf.getInstance().enable_prof())其中be_id为 BE/CN 节点 ID可执行SHOW BACKENDS或SHOW COMPUTE NODES获取。示例mysql admin execute on 10001 System.print(HeapProf.getInstance().enable_prof()); -------- | result | -------- | OK | -------- 1 row in set (0.00 sec)2.2 验证是否已开启ADMIN EXECUTE ON be_id System.print(HeapProf.getInstance().has_enable())示例mysql admin execute on 10001 System.print(HeapProf.getInstance().has_enable()); -------- | result | -------- | true | -------- 1 row in set (0.01 sec)实现侧 heap_prof.cpp 的has_enable通过je_mallctl(prof.active, ...)读取该布尔节点。源码注释里还有一段值得学习的细节prof.active是 bool 类型节点je_mallctl对长度不匹配例如读入int的读取会返回EINVAL并只按实际能拷贝的长度部分填充缓冲区——因此实现中先检查返回值再采信值否则一个零初始化的int会“碰巧工作”而一旦补上返回值检查又会导致永远误报false。测试 has_enable_is_false_without_startup_prof 覆盖的正是“进程未以prof:true启动时必须报告 false”这一场景。2.3 关闭ADMIN EXECUTE ON be_id System.print(HeapProf.getInstance().disable_prof())示例mysql admin execute on 10001 System.print(HeapProf.getInstance().disable_prof()); -------- | result | -------- | OK | -------- 1 row in set (0.00 sec)2.4 底层调用链ADMIN EXECUTE ON 如何落到 CADMIN EXECUTE ON会把单引号内的脚本发送到指定 BE 执行BE 侧通过 ScriptEngine 注册了一组 Python 可访问的 C 绑定。从 script.cpp 可以看到HeapProf的完整注册面auto cls m.klassHeapProf(HeapProf); REG_STATIC_METHOD(HeapProf, getInstance); cls.funcExtheap_prof_enable_prof(enable_prof); cls.funcExtheap_prof_disable_prof(disable_prof); REG_METHOD(HeapProf, has_enable); REG_METHOD(HeapProf, snapshot); REG_METHOD(HeapProf, to_dot_format); REG_METHOD(HeapProf, dump_dot_snapshot);有两处工程细节值得一提enable_prof/disable_prof走的是配置通道而非直接 mallctl。script.cpp 中它们被绑定为heap_prof_enable_prof/heap_prof_disable_prof内部调用set_prof_active_via_config即把jemalloc_conf字符串里的prof_active改写为对应值后统一更新has_enable、snapshot、to_dot_format、dump_dot_snapshot则直接透传HeapProf方法。避免死锁的单向依赖。源码注释说明jemalloc_conf的配置更新回调会调用HeapProf经由 config_update_hooks.cpp 注册的回调触发JemallocConfUpdater::update因此脚本侧的开关函数被刻意放在HeapProf之外——若反过来从HeapProf回调配置更新路径就会在HeapProf的互斥锁上发生死锁。同时 JemallocConfUpdater 的注释表明jemalloc 的opt.*节点是只读的因此只有prof_active这类运行期可切换的选项才能通过该通道热更新。另外需要说明该能力仅支持 Linux 平台。heap_prof.cpp 中所有实现均被#ifndef __APPLE__包裹macOS 上enable_prof/disable_prof为空操作、has_enable恒返回false、snapshot返回空串to_dot_format返回not support on MacOS。三、采集堆快照dump_dot_snapshot开启剖析并让业务/测试负载运行一段时间后执行ADMIN EXECUTE ON be_id System.print(HeapProf.getInstance().dump_dot_snapshot())该调用等价于to_dot_format(snapshot())见 heap_prof.h两步含义分别是snapshot()调用je_mallctl(prof.dump, ...)触发 jemalloc 写出原始堆 dump 文件。文件名为{pprof_profile_dir}/heap_profile.{pid}.{rand}其中pprof_profile_dir默认值为${STARROCKS_HOME}/logconfig.hto_dot_format()调用 BE 安装目录下的jeprof --dot工具解析该 dump生成 Graphviz DOT 调用图std::string jeprof fmt::format({}/bin/jeprof, base_home); std::string binary fmt::format({}/lib/starrocks_be, base_home); return lite_exec({jeprof, --dot, binary, heapdump_filename});示例输出官方文档中的实际返回节选mysql admin execute on 10001 System.print(HeapProf.getInstance().dump_dot_snapshot()); ------------------------------------------------------------------ | result | ------------------------------------------------------------------ | digraph /home/disk/opt/env/default/be/lib/starrocks_be; 1.0 MB { | node [width0.375,height0.25]; | Legend [shapebox,fontsize24,shapeplaintext,label...starrocks_be\lTotal MB: 1.0\lFocusing on: 1.0\lDropped nodes with 0.0 abs(MB)\lDropped edges with 0.0 MB\l]; | N1 [labelbrpc\nInputMessenger\nOnNewMessages\n0.0 (0.0%)\rof 1.0 (100.0%)\r,shapebox,fontsize8.0]; | N2 [labelbrpc\nSocket\nProcessEvent\n0.0 (0.0%)\rof 1.0 (100.0%)\r,shapebox,fontsize8.0]; | N3 [labelbthread\nTaskGroup\ntask_runner\n0.0 (0.0%)\rof 1.0 (100.0%)\r,shapebox,fontsize8.0]; | N4 [labelbthread_make_fcontext\n0.0 (0.0%)\rof 1.0 (100.0%)\r,shapebox,fontsize8.0]; | N6 [labelbrpc\npolicy\nParseRpcMessage\n0.5 (50.1%)\r,shapebox,fontsize43.4]; | N13 [labelstd\nmake_unique\n0.5 (49.9%)\r,shapebox,fontsize43.3]; | N2 - N1 [label1.0, weight16398, stylesetlinewidth(2.000000)]; | N3 - N2 [label1.0, weight16398, stylesetlinewidth(2.000000)]; | N4 - N3 [label1.0, weight16398, stylesetlinewidth(2.000000)]; | N1 - N5 [label0.5, weight10102, stylesetlinewidth(2.000000)]; | N5 - N6 [label0.5, weight10102, stylesetlinewidth(2.000000)]; | N9 - N11 [label0.5, weight10086, stylesetlinewidth(2.000000)]; | N12 - N10 [label0.5, weight10086, stylesetlinewidth(2.000000)]; | N11 - N12 [label0.5, weight10086, stylesetlinewidth(2.000000)]; | N8 - N9 [label0.5, weight10086, stylesetlinewidth(2.000000)]; | N10 - N13 [label0.5, weight10086, stylesetlinewidth(2.000000)]; | } ------------------------------------------------------------------ 29 rows in set (30.22 sec)如何读懂这张图节点N1、N6…一行label由若干层组成形如命名空间\n函数\n局部占比 (百分比)\rof 累计占比 (百分比)。例如N6表示brpc::policy::ParseRpcMessage0.5 (50.1%)是该栈帧自持self内存of 1.0 (100.0%)是它子树的累计内存。fontsize会随占比放大N6为 43.4其余为 8.0即字号越大的框越是内存热点。边N2 - N1 …表示调用关系label是沿该路径的 MB 数weight/setlinewidth用于加粗渲染便于人眼追踪主调用链。图标题digraph /home/disk/opt/env/default/be/lib/starrocks_be; 1.0 MB中的路径即 jeprof 解析用的二进制1.0 MB是本次快照聚焦的内存总量Legend 中Total MB/Focusing on/Dropped nodes with x abs(MB)说明采样总盘与过滤阈值。示例中的调用链语义为brpc 收到新消息 → 解析 RPC → 走PInternalServiceImplBase::execute_command即ADMIN EXECUTE ON的服务端路径→ 最终在std::make_unique上自持了约 0.5 MB——恰好印证了“剖析动作本身也会出现在快照里”实际排障时应以负载期间的快照为准。注意dump_dot_snapshot是同步执行且依赖jeprof解析完整二进制示例耗时 30.22 秒高峰期使用需评估阻塞影响若只想要原始 dump 文件路径也可单独调用System.print(HeapProf.getInstance().snapshot())再在 BE 机器上手动执行jeprof --dot $STARROCKS_HOME/lib/starrocks_be dump文件得到同样结果。四、可视化 Heap Profile将上一步返回的 DOT 文本完整复制粘贴到 docs/en/developers/jemalloc_heap_profile.md 中提到的在线 Graphviz 渲染工具GraphvizOnlinedreampuf.github.io/GraphvizOnline即可得到可视化调用图并可下载渲染后的图片用于归档或分享。文档给出的可视化效果示例五、操作小结与排错要点步骤SQL成功输出说明开启admin execute on be_id System.print(HeapProf.getInstance().enable_prof())OK要求 BE 以prof:true启动验证... has_enable()true/false运行期只读prof.active采集... dump_dot_snapshot()DOT 文本同步执行耗时取决于 dump 大小关闭... disable_prof()OK排查完成后及时关闭以消除性能开销排错要点enable_prof报错/无效先查information_schema.be_configs中NAMEjemalloc_conf的VALUE是否包含prof:true由于prof是启动期选项若缺失需修改 be.conf 中的jemalloc_conf并重启 BE。has_enable()恒为false按上文 2.2 节说明读取失败EINVAL同样会被实现保守地报告为 false应结合 BE 日志try to enable the heap profiling等 LOG 输出确认切换是否真正发生。macOS 开发机功能不可用见 2.4 节平台限制请在 Linux BE 节点上操作。性能影响剖析期间每次分配都会记录栈信息建议遵循“开启 → 复现/观察 → 采集 → 立即关闭”的最小窗口原则。相关源码与文档索引be/src/runtime/prof/heap_prof.h / heap_prof.cppHeapProf单例的 mallctl 实现与jeprof --dot转换be/src/script/script.cppADMIN EXECUTE ON脚本侧HeapProf绑定be/src/common/config.hjemalloc_conf默认值L846pprof_profile_dir默认值be/src/runtime/memory/jemalloc_conf_updater.hprof_active热更新逻辑be/src/service/service_be/config_update_hooks.cppjemalloc_conf配置回调注册be/test/runtime/prof/heap_prof_test.cpp开关行为与读值正确性的单元测试docs/en/developers/jemalloc_heap_profile.md本文对应的原始官方文档【免费下载链接】starrocksThe worlds fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询