go 服务器内存偶尔会飙升,有什么办法可以把内存 dump 下来?

2020-06-29 09:56:31 +08:00
 pabno

最近生产服务器内存偶尔会飙升导致监控报警,不知道有没有什么办法把内存 dump 下来看里面具体有哪些对象,就像 java 中的 jmap -heap 一样

试过 pprof,这个据我了解只能看到采样期间的内存分配情况,还有就是累计的分配情况,不能看到内存中对象分布

4526 次点击
所在节点    程序员
11 条回复
richzhu
2020-06-29 10:23:43 +08:00
同问,有的时候真的是莫名其妙
janxin
2020-06-29 10:31:30 +08:00
reus
2020-06-29 10:37:03 +08:00
如果你用的是 1.12 或者更新的版本,那 RSS 会一直增长,只在系统内存不够用的时候,内核才会回收这些内存。如果你的监控指标是 RSS,那可以用 GODEBUG=madvdontneed=1 这个环境变量切换回旧的回收方式。
petelin
2020-06-29 12:19:55 +08:00
pprof 里有 heap debug=1 会有全部的内存分配
gcore 配合 viewcore 就是对比 linux core
Lonenso
2020-06-29 17:20:49 +08:00
pabno
2020-06-30 13:50:41 +08:00
@janxin 这个 dump 出来没找到有什么工具可以分析
pabno
2020-06-30 13:55:43 +08:00
@Lonenso 这个好像可以,感谢
pabno
2020-06-30 13:56:23 +08:00
@reus 我们暂时用的还是 1.10 版本,所以应该不存在 rss 一直增长的问题
janxin
2020-06-30 17:11:04 +08:00
pabno
2020-07-01 18:18:44 +08:00
@janxin 这个尝试了一下,在 linux 上跑 viewcore 会报:invalid memory address or nil pointer dereference 的错误。我现在是使用 gcore 把进程的 coredump 文件 dump 下来再使用编译后的 viewcore 分析就会报错,但是如果使用 dlv 分析是正常的。可惜 dlv 没法查看内存分布。使用的 go 版本是 1.13

@Lonenso 这个尝试了下,还是没法得到想要的功能
Lonenso
2020-07-01 19:45:25 +08:00
因为你要解决内存飙升, 也有很多种情况, 我目前遇到过自己写的 goroutine 泄露导致的内存飙升. 我觉得你可以深入使用 pprof. <amp-youtube data-videoid="xxDZuPEgbBU" layout="responsive" width="480" height="270"></amp-youtube>

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/685515

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX