专栏首页posluaGo 1.12 关于内存释放的一个改进

Go 1.12 关于内存释放的一个改进

一直以来 go 的 runtime 在释放内存返回到内核时,在 Linux 上使用的是 MADV_DONTNEED,虽然效率比较低,但是会让 RSS(resident set size 常驻内存集)数量下降得很快。不过在 go 1.12 里专门针对这个做了优化,runtime 在释放内存时,使用了更加高效的 MADV_FREE 而不是之前的 MADV_DONTNEED。具体可以参考这里:

  • runtime: use MADV_FREE on Linux if available
  • runtime: use MADV_FREE on linux as well

这样带来的好处是,一次 GC 后的内存分配延迟得以改善,runtime 也会更加积极地将释放的内存归还给操作系统,以应对大块内存分配无法重用已存在的堆空间的问题。不过也会带来一个副作用:RSS 不会立刻下降,而是要等到系统有内存压力了,才会延迟下降。需要注意的是, MADV_FREE 需要 4.5 以及以上内核,否则 runtime 会继续使用原先的 MADV_DONTNEED 方式

比如,我最近就遇到了这个问题:

几台服务的请求量差别并不大,可以明显看到 25(4.14 内核,其他几台都是 3.10 内核)的内存释放看起来很慢,但是 HEAP 占用显示却正常:

顺便说下,4.1 以上内核,最为引人注目的特性就是 eBPF,通过一个内核内置的字节码虚拟机,可以完成数据包过滤、调用栈跟踪、耗时统计、热点分析等等高级功能,是 Linux 系统的性能分析利器。

当然 go 1.12 为了避免像这样一些靠判断 RSS 大小的自动化测试因此出问题,也提供了一个 GODEBUG=madvdontneed=1 参数可以强制 runtime 继续使用 MADV_DONTNEED:runtime: provide way to disable MADV_FREE。但是显然正常情况下,我们都应该优先使用 MADV_FREE

本文分享自微信公众号 - poslua(poslua),作者:ms2008

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 浅谈 KONG key-auth 插件 token 的生成

    最近我在 KONG 的 Blog 上看了一篇文章:That’s So Random: (Pseudo)Random Data Generation in Kon...

    poslua
  • 关于 etcd 的一些谣言

    这是一个被广为流传的误解,众所周知 etcd 使用 Raft 协议来解决数据一致性问题。一个 Raft Group 只能有一个 Leader 存在,如果一旦发生...

    poslua
  • TCP 常见故障排查

    TCP 协议相当复杂,并充斥着各种细节。然而 TCP 协议又是如此重要的一个协议,引领风骚三十年,可以说是互联网的奇迹。这些细节正是 TCP 协议成功的原因,并...

    poslua
  • SwiftUI 如何管理一组TextField(零基础教程)

    知识大胖
  • jface databinding:构建一个改进版的通用型数值验证器StringToNumberValidator

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • tf.nn.*()函数and tf.add()函数

    一个叫bias的向量加到一个叫value的矩阵上,是向量与矩阵的每一行进行相加,得到的结果和value矩阵大小相同。

    周小董
  • gin框架之文件上传

    大话swift
  • SQL解析在美团点评中的应用

    美团技术团队
  • 文本分类指南:你真的要错过 Python 吗?

    文本分类作为自然语言处理任务之一,被广泛应用于解决各种商业领域的问题。文本分类的目的是将 文本/文档 自动地归类为一种或多种预定义的类别。常见的文本分类应用如下...

    AI研习社
  • 入门 | 如何通过梯度检验帮助实现反向传播

    机器之心

扫码关注云+社区

领取腾讯云代金券