
Problemas
A fuga de memória para um heap apresenta os seguintes problemas potencialmente solucionáveis:
Desempenho diminuído devido aos custos de alocação de memória
Desempenho diminuído devido aos custos de coleta de lixo
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:
Um aumento na quantidade de recursos de computação (memória, processador)
Ajustando o coletor de lixo
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/fasthttpgo test -bench=PServerGet10Req -benchmem -memprofile netmem.outgo test -bench=kServerGet10Req -benchmem -memprofile fastmem.out http.Server, - fasthttp.Server. , fasthttp zero-allocation . , netmem.out fastmem.out. -, :
echo top | go tool pprof netmem.out10 "" :
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.