linux kernel 5或以上版本会影响go1.15的内存释放吗?

4sup72z8  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(103)

**您使用的是什么版本的Go语言(go版本)?**go版本1.15
**最新版本是否会重现此问题?**否
**您使用的是什么操作系统和处理器体系结构(转到env)?**Linux 5.4.54-1.0.0.std7c.el7.2.x86_64 SMP排名第一(美国中部时间2020年11月16日星期一10:02:20)x86_64 x86_64 x86_64 GNU/Linux
**您看到的是什么?**下面是异常机器的屏幕截图
**你做了什么?**内存使用率太高,但通过分析pprof的堆文件没有内存泄漏,得出这个结论的原因是:

1.我的服务部署在k8s上,还有其他相同的服务,pprof文件解析结果和这个问题类似(linux内核版本为4.9.2-3.0.0.std7b.el7.5.x86_64 cmd/cgo:gcc 4.4.1 #1 SMP失败(2018年4月26日星期四17:33:02 CST x86_64 x86_64 x86_64 GNU/Linux)。
1.我在下面的链接中提到了MADV_FREE问题,通过分析/proc/1/smaps文件的LazyFree,发现它全是0,而且所有的机器都是linux内核4. 5或以上,逻辑上也会出现同样的问题,但不是No. runtime:在Linux上默认为MADV_DONTNEED #42330 gotrace记录正常

**您希望看到什么?**为什么这个服务的内存使用率很高?Linux内核版本5和更高版本对golang内存管理有什么影响?

enter image description here
enter image description here
enter image description here

vltsax25

vltsax251#

它与内核版本无关。
Go语言1.15默认使用MADV_FREE来释放内存,内核释放内存的速度非常慢,这导致了RSS的增加,直到其他地方真正需要内存为止,因此RSS并没有反映出Go语言程序的实际使用情况。
Go语言1.16+默认使用MADV_DONTNEED,这会导致内核更快地释放内存。
See https://go.dev/doc/go1.16#runtime for more details.
你可以在Go语言1.15上使用GODEBUG=madvdontneed=1环境变量,或者升级到Go语言支持的版本(比如Go语言1.19),Go语言1.20很快就会发布,所以这也是一个不错的目标。

相关问题