Vou mostrar-te como fazer o Registo de lentidão do PHP-FPM analisa de forma direcionada, interpreta corretamente os backtraces e, a partir daí, define passos claros para reduzir a latência. Assim, consegues identificar de forma fiável os pontos de estrangulamento no desempenho, priorizar medidas e tornar os tempos de carregamento visivelmente mais rápidos para os utilizadores.
Pontos centrais
- Backtrace ler: O quadro #0 indica a pastilha de travão atual.
- Tempo limite escolher: começar por um nível elevado e, depois, baixar gradualmente.
- Correlação Com o registo de acesso: identificar com segurança URLs lentas.
- Amostra contar: dar prioridade às funções recorrentes.
- Correções de código deduzir: abordar de forma específica a base de dados, as APIs, os loops e os plugins.
O que é o Slowlog do PHP-FPM?
O Slowlog regista, para pedidos demorados, um Backtrace num ficheiro de registo, registando assim o ponto de execução atual sem encerrar o pedido. Assim, consigo identificar imediatamente qual o script, qual a URL e qual a função que está a bloquear o processo. As entradas incluem carimbos de data/hora, pool, nome do ficheiro do script, URI do pedido e a cadeia de chamadas de funções. Por isso, o slowlog distingue-se claramente dos registos de erros clássicos, pois documenta o desempenho, e não os erros. Para páginas com elevada carga, como os back-ends do WordPress, fornece indicações rapidamente aproveitáveis sobre consultas dispendiosas, renderização excessiva ou operações de E/S bloqueantes. Quem compreender estes instantâneos pode, muito rapidamente, Causa principal delimitar e planear medidas.
É assim que o Slowlog funciona no dia-a-dia
Após a ativação, o PHP-FPM grava um Instantâneo da pilha no registo, enquanto o pedido continua a ser processado. Cada entrada começa normalmente por „#0“, ou seja, no ponto em que se está a perder tempo. Entre os blocos, vejo frequentemente linhas em branco, o que facilita a separação dos eventos. Este método fornece amostras em vez de perfis completos, mas, em contrapartida, oferece indicações precisas sobre verdadeiros pontos de lentidão, como percursos de modelos complexos, hooks órfãos ou chamadas de rede lentas. Em fases de tráfego intenso, associo estas indicações a picos de carga e, assim, organizo de forma clara as secções de código. Assim que identifico padrões recorrentes, ajusto, por exemplo, pm.max_children e aproveita para isso as informações de Definir corretamente o valor de pm.max_children.
Ativar e configurar o Slowlog
Ativo a função no respectivo pool e defino o caminho, o tempo de espera e a profundidade do rastreio, para que a Avaliação permaneça gerível. Depois, reinicio o PHP-FPM e verifico se o ficheiro de registo pode ser gravado com os direitos do utilizador do pool. Como valor inicial, costumo definir 5 segundos, para detetar primeiro os picos mais evidentes, sem sobrecarregar o sistema com dados de registo. Em seguida, reduzo o valor gradualmente, assim que os problemas mais graves estiverem resolvidos. Para registos de dimensão razoável, limito a profundidade de rastreio a 20 a 30 frames, o que, na prática, costuma ser suficiente. Desta forma, mantenho a Tamanho do ficheiro sob controlo e não perca nenhum detalhe relevante.
| Definição | Objetivo | valor inicial | Notas |
|---|---|---|---|
registo lento | Caminho para o ficheiro de registo | /var/log/php-fpm/www-slow.log | Verificar os caminhos consoante a distribuição; direitos de escrita para www-data assegurar |
request_slowlog_timeout | Limite para „lento“ | 5s | Começar em grande, depois... baixar (por exemplo, 2–3 s) |
request_slowlog_trace_depth | Profundidade máxima do backtrace | 20–30 | Mantém os traces legíveis, sem Informações essenciais perder |
Encontrar o ficheiro de registo e analisá-lo rapidamente
Primeiro, verifico os caminhos configurados e abro o registo com menos ou verifica as últimas linhas com tail -40. Assim, vejo imediatamente se há registos a chegar e quais os scripts que se destacam repetidamente. Para uma orientação rápida, presto atenção aos nomes dos ficheiros, aos pools afetados e aos URIs que chamam a atenção. Se não encontrar entradas, ativo as opções no pool, atualizo o serviço e verifico os proprietários e os direitos. Em ambientes geridos, consulto também o painel ou os scripts de arranque, para garantir que o slowlog realmente acompanha.
Reconhecer blocos e contar padrões
Cada entrada aparece como um bloco, frequentemente separada por uma Linha em branco, o que facilita a contagem. Orient-me pelas linhas „#0“, pois marcam o ponto de execução atual em que se perde tempo. Através de simples pipelines de shell, filtro as principais funções e vejo quais os pontos que mais frequentemente causam atrasos. Desta forma, dou prioridade específica às funções que, no total, consomem mais tempo. Em seguida, verifico se esses pontos críticos ocorrem apenas em picos de carga ou se causam problemas de forma contínua. Esta classificação determina a Sequência das minhas medidas.
Ler entradas: desde o quadro #0 até ao início
Ao ler as entradas, começo por cima, em #0 e vou descendo passo a passo para compreender o percurso desde o ponto de entrada até ao local atual. Longas cadeias de modelos indicam um renderização dispendiosa, muitos hooks apontam para excesso de plugins e uma elevada proporção de SQL sugere a falta de índices. Anoto os números das linhas, os nomes das funções e os caminhos dos ficheiros para conseguir localizar rapidamente o código. Se a pilha parecer indicar bucles de espera ou operações repetidas, verifico a memória intermédia e o cache. Assim, não perco tempo com a Localização do problema no código.
Correlacionar o Slowlog com os registos de acesso
Associo o Slowlog aos registos do servidor Web para poder identificar os pedidos lentos de um determinado URL posso associar. Através de carimbos de data/hora e, opcionalmente, de PIDs, encontro as entradas correspondentes nos registos do Nginx ou do Apache. Desta forma, consigo identificar parâmetros, user-agents e tempos de resposta fora do PHP. Se surgirem visitantes recorrentes ou cadeias de consulta idênticas, inicio um teste com exatamente esses cenários. Desta forma, identifico rapidamente casos reproduzíveis e mantenho a Tempo de análise resumidamente.
Reduzir o valor-limite de forma iterativa
Começo com um limite generoso e, primeiro, resolvo os maiores Excedentes e, em seguida, vou reduzindo gradualmente. Este processo reduz o volume de registos e canaliza a minha energia para correções que valem a pena. Após cada ronda de otimização, escolho um limiar mais baixo e volto a recolher conjuntos de dados. Assim, vou avançando da filtragem inicial para o ajuste fino, sem me perder no ruído. O resultado são ajustes direcionados e uma claro Visão geral dos estrangulamentos remanescentes.
Do slowlog à solução: correções típicas
Se o Top-Frame apresentar funções da base de dados, verifico as instruções SQL com EXPLICAR, defino índices em falta e limito os conjuntos de resultados. No caso de serviços remotos, reduzo os tempos de espera, processei as respostas de forma assíncrona ou armazeno os resultados em cache. Se encontrar loops dispendiosos, simplifico a lógica, reduzo o número de iterações e utilizo estruturas mais eficientes. No WordPress, identifico hooks recorrentes, substituo extensões pesadas e opto por um tema mais leve. Se o número de processos PHP estiver a bloquear o processamento, fico atento aos tempos de espera e, além disso, consulto Backtraces também filas de espera, por exemplo, através de Fila de pedidos PHP.
Funcionamento contínuo: gestão eficaz dos registos
Não mantenho o registo sempre no máximo, para que o Carga de E/S permaneça controlável. Em vez disso, trabalho por fases: avalio ativamente, otimizo e, depois, volto a um nível moderado. Com o Logrotate, mantenho os ficheiros compactos e arquivo os dados antigos de forma comprimida. Após concluir uma análise, aumentei o limiar ou desativo temporariamente o slowlogging. Além disso, documento as conclusões e as correções, para que auditorias posteriores tenham uma visão clara pista encontrar.
Diagnóstico de alojamento: distinguir entre o servidor e a aplicação
A presença de muitos quadros Slowlog idênticos com uma elevada carga da CPU sugere que Código de aplicação, enquanto a ausência de registos num lado lento aponta, em geral, para problemas de E/S, rede ou servidor de base de dados. Nesses casos, comparo o TTFB, os tempos de execução do PHP e a latência upstream para localizar o ponto de estrangulamento. Se observar filas e tempos de espera elevados antes da execução, verifico os limites e o número de processos. Para tal, complemento o meu diagnóstico com informações sobre o processamento das solicitações e tenho em conta eventuais limites que possam estar a atrasar o processamento. Para uma avaliação fundamentada, além dos registos, consulto também indicações sobre Definir corretamente o valor de pm.max_children ou artigos relacionados com os tempos de espera, para que eu possa Capacidade de forma sensata.
Exemplo prático: backend do WordPress lento
Eu fixo request_slowlog_timeout Inicialmente, defino para 5 segundos, reinicio o PHP-FPM e recolho dados durante 30 a 60 minutos sob carga real. Depois, conto as funções „#0“ mais frequentes e procuro hooks recorrentes ou chamadas dispendiosas de WP_Query. Se surgirem serviços externos, medo os tempos de resposta e armazeno os resultados em cache de forma seletiva. Se as visualizações de páginas forem abrandadas por acessos de sessão, verifico o comportamento de bloqueio e, se possível, retiro o trabalho relacionado com a sessão do caminho crítico. Especialmente no caso de inícios de sessão e ações administrativas, testo as configurações e desativo as mensagens de aviso Bloqueio de sessão PHP para que o meu Backend reage mais rapidamente.
Conceção do pool e direitos: uma base sólida para slowlogs aproveitáveis
Separo as aplicações em pastas próprias piscinas com nomes claros (por exemplo, www, admin, api), defina ouvir-Soquetes e personalizados registo lento-caminhos. Isso permite-me correlacionar os registos mais facilmente e evitar confusões. É importante que sejam consistentes Direitos de ficheiro: O utilizador do pool (muitas vezes www-data) precisa de direitos de escrita no caminho do registo e no diretório. Em configurações de contentores ou chroot, verifico se os caminhos existem no namespace e se são persistentes – caso contrário, os registos desaparecem ao reiniciar.
Ler um bloco do Slowlog em pormenor e analisá-lo automaticamente
Normalmente, as entradas começam com o carimbo de data/hora, o pool, o nome do ficheiro de script e o URI do pedido, seguidos pelos frames. Conto as linhas „#0“ e agrupo-as por nome de função, para identificar os pontos críticos. Com pipes simples, extraio os pontos de congestionamento:
grep -E "^#0|request.uri|script_filename" /var/log/php-fpm/www-slow.log | sed 's/ */ /g'
Ou então, vou enumerar os top frames mais frequentes:
grep "^#0" /var/log/php-fpm/www-slow.log | awk -F": " '{print $2}' | awk '{print $1}' | sort | uniq -c | sort -nr | head
Se quiser incluir a URL e o ficheiro, preparo blocos através de awk e indica-me as principais combinações de função, URI e script. É assim que dou prioridade às correções que trazem mais benefícios.
Mapa de timeouts: como o Slowlog, o PHP e o servidor web interagem
Para um diagnóstico preciso, prescrevo todos Tempos limite: request_slowlog_timeout aciona o instantâneo, tempo_de_execução_máx limita o tempo de execução do PHP no script, request_terminate_timeout pode encerrar o FPM-Worker de forma forçada. No lado do servidor Web, aceder fastcgi– ou. proxy-Tempos limite (por exemplo,. fastcgi_read_timeout) e os tempos de espera do cliente. Se eu definir o slowlog acima devido aos tempos de espera do servidor, perco dados; se estiver entre os quais, obtenho instantâneos úteis antes de as solicitações serem interrompidas. Por isso, mantenho deliberadamente a seguinte ordem: tempo limite do servidor Web > encerramento do PHP > slowlog > latência do destino.
Incluir o estado do FPM, a fila e a gestão de processos
O Slowlog mostra que, onde O tempo que se desperdiça – o estado do FPM revela que, por que As solicitações estão em espera. Ativo o ponto final de estado e observo inativo, ativo e fila de escuta e comparo-os com os registos de tempo do Slowlog. Se a fila aumentar enquanto muitos trabalhadores ficam bloqueados nas mesmas funções, o código é o gargalo; se a fila aumentar sem que o Slowlog registe um aumento, significa que falta capacidade ou que um elemento a montante está a causar um atraso. Com base nisso, ajusto pm-Configurações (dinâmicas/sob demanda), pm.max_children e, se necessário,. pm.max_requests, para detetar fugas de memória ou fragmentação.
Particularidades em contentores e ambientes geridos
No Docker/Kubernetes, o FPM costuma registar em stdout/stderr ou em percursos que são recolhidos por agregadores de registos. Opto conscientemente por um a Eliminar, para que não tenha registos duplicados ou em falta. Com error_log = /proc/self/fd/2 e um dedicado registo lento-Os instantâneos continuam disponíveis no caminho que aponta para um volume persistente. Em configurações geridas, verifico se o fornecedor de serviços ativou ou limitou os slowlogs – e ajusto os intervalos para não entrar em conflito com as rotações.
Proteção de dados e segurança: registos sem riscos
Os backtraces podem conter informações sensíveis Parâmetros, que contenham percursos de ficheiros ou IDs de sessão. Minimizo os riscos guardando as cadeias de consulta nos registos de acesso, desativando as saídas de depuração no código e limitando o número de pessoas com permissão de leitura. Para a partilha com terceiros, anonimizo os percursos e removo os tokens. Em ambientes de produção, defino prazos de retenção curtos e aplico a rotação e a compressão de registos em todo o sistema.
WordPress: identificar rapidamente padrões recorrentes
- WP_Query/WP_Meta_Query: Faltam índices em
postmetaou, se a filtragem for feita com base em campos não indexados, o tempo de execução dispara. Reduzo as meta-consultas, utilizo taxonomias ou defino índices específicos. - Transientes e cache de objetos: Muitos cálculos semelhantes indicam a ausência de uma cache persistente. Ativo a cache de objetos, otimizo as chaves de cache e os TTLs.
- Hooks/Filtros: As cadeias longas no stack indicam excesso de plugins. Analiso os hooks mais pesados e elimino ou substituo extensões.
- Pedidos HTTP: As chamadas internas à API (wp_remote_get) devem utilizar tempos de espera, keep-alive e armazenamento em cache; sempre que possível, as respostas não devem bloquear o fio da solicitação.
- Renderização de modelos: Profundidade
get_template_part- As cadeias com acessos a ficheiros beneficiam do armazenamento em cache e de uma menor fragmentação.
Evitar interpretações erradas: o que o Slowlog não mostra
O Snapshot é um Instantâneo. Não descreve todo o ciclo de vida do pedido, mas sim o estado no momento em que é acionado. Armadilhas comuns:
- Viés de amostragem: Os caminhos raros, mas extremamente caros, podem perder-se se o tempo limite for demasiado curto ou se a fase tiver sido curta.
- Chamadas de sistema bloqueantes:
fopen,statou as consultas DNS aparecem como funções PHP, mas o tempo de espera propriamente dito ocorre no kernel ou na rede. - Carregamento automático: Muitas pequenas inclusões sem o Opcache causam perdas de eficiência que parecem inofensivas na pilha. Uma análise da taxa de acertos do Opcache ajuda a avaliar a situação.
Manter-se a par do CLI, do Cron e dos Webhooks
Nem todos os problemas de desempenho passam pelo FPM. Os mais pesados Cronjobs (por exemplo, wp-cron), os Queue-Workers ou os Webhooks bloqueiam a CPU, as E/S ou a base de dados, prejudicando assim indiretamente os tempos de resposta. Isolo essa carga em processos separados, agendo-a fora dos períodos de pico e verifico se está a ser executada via HTTP acionado pelo FPM em vez de pela CLI – caso contrário, isso distorce a visão do slowlog.
Implementar a rotação de registos de forma prática
Para evitar que os slowlogs fiquem demasiado volumosos, faço a sua rotação com frequência e compacto os registos antigos. Uma rotação típica mantém algumas gerações, sinaliza ao FPM para reabrir e evita lacunas. Importante: após a rotação, é necessário reabrir o FPM (HUP), para que as novas entradas não sejam perdidas. As configurações específicas são definidas com base no tráfego, no tempo de espera e na profundidade de rastreio.
Lista de verificação para resultados rápidos
- Ativar o Slowlog por pool, verificar os caminhos e os direitos de acesso.
- Iniciar com 5s, recolher registos, contar os fotogramas de maior qualidade.
- Correlacionar com os registos de acesso: carimbo de data/hora, URI, User-Agent.
- Verificar os tempos de espera do servidor a montante e do servidor Web.
- Monitorizar o estado do FPM e a fila, pm- Ajustar os limites.
- Resolver primeiro os pontos críticos: índices SQL, cache, hooks dispendiosos, E/S.
- Reduzir gradualmente o tempo de espera e voltar a medir.
- Rotar os registos, documentar as conclusões, acompanhar as alterações.
Em resumo: o teu caminho para um melhor desempenho
Ativo o Slowlog, leio o Quadros de destaque, correlaciono com os registos de acesso e resolvo primeiro os picos mais significativos. Depois, reduzo o limiar, analiso padrões recorrentes e aplico correções específicas no código, na configuração e no cache. Com a rotação de registos e tempos de espera moderados, mantenho a carga operacional baixa. No caso do WordPress, concentro-me em consultas dispendiosas, plugins, hooks e possíveis bloqueios de sessão. Assim, consigo identificar com fiabilidade os verdadeiros Estrangulamentos e forneça respostas visivelmente mais rápidas.


