2

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ドキュメントは非常に倹約的です。それをどのように使用すべきかを理解することさえ困難です。私たちのバイナリはデーモンです。例えば:

  1. で読み取りを開始した場合go tool pprof http://localhost:6060/debug/pprof/heap、これはこの特定の時点での 1 回の読み取りですか、それとも経時的な集計ですか?
  2. text後でもう一度ヒットinteractive modeすると、同じ値が報告されるように見えることがあります。私たちは実際に同じ価値観を見ているのでしょうか? go tool pprof...新しい値を取得するために再起動する必要がありますか?
  3. スタック内の特定のポイントの完全なヒープ、または特定の go ルーチンの読み取りですか....???

最後に、この解釈は正しいですか ( http://localhost:6060/debug/pprof/から):

/debug/pprof/

profiles:
0   block
64  goroutine
45  heap
0   mutex
13  threadcreate

バイナリには 64 個の open go ルーチンと合計 45MB のヒープ メモリがありますか?

4

0 に答える 0