记一次内存占用异常排查 —— memory ballast 被分配了物理内存

记一次内存占用异常排查 —— memory ballast 被分配了物理内存

💡 原文中文,约4800字,阅读约需12分钟。
📝

内容提要

memory ballast 是一种降低 GC 频率的方法,Go 1.19 提出了 memory target 的新功能,可以通过环境变量或 debug.SetMemoryTarget() 设置 GC 触发的目标堆大小,uber 提出的 gc tuner 方案可以动态调整 GC 触发比例,仍然使用 ballast 时,可以尝试调整 GOGC 和 heapArena 的元数据来降低问题发生概率。

🎯

关键要点

  • memory ballast 是降低 GC 频率的一种方法,Go 1.19 引入了 memory target 功能。

  • memory target 可以通过环境变量或 debug.SetMemoryTarget() 设置 GC 触发的目标堆大小。

  • ballast 的实现是申请大切片并保持其存在但不访问,以降低物理内存占用。

  • 在某些情况下,ballast 可能会占用物理内存,原因是 Go runtime 在创建时访问了它。

  • Go 的内存分配机制中,大于 32KB 的内存通过 mheap 分配,可能会触发清零操作。

  • 建议使用 memory target 替代 ballast,以更好地控制内存使用。

  • gc tuner 是由 uber 提出的方案,可以动态调整 GC 触发比例,适用于旧版本的 golang。

  • 继续使用 ballast 的用户可以尝试调整 GOGC 和 heapArena 的元数据来降低问题发生概率。

➡️

继续阅读