Como solucionar um local drupal demorando 5 segundos para carregar

Read this article in:

Um site Drupal consistentemente levando ~5 segundos para gerar uma página está quase sempre esperando por um destes:

  1. Base de dados
  2. Execução PHP
  3. Pedidos de HTTP externos
  4. Cache desabilitada/inconfigurada
  5. 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 status

Verificar:

  • Renderizar cache
  • Cache de página dinâmica
  • Cache de páginas

Então inspecione:

drush cget system.performance

Se 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.log

Uma única consulta que leva vários segundos é comum.

Perfil Drupal

Instalar módulos devel e profiler:

composer require drupal/webprofiler

WebProfiler 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.yml

Procurar

twig.config:
  debug: true
  auto_reload: true
  cache: false

Produção deve ser

debug: false
auto_reload: false
cache: true
OPCache

Verificar:

php -i | grep opcache.enable
php -i | grep opcache.validate_timestamps

Produção normalmente utilizada

opcache.enable=1
opcache.validate_timestamps=0
Xdebug

Verificar:

php -m | grep xdebug

ou

php -i | grep xdebug.mode

Se 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:

EXPLAIN

Procurar

  • 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:show

ou

tail -f web/sites/default/files/php.log

Advertê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.

Please login to post comments: