childe
childe
@zcola --worker 给的多少? topic 有几个 partition?
看了一下 Dump 出来的数据,如下,内存使用1G。 可以看到最大内存使用还是 ES Output 里面要Bulk的数据,共 500M,占50%左右。 500/30/(4+1) = 3.3 , 估计是你开了 4 个 worker ? 另外一个是 JsonDecode,也占了近50%,这里是使用的另外一个开源库 github.com/json-iterator/go,这一块还不太清楚内存的具体占用为什么这么多。pprof 里面使用 web 命令可以看到是 decode kafka input。 ``` go tool pprof...
至于为什么显示占用了3G内存,应该是GO回收之后的内存没有马上还给操作系统,而是留着准备以后用。 我还没有查到什么情况下会还给操作系统。使用 Cgroup给相应的限制,可能会触发还给内存的行为(不确定,还不太明白)?但Cgroup要设置好,否则可能就OOM了。 看了一些资料,比如 https://github.com/golang/go/issues/33376
我查了一些文档,早期的Golang版本是感知不到Cgroup的内存限制的。 你是下载的我编译好的二进制?还是自己编译的?你的Golang 版本是多少?
http://[127.0.0.1:8899/debug/pprof/heap?debug=1](http://127.0.0.1:8899/debug/pprof/heap?debug=1) 这个也看一下,页面最下面的 runtime.MemStats 数据是多少? 发来看一下吧。
你是什么版本的Golang? 换比较新的版本再编译一下看? 我印象里面,我们这边从来没有遇到OOM的问题。 我自己现在不搞这块了,我去测一下 1.17 Golang 编译出来的版本,给一个Cgroup 限制会是啥现象。
看了一下我们线上的实例,也有使用很多内存的,没有开 pprof,不确定是用在哪里了,和你那边的是不是一样。 看了一下我们这边没有给Limit。
Golang 可以交还内存给操作系统。https://github.com/golang/go/issues/42354 一起学习下~
> > Golang 可以交还内存给操作系统。[golang/go#42354](https://github.com/golang/go/issues/42354) 一起学习下~ > > 就是1.17 肯定没有这个问题呗,如果设置了cgroup memory 1.12 就可以了,但使用的 MADV_FREE 。 这个会导致 rss 看起来占用多。你可以使用 `GODEBUG=madvdontneed=1` ,这样golang 会使用 MADV_DONTNEED 归还内存,这个会马上释放掉 rss 。 但什么时候会释放,还不知道~ > To revert to the...
但是,你的Golang现在heapuse哪怕只有1G,但RSS占用了5G内存,说明至少曾经一定要使用这么多,如果给 4G limit 的话,还是会OOM吧。