3. Performance is a big area
Everything can be improved!
The tests depends of hardware!
4. What part is the bottleneck?
The bottleneck is internal
E.g:
● Synchronous operation
● Non-optimized operation
The bottleneck is external
E.g:
● Database
● External API
● Socket communication
5. Baby Steps
1 How slow is it?
2 Where is the slowness at?
3 Why is slow?
4 Improve
How slow
is it?
Where are
the slow?
Improve
5 Repeat
16. About perf_events
● Profiling tool available only kernel linux, and can be used with eBPF
tools: kprobes, uprobes, etc.
● Measure how many CPU instructions happens in your
application/command. Try: “sudo perf stat ls”
18. Getting output by perf
root$ perf record …. write on /tmp/$PID.map (JIT)
root$ chown root /tmp/perf-3870.map // doesn’t exists
root$ perf script > output-perf
19. Node Profiling Options
--perf-basic-prof and --perf-basic-prof-only-function
replace most of functions V8::Function::Call to real
javascript function
Output the files in a format that existing perf tools can
consume.
Here you can see this flag on NodeJs world
27. Function that use most time of CPU
express
more than 60% from express
28. Understanding one line
● LazyCompile is an event generated by V8 Compiler, meaning that your
function is being compiled and optimized on-demand.
● Asterisk* This is good news meaning that your code was successfully
compiled to native code (fast) if you see a tilde (~) that means your code is
being interpreted (slow).
● Path & Line - This tells file and line.
Explicar sobre o nome da apresentação, poderia ser Node Profiling in Production
-> Eu fiz um artigo cobrindo boa parte do que vou falar nessa talk, se você assim como eu prefere os spoilers pode dar um check lá.
Há várias metodologias, não se prenda a ferramenta que vou explicar aqui.
Seu código sempre pode ser melhorado, seja pelo algoritmo ou por otimizações ao uso de CPU.
Os testes dependem do hardware, para um teste mais preciso, EC2 é uma boa.
Primeiro, precisamos identificar se nosso gargalo está:
-> Na parte interna do software, como os algoritmos e processamentos em si.
-> Na parte externa, devido as comunicações com banco de dados ou API externas.Nessa talk vamos falar sobre a parte interna.
-> Quão lento é?
-> Aonde está a lentidão?
-> Porque é lento?
-> Melhore
-> Repita
As vezes não temos um projeto com lacunas suficientes para um teste de performance. Por isso criei o node-bottleneck, ele contém versões de uma API melhorada, a intenção é gerar uma VX a cada melhora.
Todas as ferramentas acima são ótimas, porém, elas adicionam um overhead muito alto, no qual fazer o profiling em produção pode afetar os clientes com +lentidão no projeto.
Explicar sobre o perf no proximo slide
Perf atua na camada de kernel do linux, e infelizmente seu suporte é somente ao linux.
Por essa atuação, ele consegue se integrar com ferramentas de eBPF no qual também funcionam através de hook do kernel.
Seu objetivo é medir quantas instruções de CPU acontece em sua aplicação.
-> PID
-> Rodamos perf
-> Rodamos autocannon
-> record: Este comando executa um comando e usa um contador de desempenho e salva em /tmp/perf-$PID.data-> -F: É passado a frequencia no qual o perf vai usar, em aplicações NodeJs, é costume usar 99 Hertz
-> -p: o PID da aplicação
-> -g: Faça gravação de gráfico de chamadas (backtrace).
-> -c 10 conexoes
-> -d 10 segundos
Perf script pega o ultimo profiling.JIT (Just in Time) Toda função considerada “hot path” pode ser otimizada, com isso ela é compilada, e através do perf não conseguimos ver de fato qual função é chamada, e então veremos muitas chamadas: v8::Function::Call
-> Mas ainda é difícil de ler pois temos chamadas encadeadas ->->
E muitos stacktraces
Eixo y: numero de funções encadeadas (uma função que chama outra, ai vai alocando na pilha)
Eixo x: chamada de funções, quanto maior esse eixo, maior o tempo gasto de CPU