Busca de memória fugitiva em Go durante o desenvolvimento

Problemas

A fuga de memória para um heap apresenta os seguintes problemas potencialmente solucionáveis:

  1. Desempenho diminuído devido aos custos de alocação de memória

  2. Desempenho diminuído devido aos custos de coleta de lixo

  3. Um erro Out of Memoryaparece se a taxa de aparecimento de lixo exceder a taxa de sua remoção

Esses problemas podem ser resolvidos de várias maneiras:

  1. Um aumento na quantidade de recursos de computação (memória, processador)

  2. Ajustando o coletor de lixo

  3. Ao minimizar o número de tiros em uma pilha

Neste artigo, considerarei apenas a terceira via.

Do princípio

, , , . , : make , new , map ,go . , "", - .

make new . sync.Pool(), habr . , []byte , , - 32 ( go1.14.6 windows/amd64). , ; , , butebufferpool @valyala.

map . map , . , map, , - Discord Rust. .. , , , - . @valyala fastcache, , , , , , slices maps.

go - . , .

, - "" , , fastcache "". , , []byte->[]byte, , . , , - , "rps", "95th percentile latency" .. , , "" , . " " . .. "".

" " :

git clone https://github.com/valyala/fasthttp

, , , , , :

go test -bench=PServerGet10Req -benchmem -memprofile netmem.out

go test -bench=kServerGet10Req -benchmem  -memprofile fastmem.out

http.Server, - fasthttp.Server. , fasthttp zero-allocation . , netmem.out fastmem.out. -, :

echo top | go tool pprof netmem.out

10 "" :

Showing top 10 nodes out of 53
      flat  flat%   sum%        cum   cum%
  698.15MB 21.85% 21.85%   710.15MB 22.22%  net/textproto.(*Reader).ReadMIMEHeader
  466.13MB 14.59% 36.43%   466.13MB 14.59%  net/http.Header.Clone
  423.07MB 13.24% 49.67%  1738.32MB 54.39%  net/http.(*conn).readRequest
  384.12MB 12.02% 61.69%   384.12MB 12.02%  net/textproto.MIMEHeader.Set
  299.07MB  9.36% 71.05%  1186.24MB 37.12%  net/http.readRequest
  137.02MB  4.29% 75.33%   137.02MB  4.29%  bufio.NewReaderSize
  134.02MB  4.19% 79.53%   134.02MB  4.19%  net/url.parse
  122.45MB  3.83% 83.36%   122.45MB  3.83%  bufio.NewWriterSize (inline)
   99.51MB  3.11% 86.47%   133.01MB  4.16%  context.WithCancel
   87.11MB  2.73% 89.20%    87.11MB  2.73%  github.com/andybalholm/brotli.(*h5).Initialize

:

go tool pprof -svg netmem.out > netmem.svg 

netmem.svg ():

:

go tool pprof -http=:8088 netmem.out

, , , - : Could not execute dot; may need to install graphviz. , Unix- , , Windows chocolatey , , cinst graphviz. - . VIEW/Source:

, make, []byte string. , " ", []byte. "", , , .. return &localVar . , - .

fasthttp , . - fasthttp HTTP/2.0, websockets , fasthttp ( , ), , , . c5.4xlarge 250.000 RPS fasthttp.Server 190.000 RPS http.Server . , , 190.000 RPS? , , , , .

, , . " " , json/yaml , , . - , , , .

, flatbuffers, dynobuffers, - , . , , , .

" ":

Avro         23394 ns/op    11257 B/op
Dyno_Untyped  6437 ns/op      808 B/op
Dyno_Typed    3776 ns/op        0 B/op
Flat          1132 ns/op        0 B/op
Json         87331 ns/op    14145 B/op

" ":

Avro         19311 ns/op    11257 B/op
Dyno_Typed    62.2 ns/op        0 B/op
Flat          19.8 ns/op        0 B/op
Json         83824 ns/op    11073 B/op 

, , , linkedin/goavro - .

- . , () , avro "" , flatbuffer.

Os problemas que levam ao baixo desempenho em Go podem ser resolvidos, mas lembre-se de que essa luta tem um custo. Antes de iniciá-lo, é melhor comparar experimentalmente as capacidades do método de processamento de dados selecionado com os requisitos do sistema - talvez tudo funcione direto da caixa com ajustes mínimos.

Links




All Articles