调试 Postgres 中的内存泄漏,heaptrack 版本

主要观点:通过heaptrack在 Postgres 中调试内存泄漏问题,介绍了postmaster和客户端后端client backend中的内存泄漏情况,比较了heaptrackmemleakValgrind memcheckLeakSanitizer的特点,heaptrack需进程退出后才打印泄漏报告,但其在报告栈跟踪和行号方面更可靠,heaptrackmemleak都是有用的工具。
关键信息:

  • 可通过在postmasterclient backend中添加特定代码引入内存泄漏,如在postmasterpostmaster.c中添加palloc分配,在client backendpseudorandomfuncs.c中添加palloc分配。
  • 可通过执行大量psql客户端或多次执行random()函数触发泄漏。
  • heaptrack需在 Linux(Mac 上的 Linux VM 也可)上使用,需获取进程 PID 后 attach 到进程进行调试,调试结束后可通过heaptrack_print生成泄漏报告。
    重要细节:
  • TopMemoryContext中的过度分配(泄漏)在Valgrind memcheckLeakSanitizer中可能不会被捕获,但在heaptrack中可检测到。
  • 注释掉分配差异后重新运行heaptrack,泄漏报告部分将为空。
  • heaptrack在不同环境中报告栈跟踪和行号更可靠,比Valgrind memcheckLeakSanitizer更适合泄漏内存在程序退出前已被清理的情况。
阅读 12
0 条评论