Um site Drupal consistentemente levando ~5 segundos para gerar uma página está quase sempre esperando por um destes:
- Base de dados
- Execução PHP
- Pedidos de HTTP externos
- Cache desabilitada/inconfigurada
- Código personalizado lento
Primeiro, vamos determinar se é camada de transporte ou a infra-estrutura. Do servidor:
curl -o /dev/null -s -w \
'connect: %{time_connect}\nstarttransfer: %{time_starttransfer}\ntotal: %{time_total}\n' \
https://example.com
Se time_starttransfer é em torno de 5 segundos, a infra-estrutura é lenta.
O cache Drupal está mesmo a funcionar?
drush statusVerificar:
- Renderizar cache
- Cache de página dinâmica
- Cache de páginas
Então inspecione:
drush cget system.performanceSe você está logado, cache de página não vai ajudar, mas renderizar e cache de página dinâmica deve.
Activar o registo da base de dados
Se MySQL/MariaDB:
SHOW FULL PROCESSLIST;enquanto carrega uma página.
Ou habilitar o registro de consultas lento:
SET GLOBAL slow_query_log=1;
SET GLOBAL long_query_time=0.2;Então inspecione:
/var/lib/mysql/*-slow.logUma única consulta que leva vários segundos é comum.
Perfil Drupal
Instalar módulos devel e profiler:
composer require drupal/webprofilerWebProfiler irá mostrar
- roteamento
- ramo
- SQL
- serviços
- ganchos
- tempo de renderização
Normalmente você vai ver imediatamente o culpado.
Verificar os pedidos HTTP
Uma chamada esquecida pode custar 5 segundos.
Procurar:
grep -R "http" web/modules/custom
grep -R "curl" web/modules/custom
grep -R "Guzzle" web/modules/custom
grep -R "file_get_contents(" web/modules/custom
Qualquer coisa em contacto com outro servidor durante a geração de páginas é suspeita.
Verificar infraestrutura de cache
Se usar o cache do banco de dados:
drush ev "print_r(\Drupal::service('cache.default'));"Redis é drasticamente mais rápido em sites ocupados.
Certifique-se de desativar a depuração do Twig
Configurações de desenvolvimento facilmente adicionar segundos. Verificar:
development.services.ymlProcurar
twig.config:
debug: true
auto_reload: true
cache: falseProdução deve ser
debug: false
auto_reload: false
cache: trueOPCache
Verificar:
php -i | grep opcache.enable
php -i | grep opcache.validate_timestampsProdução normalmente utilizada
opcache.enable=1
opcache.validate_timestamps=0Xdebug
Verificar:
php -m | grep xdebugou
php -i | grep xdebug.modeSe estiver activo, desactiva- o.
Medir a contagem de SQL
Activar o registo de consultas:
$settings['container_yamls'][] = DRUPAL_ROOT . '/sites/development.services.yml';ou usar o WebProfiler.
Uma página em cache normal é frequentemente:
- 20–80 consultas SQL
Várias centenas de consultas indicam um problema.
Identificar ganchos caros
Procurar módulos personalizados para
hook_page_attachments()
hook_preprocess_page()
hook_preprocess_node()
hook_entity_view()
hook_views_pre_render()
hook_views_query_alter()Estas introduzem frequentemente atrasos.
Check Views
Uma visão grande pode consumir os 5 segundos inteiros.
Activar a antevisão SQL na Vista e executar:
EXPLAINProcurar
- Usando temporário
- Usando filesort
- scans de tabelas completas
Medir o PHP
Instale XHProf, Tideways ou Blackfire.
Um gráfico de chama identifica imediatamente onde o tempo de execução é gasto.
Verificar os registos
drush watchdog:showou
tail -f web/sites/default/files/php.logAdvertências repetidas podem atrasar significativamente a geração da página.
Benchmark sem Drupal
Criar um ficheiro PHP simples:
<?php
echo "hello";Comparar:
time curl https://example.com/test.php
time curl https://example.com/Se test.php é rápido e Drupal é lento, o problema está em Drupal em vez de PHP, o servidor web, ou TLS.