问题描述:程序内存从1G 涨到 5G后一直没有下降
问题原因:linux 内核有bug
go1.14源码:libexec/src/runtime/mem_linux.go
函数:sysUnused
......
// 4KB page to 2MB, bloating the process's RSS by as much as
// 512X. (See issue #8832 and Linux kernel bug
// https://bugzilla.kernel.org/show_bug.cgi?id=93111)
......
出问题的内核版本:
[root@localhost 111]# uname -a
Linux localhost.localdomain 3.10.0-1062.4.1.el7.x86_64 #1 SMP Fri Oct 18 17:15:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
解决方法:
# echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
# echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
查看大页内存的命令:
单个进程的:cat /proc/${进程ID}/smaps | grep HugePage
所有进程的:cat /proc/meminfo | grep HugePage
排除MADV_FREE的原因导致的方法:
go源码:libexec/src/runtime/mem_linux.go
函数:sysUnused
if errno := madvise(v, n, int32(advise)); advise == _MADV_FREE && errno != 0 {
// MADV_FREE was added in Linux 4.5. Fall back to MADV_DONTNEED if it is
// not supported.
atomic.Store(&adviseUnused, _MADV_DONTNEED)
madvise(v, n, _MADV_DONTNEED)
}
代码表明,内核4.5以上才支持MADV_FREE,即使go 支持MADV_FREE,内核不支持,还是会使用MADV_DONTNEED的模式