Files
frankenphp/docs/pt-br/performance.md
Adiel Cristo 1eb16f1434 feat: add Brazilian Portuguese translation (#1645)
* feat: add Brazilian Portuguese

* Translate file README.md

* Update file README.md

* Translate file docs/classic.md

* Translate file docs/worker.md

* Translate file docs/early-hints.md

* Translate file docs/mercure.md

* Translate file docs/x-sendfile.md

* Translate file docs/config.md

* Translate file docs/docker.md

* Minor fixes

* Translate file docs/production.md

* Translate file CONTRIBUTING.md

* Minor fixes

* Translate file docs/performance.md

* Minor fixes

* Translate file docs/embed.md

* Minor fixes

* Minor fixes

* Translate file docs/static.md

* Translate file docs/compile.md

* Minor fixes

* Translate file docs/metrics.md

* Translate file docs/laravel.md

* Translate file docs/known-issues.md

* Minor fixes

* Translate file docs/github-actions.md

* Fix build

* Fix build

* fix: remove text already translated

* feat: update translation

* fix: format comments based on other translations
2025-08-25 16:13:04 +02:00

7.9 KiB

Desempenho

Por padrão, o FrankenPHP tenta oferecer um bom equilíbrio entre desempenho e facilidade de uso. No entanto, é possível melhorar substancialmente o desempenho usando uma configuração apropriada.

Número de threads e workers

Por padrão, o FrankenPHP inicia 2 vezes mais threads e workers (no modo worker) do que a quantidade de CPU disponível.

Os valores apropriados dependem muito de como sua aplicação foi escrita, do que ela faz e do seu hardware. Recomendamos fortemente alterar esses valores. Para melhor estabilidade do sistema, recomenda-se ter num_threads x memory_limit < available_memory.

Para encontrar os valores corretos, é melhor executar testes de carga simulando tráfego real. k6 e Gatling são boas ferramentas para isso.

Para configurar o número de threads, use a opção num_threads das diretivas php_server e php. Para alterar o número de workers, use a opção num da seção worker da diretiva frankenphp.

max_threads

Embora seja sempre melhor saber exatamente como será o seu tráfego, aplicações reais tendem a ser mais imprevisíveis. A configuração max_threads permite que o FrankenPHP gere threads adicionais automaticamente em tempo de execução até o limite especificado. max_threads pode ajudar você a descobrir quantas threads são necessárias para lidar com seu tráfego e pode tornar o servidor mais resiliente a picos de latência. Se definido como auto, o limite será estimado com base no memory_limit em seu php.ini. Caso contrário, auto assumirá como padrão o valor 2x num_threads. Lembre-se de que auto pode subestimar bastante o número de threads necessárias. max_threads é semelhante ao pm.max_children do PHP FPM. A principal diferença é que o FrankenPHP usa threads em vez de processos e os delega automaticamente entre diferentes worker scripts e o modo clássico, conforme necessário.

Modo worker

Habilitar o modo worker melhora drasticamente o desempenho, mas sua aplicação precisa ser adaptada para ser compatível com este modo: você precisa criar um worker script e garantir que a aplicação não esteja com vazamento de memória.

Não use musl

A variante Alpine Linux das imagens oficiais do Docker e os binários padrão que fornecemos usam a biblioteca C musl.

O PHP é conhecido por ser mais lento ao usar esta biblioteca C alternativa em vez da biblioteca GNU tradicional, especialmente quando compilado no modo ZTS (thread-safe), necessário para o FrankenPHP. A diferença pode ser significativa em um ambiente com muitas threads.

Além disso, alguns bugs só acontecem ao usar musl.

Em ambientes de produção, recomendamos o uso do FrankenPHP vinculado à glibc.

Isso pode ser feito usando as imagens Docker do Debian (o padrão), baixando o binário com sufixo -gnu de nossos Lançamentos ou compilando o FrankenPHP a partir dos fontes.

Como alternativa, fornecemos binários musl estáticos compilados com o alocador mimalloc, o que alivia os problemas em cenários com threads.

Configuração de Tempo de Execução do Go

O FrankenPHP é escrito em Go.

Em geral, o tempo de execução do Go não requer nenhuma configuração especial, mas em certas circunstâncias, configurações específicas melhoram o desempenho.

Você provavelmente deseja definir a variável de ambiente GODEBUG como cgocheck=0 (o padrão nas imagens Docker do FrankenPHP).

Se você executa o FrankenPHP em contêineres (Docker, Kubernetes, LXC...) e limita a memória disponível para os contêineres, defina a variável de ambiente GOMEMLIMIT para a quantidade de memória disponível.

Para mais detalhes, a página de documentação do Go dedicada a este assunto é uma leitura obrigatória para aproveitar ao máximo o tempo de execução.

file_server

Por padrão, a diretiva php_server configura automaticamente um servidor de arquivos para servir arquivos estáticos (assets) armazenados no diretório raiz.

Este recurso é conveniente, mas tem um custo. Para desativá-lo, use a seguinte configuração:

php_server {
    file_server off
}

try_files

Além de arquivos estáticos e arquivos PHP, php_server também tentará servir o arquivo index da sua aplicação e os arquivos index de diretório (/path/ -> /path/index.php). Se você não precisa de arquivos index de diretório, pode desativá-los definindo explicitamente try_files assim:

php_server {
    try_files {path} index.php
    root /raiz/da/sua/aplicacao # adicionar explicitamente a raiz aqui permite um melhor armazenamento em cache
}

Isso pode reduzir significativamente o número de operações desnecessárias com arquivos.

Uma abordagem alternativa com 0 operações desnecessárias no sistema de arquivos seria usar a diretiva php e dividir os arquivos do PHP por caminho. Essa abordagem funciona bem se toda a sua aplicação for servida por um arquivo de entrada. Um exemplo de configuração que serve arquivos estáticos a partir de uma pasta /assets poderia ser assim:

route {
    @assets {
        path /assets/*
    }

    # tudo a partir de /assets é gerenciado pelo servidor de arquivos
    file_server @assets {
        root /raiz/da/sua/aplicacao
    }

    # tudo o que não está em /assets é gerenciado pelo seu arquivo index ou worker PHP
    rewrite index.php
    php {
        root /raiz/da/sua/aplicacao # adicionar explicitamente a raiz aqui permite um melhor armazenamento em cache
    }
}

Placeholders

Você pode usar placeholders nas diretivas root e env. No entanto, isso impede o armazenamento em cache desses valores e acarreta um custo significativo de desempenho.

Se possível, evite placeholders nessas diretivas.

Por padrão, se o diretório raiz for um link simbólico, ele será resolvido automaticamente pelo FrankenPHP (isso é necessário para o funcionamento correto do PHP). Se o diretório raiz não for um link simbólico, você pode desativar esse recurso.

php_server {
    resolve_root_symlink false
}

Isso melhorará o desempenho se a diretiva root contiver placeholders. O ganho será insignificante em outros casos.

Logs

O logging é obviamente muito útil, mas, por definição, requer operações de E/S e alocações de memória, o que reduz consideravelmente o desempenho. Certifique-se de definir o nível de logging corretamente e registrar em log apenas o necessário.

Desempenho do PHP

O FrankenPHP usa o interpretador PHP oficial. Todas as otimizações de desempenho usuais relacionadas ao PHP se aplicam ao FrankenPHP.

Em particular:

Para mais detalhes, leia a entrada dedicada na documentação do Symfony (a maioria das dicas é útil mesmo se você não usar o Symfony).