Skip to content
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

Open
wenchaopeng opened this issue Dec 25, 2019 · 5 comments
Open

pprof统计的内存与PC上显示的内存不符合 #1

wenchaopeng opened this issue Dec 25, 2019 · 5 comments

Comments

@wenchaopeng
Copy link

你好,看了你写的关于pprof的博客,写的很好,不过有一个问题,你那个炸弹程序占用内存大概2GB,我在linux下跑了,通过htop查看,确实在2GB左右,但是通过pprof查看,只能查到1GB内存占用,请教一下这是为什么,两边内存对不上,请解惑!

@wolfogre
Copy link
Owner

wolfogre commented Dec 25, 2019

好问题哈。是这样的,代码中一共有两处有意消耗内存,一处是这里:

func (m *Mouse) Steal() {
log.Println(m.Name(), "steal")
max := constant.Gi
for len(m.buffer) * constant.Mi < max {
m.buffer = append(m.buffer, [constant.Mi]byte{})
}
}

可以看到这里的逻辑是占上 不超过 1G 内存,所以 pprof 查到 1G 内存是符合预期的。

另一处是这里:

func (d *Dog) Run() {
log.Println(d.Name(), "run")
_ = make([]byte, 16 * constant.Mi)
}

这里故意申请 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)消耗了大量内存。

@wolfogre
Copy link
Owner

wolfogre commented Dec 25, 2019

这个问题很有价值,我复制到博客的评论里哈。

@wenchaopeng
Copy link
Author

wenchaopeng commented Dec 25, 2019

多谢回复,言之有理,大神加个wx,我也是shanghai的

Repository owner deleted a comment from wenchaopeng Dec 25, 2019
@zhucan
Copy link

zhucan commented Aug 11, 2023

@wolfogre 我们用的k8s v1.22.15版本,golang是v1.16.x,看官方说的是golang v1.16.x就会立刻返还,但是实际情况发现pprof和top打印apiserver占用内存的输出还是不一致
pprof:
image

top:
image

@sptuan
Copy link

sptuan commented Dec 8, 2023

是不是某些内核态操作(比如 IO)消耗了大量内存

您好,我想请教一下,有没有什么办法能看到这个内核态操作消耗的内存量呢

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants