Go 1.13 RSS持续增加,疑似清理问题

2024-03-28

我们的一项 Go 服务中的 RSS 不断增加。 我们怀疑这是由于 scavenger 没有正确地将内存返回给操作系统(或者操作系统由于使用 MADV_FREE 而没有收回内存)。通过 pprof 检查,未检测到内存泄漏。

我们尝试使用以下简单的 Go 程序进行一些实验: Go版本:go1.13.4 linux/amd64(也尝试过go1.13.1)

package main
import (
  "fmt"
  "time"
)

func allocate(s int) {
  a := make([]byte, s * 1024 * 1024)
  for i := 0;i < len(a); i += 4096 {
    a[i] = 'x'
  }
  fmt.Printf("%c %d\n", a[0], s)
}

func main() {
  allocate(100)
  allocate(200)
  allocate(500)
  time.Sleep(300 * time.Second)
}

我们与

strace -q -e trace=memory go run main.go

并且结果并不一致:

  • https://pastebin.com/sGw3dp9E https://pastebin.com/sGw3dp9E(没有报告 MADV_FREE)
  • https://pastebin.com/d6CmRfD4 https://pastebin.com/d6CmRfD4(报告了MADV_FREE,但为什么释放的值这么小?)

使用 gctrace 运行,我们得到:https://pastebin.com/6JaC2r85 https://pastebin.com/6JaC2r85

我们通过 top 和 pmap 确认 RSS 仍然很高:

$ pmap -x 22712
22712:   /tmp/go-build073210395/b001/exe/main
Address           Kbytes     RSS   Dirty Mode  Mapping
0000000000400000     576     428       0 r-x-- main
0000000000490000     756     320       0 r---- main
000000000054d000      84      56      32 rw--- main
0000000000562000     120      36      36 rw---   [ anon ]
000000c000000000  983040  819440  397680 rw---   [ anon ]
00007fcdfb2e1000   66684   26780   26780 rw---   [ anon ]
00007fffa3ba2000     132      20      20 rw---   [ stack ]
00007fffa3bdf000       8       4       0 r-x--   [ anon ]
ffffffffff600000       4       0       0 r-x--   [ anon ]
---------------- ------- ------- -------
total kB         1051404  847084  424548

如果有人可以帮助澄清以下问题,我们将不胜感激:

  1. 根据https://github.com/golang/go/issues/30333 https://github.com/golang/go/issues/30333,在 go 1.13 中,应该定期执行清理,而不是等待 5 分钟的间隔,但 strace 有时没有记录 MADV_FREE。 gctrace 确实打印有关清理的日志,但似乎它并没有真正调用 MADV_FREE?我是否遗漏了有关 go 1.13 中的清理逻辑的一些内容?
  2. 尝试使用 GODEBUG=madvdontneed=1,结果更好,但 RSS 仍然徘徊在 500MB 左右,只有当我们将 madvdontneed 与 debug.FreeOSMemory() 结合时,我们才得到 RSS

附加说明:在 Windows 上使用 go 1.13 运行相同的程序似乎达到了预期的效果,即内存逐渐释放回操作系统。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go 1.13 RSS持续增加,疑似清理问题 的相关文章

  • 指定共享对象(共享库)的名称

    Go 编译器为共享对象生成的名称是错误的 例子 go install buildmode shared linkshared github com apache thrift lib go thrift code google com p
  • 如何模拟 gin.Context?

    嗨 我一直在尝试模拟杜松子酒 Context 但我无法使其工作 我正在尝试他们在这方面所做的solution https stackoverflow com questions 41742988 make mock gin context
  • 在 numpy 中获取日志返回的最有效方法是什么

    构建日志返回序列的最快且最优雅的解决方案是什么 问题主要在于映射一个函数 该函数将第 i 个和第 i 1 个元素作为数组中每个元素的输入 对于函数和简单数组 我可以定义日志返回 如下所示 import numpy as np ar np r
  • 如何矢量化 3D Numpy 数组

    我有一个 3D numpy 数组 例如a np zeros 100 100 20 我想对每个执行操作x y涉及所有元素的位置z轴 结果存储在一个数组中 例如b np zeros 100 100 在同一个对应的x y位置 现在我使用 for
  • Spark 编码器:何时使用 beans()

    我在使用Spark的缓存机制时遇到了内存管理问题 我目前正在使用Encoder我正在使用 Kryo 想知道切换到 beans 是否可以帮助我减少缓存数据集的大小 基本上 在使用时使用 beans 相对于 Kryo 序列化有哪些优点和缺点En
  • 当你用 mlockall 设置的内存用完时会发生什么?

    我正在开发一个需要大量内存才能批量运行的 C 应用程序 gt 20GB 我的一些客户遇到了内存限制 有时操作系统开始交换 总运行时间加倍或更糟 我读到可以使用 mlockall 来防止进程被换出 当进程内存需求以这种方式接近或超过可用物理内
  • OpenCL 矩阵乘法应该更快?

    我正在尝试学习如何使 GPU 优化 OpenCL 内核 我以使用本地内存中的方形图块进行矩阵乘法为例 然而在最好的情况下 我只得到了约 10 倍的加速 约 50 Gflops 与 numpy dot 相比 5 Gflops 它使用的是 BL
  • 释放指针向量,但内存仍在使用中

    我不知道下面的代码有什么问题 我正在删除所有指针 但是当我使用 top 命令查看内存时 我可以看到仍然有大量内存分配给程序 我在这里缺少一些东西来释放内存吗 include
  • 3Leetcode求和算法

    我在使用 3sum 算法的以下输入时遇到问题 我是 得到 超过时间限制 我的算法对于这个输入来说太慢了吗 有什么建议如何改进吗 leetcode原题 给定一个由 n 个整数组成的数组 nums nums 中是否存在元素 a b c 使得 a
  • Powershell脚本运行缓慢

    我正在编写一个脚本来检查大约 15 个远程服务器上的版本 但该脚本的执行时间比我预期的要长得多 listServers compName1 compName2 compName3 compName15 Out File C temp jav
  • CSS动画表现

    I have a small hobby project in which I try to build a matrix rain See demo http www audenaerde org matrix html这里 或这个JSF
  • 哪个对缓存最友好?

    我试图很好地掌握面向数据的设计以及如何在考虑缓存的情况下进行最佳编程 基本上有两种情况我无法完全确定哪个更好以及为什么 是拥有一个对象向量更好 还是拥有对象原子数据的多个向量更好 A 对象向量示例 struct A GLsizei mInd
  • 从私钥中提取公钥

    我尝试通过以下方式以编程方式完成步骤 2 1 openssl genrsa out signing pem 2048 2 openssl rsa in signing pem outform PEM pubout out signing p
  • 缓慢的 data.frame 行分配

    我正在使用 RMongoDB 需要用查询的值填充空的 data frame 结果相当长 大约有 200 万个文档 行 当我进行性能测试时 我发现将值写入行的时间随着数据帧的维度的增加而增加 也许这是一个众所周知的问题 而我是最后一个注意到它
  • 是否可以从 JS 显式调用导出的 Go WebAssembly 函数?

    是否可以调用 Go WebAssembly 函数 除了main 在 JavaScript 中 让我先展示一下我做了什么 我的Go函数定义如下 package main import fmt func main fmt Println it
  • Jmeter 下降的最佳方法?

    我们都知道 Jmeter 并不是最擅长在运行期间更改活动线程的数量 除非您喜欢并创建以不同时间间隔触发的单独线程组 有没有人想出一个好的解决方案来在测试结束时降低速度 例如 我从 50 个线程开始 在 30 分钟内我想要 0 个活动线程 查
  • 增加 C++ 程序 CPU 使用率

    我有一个用 C 编写的程序 每秒运行多个 for 循环 而不使用任何会使其因任何原因等待的东西 它始终使用 2 10 的 CPU 有没有什么方法可以强制它使用更多的CPU并进行更多的计算而不使程序变得更复杂 此外 我在 Windows 计算
  • 如何清除 SQL Server 2005/2008 中的查询执行统计信息

    基于使用从这篇文章中获得的这段非常有用的 SQL 来获取查询执行统计信息最常执行的存储过程 代码日志 https stackoverflow com questions 1942726 most executed stored proced
  • 堆内存和Slab分配

    我很困惑heap and free list 我有几个问题 我对C中malloc的工作原理有自己的理解 如果我错了 请纠正我 堆内存是否被组织为数据的链表 空闲列表 块 堆内存和空闲列表有区别吗 我对存储分配的理解 有待改进 当我们调用ma
  • Python 比 C++ 更快、更轻吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi

随机推荐

  • IDE0006 在 Visual Studio 中运行 Xamarin Android 项目时出错

    我刚刚创建了一个新的 Visual Studio for Cross Platform 项目 清理解决方案 重建解决方案 运行 Android 项目 编译花了很长时间 最后模拟器出现了 一段时间后 我收到 Warning IDE0006 错
  • 在 Eclipse 中编码

    我正在尝试使用 Eclipse 编码 UTF 8 来表示波兰语字符 不幸的是 我仍然遇到编码问题 我的设置 Window gt Preferences gt Debug Window gt Preferences gt Workspace
  • 嵌套结构的 boost 序列化不起作用

    我正在尝试序列化包含两种或多种其他类型结构的结构 但序列化好像不行 以下是示例代码 简单数据 hpp include
  • C# 中的并行和工作划分?

    假设我有 10 个核心 当我写的时候 Parallel For 0 100 i state gt Console WriteLine i 问题 每个核心分配数量的公式是什么 是吗100 10 在执行点 每个核心是否已经知道将处理哪些数字 或
  • 使用 tar.gz 下载在 Ubuntu 13.10 上安装 nltk 3.0

    我想在 Ubuntu 13 10 上安装 nltk 3 0 我已经运行 Ubuntu 几个星期了 我第一次使用 Linux 我刚刚下载了 python 3 4 0 3 3 也在 Ubuntu 上 因为它是随操作系统一起安装的 Python
  • 使用 ARC,哪个更好:分配或自动释放初始值设定项?

    使用起来是否更好 更快且更高效 alloc or autorelease初始化器 例如 NSString hello NSString name return NSString alloc initWithFormat Hello name
  • StringIndexOutOfBoundsException 字符串索引超出范围错误

    当我在输入整数后输入字符串 s 时 出现此错误 Exception in thread main java lang StringIndexOutOfBoundsException String index out of range 0 a
  • 覆盖 makefile 中的“CC”和“CXX”变量

    我有一个主 makefile 其中包含通用设置 以及一个子 makefile 其中包含项目特定设置 从我的另一个问题来看覆盖 makefile 中的变量 https stackoverflow com q 18869628 24949 我了
  • 如何在张量流中找到已识别对象的位置(ROI)

    我使用的是tensorflow android示例 它有一个用于ROI位置的占位符 参见tensorflow examples android src Classifier java 但它没有被使用 我希望能够找到分类对象的投资回报率 我查
  • Selenium 失败并显示空异常消息

    我使用 Selenium 2 7 0 和 Python 2 6 我的操作系统是 Mac OS X 10 7 当我尝试实例化 webdriver 对象时 我收到以下消息 selenium common exception WebDriverE
  • 路由错误 没有路由匹配 [PATCH]“/locations”

    我在尝试更新位置项后收到路线错误 我正在使用 before action 来设置位置 id before action set location only show edit update destroy private def set l
  • 显示具有单个 ID 的多条通知消息

    我有几个同时发生的事件 我需要以串行方式向用户显示多条通知消息 理想的情况是 每条通知消息将轮流显示 持续时间约为 2 秒 我能得到的最接近的是使用多个 id 但是 使用多个 id 会产生我不想要的副作用 最终状态栏上会同时显示多条通知消息
  • 如何在退出时杀死所有子进程?

    当node js进程退出时 如何杀死所有子进程 使用child process spawn生成 我认为唯一的方法是保留对ChildProcess返回的对象spawn 并在退出 master 进程时杀死它 一个小例子 var spawn re
  • 如何动态选择要在 Jenkins 构建中使用的 git 分支

    我正在尝试为 Jenkins 构建服务器创建一个新的项目配置 为了简化我想要做的事情 我将仅使用两个组件来描述问题 组分A 该组件的更改会触发该项目在 CI 服务器上的构建 CI 服务器具有静态配置的分支来监视更改和构建 例如 掌握或开发分
  • x86 中不同数学函数的性能?

    我正在编写 3D 碰撞 想知道基本数学函数 如 sqrt pwr 三角函数 如 sin cos tan arcsin 的性能差异 我听说这取决于许多其他因素 所以我只是想粗略地了解哪一个速度较慢并且需要避免 同时寻找不同的方法来解决问题 我
  • 如何在实体框架中使用数据库优先方法来使用存储库模式

    如何在实体框架中使用数据库优先方法来使用存储库模式 我在浏览互联网上可用的资源时得到了一些想法 但对于实时应用程序 我不确定如何在从数据库优先方法自动生成的类上实现存储库模式 我已经浏览过 SO 中的一些链接 但我没有得到任何明确的想法 我
  • Node.js fs.unlink 函数导致 EPERM 错误

    我在用着fs unlink 删除文件 我收到以下错误 uncaught undefined Error EPERM Operation not permitted Path To File 有人知道为什么会发生这种情况吗 您无法删除不为空的
  • DynamoDB:如何使用查询过滤器检查 MAP 中的条件

    我有一张表 结构如下 当我进行查询时 我希望能够对数据图进行查询过滤 但我不太确定如何设置查询 这是我到目前为止所拥有的 HashMap
  • 如何通过 ASP.NET Core/Razor 单击按钮来运行在 Razor 页面上编写的 C#?

    我想在单击页面上的按钮时执行我直接在 razor 页面上编写的 C 方法 我发现 如果我引用了页面上的按钮 它会在第一次加载时执行该方法 但当我实际单击该按钮时 它不会再次执行 这是代码 Razor 页面 C 参考 functions in
  • Go 1.13 RSS持续增加,疑似清理问题

    我们的一项 Go 服务中的 RSS 不断增加 我们怀疑这是由于 scavenger 没有正确地将内存返回给操作系统 或者操作系统由于使用 MADV FREE 而没有收回内存 通过 pprof 检查 未检测到内存泄漏 我们尝试使用以下简单的