主要观点:通过heaptrack在 Postgres 中调试内存泄漏问题,介绍了postmaster和客户端后端client backend中的内存泄漏情况,比较了heaptrack与memleak、Valgrind memcheck、LeakSanitizer的特点,heaptrack需进程退出后才打印泄漏报告,但其在报告栈跟踪和行号方面更可靠,heaptrack和memleak都是有用的工具。
关键信息:
- 可通过在
postmaster和client backend中添加特定代码引入内存泄漏,如在postmaster的postmaster.c中添加palloc分配,在client backend的pseudorandomfuncs.c中添加palloc分配。 - 可通过执行大量
psql客户端或多次执行random()函数触发泄漏。 heaptrack需在 Linux(Mac 上的 Linux VM 也可)上使用,需获取进程 PID 后 attach 到进程进行调试,调试结束后可通过heaptrack_print生成泄漏报告。
重要细节:TopMemoryContext中的过度分配(泄漏)在Valgrind memcheck或LeakSanitizer中可能不会被捕获,但在heaptrack中可检测到。- 注释掉分配差异后重新运行
heaptrack,泄漏报告部分将为空。 heaptrack在不同环境中报告栈跟踪和行号更可靠,比Valgrind memcheck或LeakSanitizer更适合泄漏内存在程序退出前已被清理的情况。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。