-
Notifications
You must be signed in to change notification settings - Fork 134
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
pprof统计的内存与PC上显示的内存不符合 #1
Comments
好问题哈。是这样的,代码中一共有两处有意消耗内存,一处是这里: go-pprof-practice/animal/muridae/mouse/mouse.go Lines 46 to 52 in 8ce266a
可以看到这里的逻辑是占上 不超过 1G 内存,所以 pprof 查到 1G 内存是符合预期的。 另一处是这里: go-pprof-practice/animal/canidae/dog/dog.go Lines 41 to 44 in 8ce266a
这里故意申请 16M 内存并立即丢弃,这里本意是为了模拟一个频繁 GC 问题,因为上文已经占了 1G 内存不放,所以 golang 每次 GC 结束,会发现还占用了 1G,所以 GC 策略会在下次内存占用超过 1G * 2 时(具体为什么是两倍可以看下 GC 策略相关资料)再次触发 GC 降回 1G,所以站在操作系统来看,这个程序的内存占用是在 1GB - 2GB 之间的(注意 GC 掉的内存并不一定会立即返还给操作系统),而我说 “程序会占用约 2G 内存” 是说了最坏情况,意思是你至少得有 2G 内存。 然后你应该意识到一个问题了,pprof 看到的内存占用,其实只是 golang 逻辑上正在使用的内存量,不包括已被 GC 回收但尚未返还给操作系统的内存,同样也不包括内核态的内存占用。而 htop 是站在操作系统层面看到的进程内存占用,理论上就是会比 pprof 看到的内存占用量更多的。 如果你在实际工作中发现 htop 看到内存占用贼大,pprof 看到内存占用却不多,就要考虑下,是不是有大量内存被 GC 但还没来得及返还给操作系统,是不是某些内核态操作(比如 IO)消耗了大量内存。 |
这个问题很有价值,我复制到博客的评论里哈。 |
多谢回复,言之有理,大神加个wx,我也是shanghai的 |
@wolfogre 我们用的k8s v1.22.15版本,golang是v1.16.x,看官方说的是golang v1.16.x就会立刻返还,但是实际情况发现pprof和top打印apiserver占用内存的输出还是不一致 |
您好,我想请教一下,有没有什么办法能看到这个内核态操作消耗的内存量呢 |
你好,看了你写的关于pprof的博客,写的很好,不过有一个问题,你那个炸弹程序占用内存大概2GB,我在linux下跑了,通过htop查看,确实在2GB左右,但是通过pprof查看,只能查到1GB内存占用,请教一下这是为什么,两边内存对不上,请解惑!
The text was updated successfully, but these errors were encountered: