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

[PHP Conference] Otimizando sua aplicação em PH...

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

Renan Delmonico

December 07, 2024
Tweet

More Decks by Renan Delmonico

Other Decks in Programming

Transcript

  1. Renan H. Delmonico ➔ 29 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]
  2. 80% of performance issues have nothing to do with your

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

    20 de junho de 2013 PHP 8 PHP 9 PHP 7.4
  4. Zend Opcache ➔ Várias funcionalidades, dentre elas ele remove o

    “código morto” ➔ Não são somente configurações, também é possível fazer scripts para gerenciar o cache pois o opcache possui algumas funções que podem ser usadas ◆ https://php.net/manual/en/ref.opcache.php
  5. PHP 7.4 e o preloading PHP 5.5 Opcache é lançado

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

    20 de junho de 2013 PHP 8 PHP 9 PHP 7.4 Preloading 28 de novembro de 2019 JIT 26 de novembro de 2020 Melhorias no 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 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
  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 ◆ Ex.: código do framework que estamos usando
  9. ➔ Número máximo de chaves (e scripts) no hashtable do

    OPcache. ➔ Valor usado será o primeiro número maior ou igual ao conjunto de números primos [223, 463, 983, 1.979, 3.907, 7.963, 16.229, 32.531, 65.407, 130.987, 262.237, 524.521, 1.048.793] ➔ Valor mínimo é 200 e o máximo é 1.000.000 ➔ Controla quantos scripts PHP podem ser armazenados no OPcache ➔ Um valor maior permite mais scripts, melhorando desempenho, porém consome mais memória opcache.max_accelerated_files=10000
  10. ➔ Valor em MB que o opcache pode usar para

    alocar os scripts em memória ➔ Valor mínimo é 8. Caso seja usado um valor menor, será automaticamente alterado para 8. ➔ Mais memória pode aumentar o desempenho, porém aumenta o uso de recursos. opcache.memory_consumption=128
  11. ➔ O JIT é muito benéfico para aplicações que realizam

    operações intensivas em CPU ➔ É necessário definir a quantidade de memória reservada para o JIT pois, por padrão, ele vem desabilitado ➔ Para aplicações pequenas podemos usar 64MB ou 128MB e para aplicações maiores 256MB, porém cada caso deve ser tratado individualmente ➔ Podemos usar uma aplicação de monitoramento para chegar a um valor ideal, como por exemplo o opcache-gui
  12. ➔ 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
  13. 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
  14. 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
  15. R - Register Allocation 0 Don’t perform register allocation 1

    Perform block-local register allocation 2 Perform global register allocation
  16. ➔ 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
  17. ~10% ~5% ~60% <20% ➔ 34 instâncias ◆ Escalas constantes

    (praticamente todo dia) ◆ Era normal chegar em 40 instâncias ◆ Em alguns casos foram necessárias mais de 50 instâncias em grandes eventos ◆ Foi diminuído o número para 24 instâncias e diminuiu demais a necessidade de escala da app