High RSS and OOM kill despite low value in runtime.MemStats.Sys

Viewed 391

I have a process which slowly consumes more RAM until it eventually hits its cgroup limit and is OOM killed, and I'm trying to figure out why.

Oddly, go's runtime seems to think not much RAM is used, whereas the OS seems to think a lot is used.

Specifically, looking at runtime.MemStats (via the extvar package) I see:

"Alloc":51491072,
"TotalAlloc":143474637424,
"Sys":438053112,
"Lookups":0,
"Mallocs":10230571,
"Frees":10195515,
"HeapAlloc":51491072,
"HeapSys":388464640,
"HeapIdle":333824000,
"HeapInuse":54640640,
"HeapReleased":0,
"HeapObjects":35056,
"StackInuse":14188544,
"StackSys":14188544,
"MSpanInuse":223056,
"MSpanSys":376832,
"MCacheInuse":166656,
"MCacheSys":180224,
"BuckHashSys":2111104,
"GCSys":13234176,
"OtherSys":19497592

But from the OS perspective:

$ ps auxwf
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       178  0.0  0.0   3996  3372 pts/0    Ss   17:33   0:00 bash
root       246  0.0  0.0   7636  2828 pts/0    R+   17:59   0:00  \_ ps auxwf
root         1  166  2.8 11636248 5509288 ?    Ssl  17:24  57:15 app server -api-public

So, the OSS reports an RSS of 5380 MiB, but the Sys field in MemStats shows only 417 MiB. My understanding is these fields should be approximately the same.

GC is running, as confirmed by setting GODEBUG=gctrace=1,madvdontneed=1. For example, I see output like:

 gc 6882 @2271.137s 0%: 0.037+2.2+0.087 ms clock, 3.5+0.78/37/26+8.4 ms cpu, 71->72->63 MB, 78 MB goal, 96 P

The numbers vary a bit depending on the process, but they are all <100 MB, whereas the OS is reporting >1GB (and growing, until eventual OOM).

madvdontneed=1 was a shot in the dark but seems to make no difference. I wouldn't think the madvise parameters would be relevant, since it doesn't seem there's any need to return memory to the kernel, as the Go runtime doesn't think it's using much memory anyway.

What could explain this discrepancy? Am I not correctly understanding the semantics of these fields? Are there mechanisms that would result in the growth of RSS (and an eventual OOM kill) but not increase MemStats.Sys?

0 Answers
Related