golang grpc transport.newBufWriter и bufio.NewReaderSize не освобождают память

У меня есть простой сервер grpc в golang, который выполняет операции CRUD с объектом. Однако, когда я запускаю его, память никогда не снижается даже после остановки запросов. pprof показа кучи имеет следующий результат:

> flat  flat%   sum%        cum   cum%
>   932.39MB 62.45% 62.45%   932.39MB 62.45%  google.golang.org/grpc/internal/transport.newBufWriter
>   463.13MB 31.02% 93.46%   463.13MB 31.02%  bufio.NewReaderSize
>    13.50MB   0.9% 94.37%    13.50MB   0.9%  runtime.malg
>       13MB  0.87% 95.24%  1420.52MB 95.14%  google.golang.org/grpc/internal/transport.newHTTP2Server
>       11MB  0.74% 95.98%    12.10MB  0.81%  time.NewTimer
>     8.50MB  0.57% 96.54%     8.50MB  0.57%  golang.org/x/net/http2/hpack.(*headerFieldTable).addEntry
>     5.50MB  0.37% 96.91%    17.60MB  1.18%  google.golang.org/grpc/internal/transport.(*http2Server).keepalive
>     3.50MB  0.23% 97.15%     7.50MB   0.5%  google.golang.org/grpc/internal/transport.newLoopyWriter
>     1.50MB   0.1% 97.25%    12.50MB  0.84%  google.golang.org/grpc.(*Server).serveStreams
>          0     0% 97.25%       10MB  0.67%  golang.org/x/net/http2.(*Framer).ReadFrame

Может ли кто-нибудь посоветовать мне, как решить эту проблему с памятью? Сервер работает с параметрами по умолчанию, и я даже включил функцию debug.FreeOSMemory () для освобождения памяти.


person Anshul Prakash    schedule 07.02.2020    source источник
comment
Насколько мне известно, pprof собирает профиль, а затем показывает статистику, а не в реальном времени, когда образцы собираются и выгружаются в профиль. Не могли бы вы поделиться командой, которую вы использовали здесь для профилирования?   -  person majin    schedule 07.02.2020
comment
go tool pprof localhost: 7777 / debug / pprof / heap Кроме того, я регулярно запускал команду интервалы, чтобы увидеть изменение профиля.   -  person Anshul Prakash    schedule 07.02.2020
comment
Они показывают выборочные распределения, а не то, что в настоящее время занимает память. Также обратите внимание, что при отсутствии нагрузки на память ОС может не освободить память, даже если программа сообщает, что она свободна.   -  person JimB    schedule 07.02.2020


Ответы (1)


Скорее всего, вам нужно закрыть ClientConn или использовать его повторно. Я столкнулся с той же проблемой, и проблема заключалась в создании нового ClientConn для каждого вызова RPC без закрытия этого соединения позже.

Отличное объяснение здесь pooling-grpc-connections

Связанный вопрос Управление подключением GRPC в Golang

person Качеев С    schedule 16.10.2020