【发布时间】:2020-03-09 22:30:32
【问题描述】:
我想确保我的 pod 在内存不足时不会重新启动。现在我看到容器的 heapMem 使用率很低,但 SysMem 的使用率已增加到 4Gb,并且不会随着 heapMem 减少。我相信 GC 应该把这个返回给 OS。
Prometheus 统计数据用于监控 go_memstats_alloc_bytes 和 go_memstats_sys_bytes。我也看到go_memstats_gc_cpu_fraction 不会增加加班时间。
我错过了什么吗?是否有可能的内存泄漏?
【问题讨论】:
-
首先,垃圾收集器的工作是回收垃圾和重用内存,它不会将任何东西释放回操作系统。
MemStat.Sys字段记录为[measuring] the virtual address space reserved by the Go runtime [...] It's likely that not all of the virtual address space is backed by physical memory at any given moment。该图表没有告诉我们任何信息,只是看起来您的活动爆发可能会占用您所有的内存。 -
你可以尝试设置madvdontneed=1(详情:golang.org/doc/go1.12#runtime)。基本上在 Linux 中,golang 使用 madvfree 将内存释放回操作系统,除非操作系统处于内存压力之下,否则大多数情况下操作系统会忽略该内存。你也可以试试 go 1.13,它应该更积极地将内存返回给操作系统:golang.org/doc/go1.13#runtime
标签: go garbage-collection containers prometheus