Go 1.12中出现的top命令RES参数异常增高的问题
2023-06-13 09:16:17 时间
问题的发现
偶然在生产上部署了一个版本之后发现,机器不断重启报警,后经过查询linux日志发现,原来是因为服务占用内存过高被内核给kill掉了。接下来就是查问题,本来以为是内存泄漏,上了pprof工具之后发现,内存占用稳定在2.6g,而top命令则很快看到RES
参数暴涨到12g+(机器内存16g)后被内核杀掉。百思不得其解。后来在翻阅Go1.12发布说明时看到一段话:
On Linux, the runtime now uses
MADV_FREE
to release unused memory. This is more efficient but may result in higher reported RSS. The kernel will reclaim the unused data when it is needed. To revert to the Go 1.11 behavior (MADV_DONTNEED
), set the environment variableGODEBUG=madvdontneed=1
.
原文链接:https://golang.google.cn/doc/go1.12#runtime
这段话的关键在于,Go1.12中使用的新的MADV_FREE
模式,这个模式会更有效的释放无用的内存,但可能会让RSS
增高,RSS是什么呢?Resident Set Size 常驻内存集,而top中RES
参数的含义是进程使用的、未被换出的物理内存大小,也即常驻内存集。看到这里,试着在程序运行时加上这个参数GODEBUG=madvdontneed=1
,果然,内存稳定在2.7g,问题就此解决。
top
相关文章
- Go 并发编程与定时器
- Go 错误和异常
- supergo定位软件_super go定位修改下载
- 化整为零优化重用,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang函数的定义和使用EP07
- Go HTTP 编程 | 03 - 表单的输入与验证
- 如何优雅的通过Shell脚本一键部署GO项目到服务器 |Go主题月
- Go 语言正则匹配 ID 逗号分隔 数字、英文字母、中文
- 2022-07-22:以下go语言代码输出什么?A:1;B:1.5;C:编译错误;D:1.49。package mainimpo
- 2022-09-14:以下go语言代码输出什么?A:0 0;B:0 1;C:1 1;D:1 0。package mainfunc
- Go 面向对象编程篇(三):通过组合实现类的继承和方法重写
- 「Go工具箱」redis官网推荐的go版本的分布式锁:redsync
- 开源大佬从谷歌离职:在Go语言项目上停滞不前,要去更小的企业寻求变革
- Go-包管理-go mod(一)
- Go语言inject库:依赖注入
- Go_ go mod 命令解决墙的问题详解编程语言
- 轻松搞定Go语言连接MySQL(go连接mysql)
- 简易教程:如何在 Linux 上安装 GO 语言(go语言安装linux)
- 徒手用Go编写Redis迈向新技术世界的旅程(徒手用go写个redis)
- 前行不止Go语言监听Oracle日志(go监听oracle日志)
- 快跟上趋势,GO DB ORACLE(go db oracle)
- 语言Oracle中发挥神奇作用的Go语言(oracle中有go)
- Oracle Go用法快速指南(oracle go用法)
- Go语言的方法接受者类型用值类型还是指针类型?