幽灵威胁:本不存在的内存泄漏

主要观点:

  • 作者负责将一个遗留的 Rust 应用程序迁移到 Kubernetes,该应用程序是 Imagemagick 的安全 HTTP 接口,处理其他服务的图像加工。迁移过程虽顺利但出现内存泄漏问题。
  • 作者通过多种工具追踪内存泄漏,包括 eBPF、heaptrack、jemalloc profiling 等,但结果显示内存使用稳定无泄漏,这让作者感到困惑。
  • 最终发现是 grafana 仪表盘计算内存使用的方式有误,container_memory_working_set_bytes并非容器不含缓存的内存使用量,而是含缓存但不含非活跃文件缓存的内存使用量,应用程序无泄漏,是指标仪表盘误导了他们。
  • 作者总结了在解决内存泄漏问题过程中的经验教训,包括明确问题及测量方式、不依赖直觉、记录所做尝试、与同事交流、理解指标计算方式以及不放弃等。

关键信息:

  • 应用程序是处理图像加工的 Rust 遗留应用,迁移到 Kubernetes 后出现内存泄漏。
  • 尝试多种追踪工具如 eBPF、heaptrack、jemalloc profiling 等,结果显示内存稳定无泄漏。
  • grafana 仪表盘计算内存使用的方式导致错误结论,实际无泄漏。
  • 总结的经验教训对解决类似问题有帮助。

重要细节:

  • 使用 BCC 工具的memleak未成功,添加heaptrackgdb到容器收集数据,发现内存使用量不增长但仪表盘显示增长。
  • 使用jemalloc的 profiling 功能创建堆文件并分析,也显示无泄漏。
  • 构建最小化镜像以减少攻击面,添加coreutils调查/proc文件系统,最终通过pmap发现指标问题。
  • 详细解释了container_memory_working_set_bytes的计算方式及相关内核文档定义。
  • 提及内存泄漏在 Rust 中可能存在的情况及相关资源。
阅读 8
0 条评论