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

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

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

内容提要

Go 1.19 提供了 memory target 功能,可以设置 GC 触发的目标堆大小,以及 gc tuner 和 ballast 的优化方案,以降低 GC 频率。

🎯

关键要点

  • Go 1.19 提供了 memory target 功能,可以设置 GC 触发的目标堆大小。
  • memory ballast 是降低 GC 频率的实用方法,但可能导致物理内存占用。
  • 某些实例的 ballast 被分配了物理内存,原因可能是 Go runtime 在创建时访问了它。
  • Go 的内存分配机制中,大于 32KB 的内存通过 mheap 分配,可能会触发清零操作。
  • 建议使用 memory target 替代 ballast,以更好地控制内存使用。
  • 可以通过环境变量 GOMEMLIMIT 或 debug.SetMemoryTarget 来设置目标堆大小。
  • gc tuner 是旧版本 Golang 的动态调整 GC 触发比例的方案。
  • 继续使用 ballast 时,需注意降低物理内存占用的风险。
➡️

继续阅读