Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tunando seu PHP em produção com cache de bytecode

Tunando seu PHP em produção com cache de bytecode

Nessa talk abordei o funcionamento do opcache bem como o preloading e o novo JIT

Renan Delmonico

October 26, 2022
Tweet

More Decks by Renan Delmonico

Other Decks in Programming

Transcript

  1. Renan H. Delmonico ➔ 27 anos ➔ Graduado em Sistemas

    de Informação (Unipar) ➔ Especialista em desenvolvimento web e mobile (Alfa Umuarama) ➔ Desenvolvedor há quase 10 anos ➔ Engenheiro de Software no PagSeguro Internacional (antigo BoaCompra) ➔ Apaixonado por futebol 🌴👍🌍 e esporte eletrônico (CS:GO) 🔫 @renandelmonico @renandelmonico /renandelmonico /renandelmonico /renandelmonico [email protected]
  2. 80% of performance issues have nothing to do with your

    server! Fonte: https://www.combell.com/en/performance-team
  3. Conceitos do PHP ➔ Linguagem interpretada ➔ “Fire and forget”

    ◆ A cada request o PHP “compila” todos os arquivos que serão utilizados e depois executa as operações ➔ Não tem uma compilação “manual” ◆ Automágica 🧙 a cada request
  4. Quem é o opcache? Nunca vi na fila do pão

    ➔ Melhora a performance do PHP armazenando o script em bytecode em memória RAM, removendo assim a necessidade de fazer a compilação a CADA request ➔ Sem o opcache todo o código compilado após a request é “descartado” sendo necessária a compilação novamente em uma nova requisição ➔ Em produção os opcodes não mudam ◆ A cada novo deploy é gerada uma nova imagem, com o novo código ➔ Existe desde o PHP 5.5 ➔ Zend Optimizer ◆ “doado” pela Zend
  5. Zend Opcache Optimizer ➔ Várias funcionalidades, dentre elas ele remove

    o “código morto” ➔ Não são somente configurações, é possível fazer scripts para gerenciar o cache ➔ https://php.net/manual/en/ref.opcache.php
  6. E o tal do preloading do PHP 7.4? ➔ Opcache

    com anabolizante ➔ Permite que você diga ao PHP FPM para gerar os opcodes e jogar no cache antes de executar qualquer código na Zend VM ➔ Zend VM? ◆ Depois dos opcodes gerados quem executa é a Zend VM ➔ ⚠ Não funciona no Windows ◆ Servidores em prod quase sempre são Linux! ➔ Depois disso ainda temos o JIT!
  7. PHP 8 e o JIT ➔ Opcache faz com que

    a obtenção dos opcodes seja mais rápida para execução na Zend VM, o JIT faz com que os códigos sejam executados sem VM 🥰 ➔ Zend VM foi escrita em C e funciona como uma camada entre o opcode e o CPU, o JIT gera um código compilado em tempo de execução para que o PHP “pule” a Zend VM ➔ Implementação usa a lib DynASM (Dynamic Assembler) ◆ O JIT compiler transforma os opcodes em código de máquina específico da arquitetura da CPU usando o DynASM
  8. Como o JIT se comporta? ➔ Compila apenas alguns opcodes

    que são mais utilizados ◆ Faz um profiling dos opcode executados e verifica quais faz sentido compilar ◆ Código do framework que estamos usando?
  9. Agora vamos configurar essa bagaça ➔ Basicamente (existem outras, mas

    essa é a principal) essa é a única configuração que você irá alterar ➔ Cada posição desse número tem um significado ◆ É confuso? É. Mas é o que tem pra hoje ◆ De acordo com a lista do RFC, esse é o significado de cada número… ◆ A ordem das tabelas é da direita para esquerda
  10. Agora vamos configurar essa bagaça O - Optimization Level 0

    don’t JIT 1 minimal JIT (call standard VM handlers) 2 Inline VM handlers 3 Use type inference 4 use call graph 5 Optimize whole script
  11. Agora vamos configurar essa bagaça T - Trigger 0 Compile

    all function on script load 1 Compile function on first execution 2 Profile functions on first request and compile the hottest functions afterwards 3 Profile on the fly and compile hot functions 4 Currently unused 5 Use tracing JIT. Profile on the fly and compile traces for hot code segments
  12. Agora vamos configurar essa bagaça R - Register Allocation 0

    Don’t perform register allocation 1 Perform block-local register allocation 2 Perform global register allocation
  13. Agora vamos configurar essa bagaça C - CPU (specific optimization

    flags) 0 Disable CPU-specific optimization 1 Enable use of AVX, if the CPU supports it
  14. Agora vamos configurar essa bagaça ➔ Reza a lenda que

    a melhor configuração é a 1255 ➔ A opção opcache.jit é opcional, se não informada será considerado o valor padrão ➔ E qual o valor padrão? ◆ opcache.jit=tracing ➔ Uai sô, mas não era aqueles numerozinhos marotos? ◆ Depois de aprovada a RFC, chegaram na conclusão que as opções não eram user-friendly, então refizeram tudo adicionaram dois alias que são “traduzidos” para os numerozinhos marotos. • opcache.jit=tracing • opcache.jit=function ➔ A diferença entre os dois é que function o JIT irá tentar otimizar somente o código dentro de um escopo de uma única função, enquanto o tracing faz o trace (ah, vá!) toda a pilha para identificar e otimizar o código. ➔ É recomendado o uso do trace, pois quase sempre apresentará resultados melhores
  15. É isso! Perguntas ao vivo? Senão chama 🔥 no privado

    @renandelmonico @renandelmonico /renandelmonico /renandelmonico /renandelmonico [email protected]