Go程序RSS比较大的原因之一

问题描述:程序内存从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的模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值