repositorypackage
0.0.0-20221109011046-85c5b120e959
Repository: https://github.com/gsabadini/hands-on-pprof.git
Documentation: pkg.go.dev
# Packages
No description provided by the author
# README
Hands on profile apps with pprof
O que é profile de aplicações?
- Usar ferramentas de criação de perfil para procurar gargalos potenciais durante o desenvolvimento pode reduzir significativamente o número de problemas que aparecem mais tarde.
- Saber como criar o perfil de um aplicativo e entender quais são os possíveis problemas o ajudará a escrever um código melhor. Testar rotineiramente a funcionalidade que você escreveu usando um criador de perfil e procurar os gargalos e problemas comuns permitirá que você encontre e corrija muitos problemas menores que, de outra forma, se tornariam problemas maiores mais tarde.
- As informações de perfil servem para auxiliar na otimização do programa.
O que é o pprof?
- pprof é uma ferramenta para visualização e análise de dados de criação de perfil.
- Existem muitos comandos disponíveis na linha de comando pprof. Os comandos comumente usados incluem "top" "traces", que imprime um resumo dos principais pontos de acesso do programa, e "web", que abre um gráfico interativo de pontos de acesso e seus gráficos de chamadas.
- https://github.com/google/pprof/blob/master/doc/README.md
Como fazer a instrumentação
- via http (https://golang.org/pkg/net/http/pprof/)
- via runtime (https://golang.org/pkg/runtime/pprof/)
- O código de instrumentação que mede o aplicativo é adicionado a ele no tempo de execução, o que pode fornecer resultados muito detalhados e precisos, mas também vem com uma grande sobrecarga.
Exemplos
-
Memory leak
- Programa de computador gerencia incorretamente as alocações de memória, forma que a memória que não é mais necessária não seja liberada.
- Criação de substrings e sublices.
- Uso incorreto da defer.
- Corpos de resposta HTTP não fechados (ou recursos não fechados(CLose) em geral).
- Goroutines leak.
- Variáveis globais.
- O uso de memória aumenta lentamente com o tempo
- Degrada o desempenho
- O aplicativo irá travar(freeze/crash), exigindo uma reinicialização
- Após reiniciar está ok novamente, e o ciclo se repete
-
Goroutine leak
- Cada goroutine ocupa 2 KB
- O espaço ocupado pela própria pilha do goroutine causa vazamentos de memória.
- A memória de heap ocupada por variáveis em goroutine leva a vazamentos de memória de heap, que podem ser refletidos no perfil de heap.
- Um tipo comum de vazamento de memória é o vazamento de Goroutines. Se você iniciar um Goroutine que espera terminar, mas nunca termina, então ele vazou.
- Você inicia uma goroutina, mas ela nunca termina, ocupando para sempre uma memória que ela reservou. 1.
- Um vazamento de goroutine acontece quando as goroutines nunca terminam a execução, o que faz com que sua pilha permaneça no heap e nunca seja coletada pelo lixo, o que eventualmente leva a uma exceção de falta de memória.
- https://www.ardanlabs.com/blog/2018/11/goroutine-leaks-the-forgotten-sender.html
Informação da interface web
-
Goroutine
- o perfil Goroutine relata os rastreamentos de pilha de todos os goroutines atuais.
-
Allocs(Amostra de alocações de memoria)
- alloc - alocações totais desde o início da execução do programa, independentemente se a memória foi liberada ou não.
-
Memory/Heap (Amostra de alocações de memorias ainda persistidas)
- Esta é a memória que mais tarde obtém o lixo coletado pelo Go. O heap não é o único lugar onde as alocações de memória acontecem,
- Pode ser código que não está mais em execução
- Coisas que não liberaram memoria
- o perfil de heap relata as alocações ativas atualmente; usado para monitorar o uso de memória atual ou verificar se há vazamentos de memória.
-
Profile (CPU)
- o perfil da CPU determina onde um programa gasta seu tempo enquanto consome ativamente os ciclos da CPU (ao contrário enquanto dorme ou espera por E / S).
-
Trace (Execução do programa)
-
Perfil e rastreamento de CPU
-
flat: representa a memória alocada por uma função e ainda mantida por essa função.
-
cum: representa a memória alocada por uma função ou qualquer outra função chamada na pilha.
-
flat: quanta memória é alocada por esta função
-
cum: quanta memória cumulativa é alocada por esta função ou uma função que chamou para baixo da pilha
- inuse_space: Significa pprof está mostrando a quantidade de memória alocada e ainda não liberada.
- inuse_objects: O meio pprof está mostrando a quantidade de objetos alocados e ainda não liberados.
- alloc_space: Significa que pprof está mostrando a quantidade de memória alocada, independentemente se foi liberada ou não.
- alloc_objects: O meio pprofestá mostrando a quantidade de objetos alocados, independentemente se foram liberados ou não.
- HeapAlloc - tamanho de heap atual.
- HeapSys - tamanho total do heap.
- HeapObjects - número total de objetos no heap.
- HeapReleased - quantidade de memória liberada para o sistema operacional; liberações de tempo de execução para a memória do sistema operacional sem uso por 5 minutos, você pode forçar este processo com runtime / debug.FreeOSMemory.
- Sys - quantidade total de memória alocada do sistema operacional.
- Sys-HeapReleased - consumo efetivo de memória do programa.
- StackSys - memória consumida por pilhas goroutine (observe que algumas pilhas são alocadas do heap e não são contabilizadas aqui, infelizmente não há como obter o tamanho total das pilhas (https://code.google.com/p/go/ questões / detalhes? id = 7468)).
- MSpanSys / MCacheSys / BuckHashSys / GCSys / OtherSys - quantidade de memória alocada por tempo de execução para vários fins auxiliares; geralmente não são interessantes, a menos que sejam muito altos.
- PauseNs - durações das últimas coletas de lixo
https://blog.detectify.com/2019/09/05/how-we-tracked-down-a-memory-leak-in-one-of-our-go-microservices/ https://go101.org/article/memory-leaking.html