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

[DevPR] Otimizando sua aplicação PHP em produçã...

[DevPR] Otimizando sua aplicação PHP em produção com cache de bytecode

Atualização da talk apresentada em eventos passados para apresentação do Ingá.PHP, grupo do DevPR

Renan Delmonico

August 30, 2024
Tweet

More Decks by Renan Delmonico

Other Decks in Programming

Transcript

  1. Que bom que você tá aqui ❤ Senta do lado

    do seu amiguinho que lá vem converseiro!
  2. Renan H. Delmonico ➔ 28 anos ➔ Graduado em Sistemas

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

    server! Fonte: https://www.combell.com/en/performance-team
  4. Existe desde o php 5.5 PHP 5.5 Opcache é lançado

    20 de junho de 2013 PHP 8 PHP 9 PHP 7
  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. PHP 7.4 e o preloading PHP 5.5 Opcache é lançado

    20 de junho de 2013 PHP 8 PHP 9 PHP 7 Preloading 28 de novembro de 2019
  7. PHP 8 e o JIT PHP 5.5 Opcache é lançado

    20 de junho de 2013 PHP 8 PHP 9 PHP 7 Preloading 28 de novembro de 2019 JIT 26 de novembro de 2020 Melhorias no JIT ???
  8. 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 a interpretação do opcode pela 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
  9. 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?
  10. ➔ 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 da RFC, esse é o significado de cada número… ◆ A ordem das tabelas é da direita para esquerda
  11. 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
  12. 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
  13. R - Register Allocation 0 Don’t perform register allocation 1

    Perform block-local register allocation 2 Perform global register allocation
  14. ➔ 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 ➔ Ué, mas não era aqueles numerozinhos que eu não entendi nada? ◆ 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 numerozinho. • 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. ~10% ~5% ~60% <20% ➔ 34 instâncias rodando em prod

    ◆ Escalas constantes (praticamente todo dia) ◆ Era normal chegar em 40 instâncias ◆ Chegamos passar em alguns casos de 50 instâncias em grandes eventos ◆ Foi diminuído recentemente o número para 24 instâncias e não houve mais escalas ◆ Houve um grande evento ontem (28/08) e não escalou