我正在使用 Go 的 pprof 工具来调查我的服务的内存使用情况。几乎所有的内存使用都来自一个设置多个有界队列通道的函数。我对 pprof 在这里告诉我的内容有些困惑:
$ go tool pprof ~/pprof/pprof.server.alloc_objects.alloc_space.inuse_objects.inuse_space.007.pb.gz
File: server
Type: inuse_space
Time: Dec 21, 2020 at 10:46am (PST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) list foo
Total: 102.73MB
ROUTINE ======================== github.com/******/foo in ***.go
79.10MB 79.10MB (flat, cum) 77.00% of Total
. . 135:
. . 136:func foo() {
. . 137:
14.04MB 14.04MB 138: chanA := make(chan chanAEntry, bufferSize)
. . 139: defer close(chanA)
. . 140:
. . 141:
19.50MB 19.50MB 142: chanB := make(chan chanBCEntry, bufferSize)
. . 143: defer close(chanB)
. . 144:
. . 145:
27.53MB 27.53MB 146: chanC := make(chan chanBCEntry, bufferSize)
. . 147: defer close(chanC)
. . 148:
. . 149:
7.92MB 7.92MB 150: chanD := make(chan chanDEntry, bufferSize)
. . 151: defer close(chanD)
. . 152:
看起来第 142 行负责 19.50MB 的分配,第 146 行负责 27.53MB,但这些行做同样的事情 - 它们创建具有相同输入类型和相同容量的缓冲通道。
- 这是 pprof 进行随机抽样这一事实的产物吗?
- Go 是否会延迟分配通道(fwiw,在让服务运行几天后,这些值最终会均衡)?
- pprof 是否报告了沿通道发送的对象所需的内存以及通道本身所需的内存?