Go アプリにメモリ リークがあると思われます。
何が起こっているのかを調べるために、 を試していpprof
ます。
読み取りを理解するのに苦労しています。に接続する場合go tool pprof http://localhost:6060/debug/pprof/heap?debug=1
の出力例は次のとおりです。
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) text
Showing nodes accounting for 17608.45kB, 100% of 17608.45kB total
Showing top 10 nodes out of 67
flat flat% sum% cum cum%
12292.12kB 69.81% 69.81% 12292.12kB 69.81% github.com/acct/repo/vendor/github.com/.../funcA /../github.com/acct/repo/vendor/github.com/../fileA.go
1543.14kB 8.76% 78.57% 1543.14kB 8.76% github.com/acct/repo/../funcB /../github.com/acct/repo/fileB.go
1064.52kB 6.05% 84.62% 1064.52kB 6.05% github.com/acct/repo/vendor/github.com/../funcC /../github.com/acct/repo/vendor/github.com/fileC.go
858.34kB 4.87% 89.49% 858.34kB 4.87% github.com/acct/repo/vendor/golang.org/x/tools/imports.init /../github.com/acct/repo/vendor/golang.org/x/tools/imports/zstdlib.go
809.97kB 4.60% 94.09% 809.97kB 4.60% bytes.makeSlice /usr/lib/go/src/bytes/buffer.go
528.17kB 3.00% 97.09% 528.17kB 3.00% regexp.(*bitState).reset /usr/lib/go/src/regexp/backtrack.go
(下手な難読をお許しください)
funcA
メモリの約 70% を消費していると解釈されますが、これは約 12MB です。
今top
でも示しています:
top - 18:09:44 up 2:02, 1 user, load average: 0,75, 0,56, 0,38
Tasks: 166 total, 1 running, 165 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3,7 us, 1,6 sy, 0,0 ni, 94,3 id, 0,0 wa, 0,0 hi, 0,3 si, 0,0 st
KiB Mem : 16318684 total, 14116728 free, 1004804 used, 1197152 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 14451260 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4902 me 20 0 1,371g 0,096g 0,016g S 12,9 0,6 1:58.14 mybin
これは、1.371 GB のメモリが使用されていることを示唆しています....どこに消えたのですか?
また、pprof
ドキュメントは非常に倹約的です。それをどのように使用すべきかを理解することさえ困難です。私たちのバイナリはデーモンです。例えば:
- で読み取りを開始した場合
go tool pprof http://localhost:6060/debug/pprof/heap
、これはこの特定の時点での 1 回の読み取りですか、それとも経時的な集計ですか? text
後でもう一度ヒットinteractive mode
すると、同じ値が報告されるように見えることがあります。私たちは実際に同じ価値観を見ているのでしょうか?go tool pprof...
新しい値を取得するために再起動する必要がありますか?- スタック内の特定のポイントの完全なヒープ、または特定の go ルーチンの読み取りですか....???
最後に、この解釈は正しいですか ( http://localhost:6060/debug/pprof/から):
/debug/pprof/
profiles:
0 block
64 goroutine
45 heap
0 mutex
13 threadcreate
バイナリには 64 個の open go ルーチンと合計 45MB のヒープ メモリがありますか?