Apache Gluten内存泄漏排查:使用Valgrind定位原生代码问题的方法 Apache Gluten内存泄漏排查使用Valgrind定位原生代码问题的方法【免费下载链接】glutenGluten is a middle layer responsible for offloading JVM-based SQL engines execution to native engines.项目地址: https://gitcode.com/GitHub_Trending/glu/glutenApache Gluten作为将JVM-based SQL引擎执行卸载到原生引擎的中间层其内存管理对系统稳定性至关重要。原生代码内存泄漏可能导致Spark Executor因内存超限被杀死本文将介绍如何使用Valgrind工具快速定位Gluten项目中的C内存泄漏问题。内存泄漏的常见表现与危害在Gluten中内存泄漏通常表现为Spark Executor进程异常退出并提示内存超限长时间运行任务后OffHeap内存持续增长间歇性OOM错误且难以复现特别是当原生内存不受Gluten管理时传统Java内存分析工具无法捕获泄漏点此时需要Valgrind等原生代码调试工具介入。Valgrind工具准备与环境配置安装Valgrind在Ubuntu/Debian系统中通过apt直接安装apt install valgrind对于CentOS/RHEL系统yum install valgrind编译调试版本的Gluten为获得准确的内存泄漏追踪信息需要编译包含调试符号的Gluten原生代码# 编译Velox后端并启用测试和调试模式 gluten_home/dev/builddeps-veloxbe.sh --build_testsON --build_benchmarksON --build_typeDebug使用Valgrind检测内存泄漏的步骤编写针对性的单元测试根据docs/developers/NewToGluten.md建议创建GoogleTest测试用例来隔离可能存在泄漏的代码路径。例如创建exec_backend_test测试可执行文件专注测试 shuffle 或计算逻辑。执行Valgrind内存检查使用Valgrind的memcheck工具运行测试valgrind --leak-checkyes ./exec_backend_test关键参数说明--leak-checkyes启用内存泄漏检测--show-reachableyes显示可达内存块潜在泄漏--track-originsyes追踪未初始化值的来源分析Valgrind输出结果Valgrind会生成详细的内存泄漏报告包括泄漏内存总量和块数每个泄漏点的调用栈内存分配位置和大小典型的泄漏报告类似12345 LEAK SUMMARY: 12345 definitely lost: 1,024 bytes in 4 blocks 12345 indirectly lost: 4,096 bytes in 16 blocks 12345 possibly lost: 0 bytes in 0 blocks 12345 still reachable: 8,192 bytes in 32 blocks 12345 suppressed: 0 bytes in 0 blocks结合内存分析工具定位问题使用gperftools生成内存使用热力图Gluten项目推荐使用gperftools辅助内存分析通过以下命令生成内存使用GIF图pprof --show_bytes --gif --lib_prefix/path/to/gluten_lib_prefix /usr/bin/java /path/to/gluten_heap_perf_XXX result.gif图1使用gperftools生成的内存分配热力图可直观展示内存使用热点分析内存分配文本报告通过文本模式查看详细内存分配统计pprof --text --lib_prefix/path/to/gluten_lib_prefix /usr/bin/java /path/to/gluten_heap_perf_XXX图2内存分配统计报告显示各函数内存分配占比常见内存泄漏场景与解决方案场景1Arrow内存分配器泄漏当看到类似以下日志时WARN ArrowBufferAllocators$ArrowBufferAllocatorManager: Detected leaked Arrow allocator [Default], size: 191...可启用Arrow内存调试-Darrow.memory.debug.allocatortrue场景2C对象未正确释放通过Valgrind定位到具体泄漏函数后检查是否所有new分配的对象都有对应的delete智能指针使用是否正确如std::unique_ptr/std::shared_ptr资源获取即初始化(RAII)模式是否被遵守场景3JNI层内存管理不当检查JNI接口实现jobject引用是否正确释放原生内存是否通过NewGlobalRef/DeleteGlobalRef管理避免在JNI回调中分配长期内存验证修复效果修复后应重新编译调试版本再次运行Valgrind检查确认泄漏已解决执行端到端测试确保功能正常使用jemalloc生成内存快照进行对比jeprof --text --lib_prefix/path/to/gluten_lib_prefix /usr/bin/java /path/to/gluten_heap_perf_XXX总结使用Valgrind配合gperftools和jemalloc能有效定位Gluten项目中的原生代码内存泄漏问题。关键步骤包括编译调试版本代码编写针对性测试用例分析Valgrind泄漏报告结合内存分析工具可视化问题验证修复效果通过这套方法论可以显著提升Gluten的内存管理质量避免因内存泄漏导致的生产环境故障。完整的内存调试文档可参考docs/developers/ProfileMemoryOfGlutenWithVelox.md。【免费下载链接】glutenGluten is a middle layer responsible for offloading JVM-based SQL engines execution to native engines.项目地址: https://gitcode.com/GitHub_Trending/glu/gluten创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考