主要观点:
- 作者负责将一个遗留的 Rust 应用程序迁移到 Kubernetes,该应用程序是 Imagemagick 的安全 HTTP 接口,处理其他服务的图像加工。迁移过程虽顺利但出现内存泄漏问题。
- 作者通过多种工具追踪内存泄漏,包括 eBPF、heaptrack、jemalloc profiling 等,但结果显示内存使用稳定无泄漏,这让作者感到困惑。
- 最终发现是 grafana 仪表盘计算内存使用的方式有误,
container_memory_working_set_bytes
并非容器不含缓存的内存使用量,而是含缓存但不含非活跃文件缓存的内存使用量,应用程序无泄漏,是指标仪表盘误导了他们。 - 作者总结了在解决内存泄漏问题过程中的经验教训,包括明确问题及测量方式、不依赖直觉、记录所做尝试、与同事交流、理解指标计算方式以及不放弃等。
关键信息:
- 应用程序是处理图像加工的 Rust 遗留应用,迁移到 Kubernetes 后出现内存泄漏。
- 尝试多种追踪工具如 eBPF、heaptrack、jemalloc profiling 等,结果显示内存稳定无泄漏。
- grafana 仪表盘计算内存使用的方式导致错误结论,实际无泄漏。
- 总结的经验教训对解决类似问题有帮助。
重要细节:
- 使用 BCC 工具的
memleak
未成功,添加heaptrack
和gdb
到容器收集数据,发现内存使用量不增长但仪表盘显示增长。 - 使用
jemalloc
的 profiling 功能创建堆文件并分析,也显示无泄漏。 - 构建最小化镜像以减少攻击面,添加
coreutils
调查/proc
文件系统,最终通过pmap
发现指标问题。 - 详细解释了
container_memory_working_set_bytes
的计算方式及相关内核文档定义。 - 提及内存泄漏在 Rust 中可能存在的情况及相关资源。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。