Moodle Lento: As Causas Reais e Como Diagnosticar
Antes de contratar um servidor maior, meça. As causas mais comuns de lentidão no Moodle são de configuração — e custam zero para corrigir.
por Cleverson Gouvêa
Moodle lento raramente é culpa de servidor pequeno. Na maioria dos chamados que atendo, a lentidão vem de três coisas que não custam nada para corrigir: cache desligado, cron atrasado e banco sem tuning. Este guia mostra como diagnosticar em 30 minutos, quais números pedir antes de assinar um contrato maior e como reconhecer os casos em que trocar de servidor é, de fato, a decisão certa.
TL;DR
- Moodle lento é sintoma, não diagnóstico. Meça TTFB, tempo de geração da página e número de queries por página antes de qualquer coisa.
- As causas mais comuns são de configuração: theme designer mode ligado, MUC e sessões em disco, OPcache ausente, cron rodando de hora em hora e tabela de log inchada.
- O relatório Visão geral de desempenho (Administração do site → Relatórios) aponta três desses problemas em 10 segundos.
- Trocar de servidor só resolve quando o gargalo é saturação real de CPU, RAM ou I/O — e isso se prova com métrica, não com sensação.
- Moodle 5.1 (06/10/2025) exige PHP 8.2+ e mudou o document root para
/public; Moodle 5.2 saiu em 20/04/2026 e a próxima LTS, a 5.3, está prevista para 05/10/2026.
Trabalho com Moodle desde 2008 e já operei ambientes com dezenas de milhares de alunos em picos de matrícula e semana de provas. Quase toda vez que um cliente chega dizendo que quer um servidor maior, o problema está na camada de software. E quando o servidor realmente é o gargalo, dá para provar em minutos — com número, não com achismo.
Moodle lento: o que é lentidão de verdade e como medir
A primeira armadilha é semântica. A expressão Moodle lento é usada para descrever pelo menos cinco problemas diferentes, e cada um tem uma causa distinta:
- Página demora a começar a carregar — o servidor está pensando demais. É TTFB (Time To First Byte), e aponta para PHP, banco ou cache.
- Página carrega, mas fica meio quebrada e lenta para responder ao clique — é front-end: JavaScript e CSS sendo servidos sem cache, sem compressão ou sem CDN.
- Só a página de um curso específico é lenta — é conteúdo: curso com centenas de atividades, filtro pesado, plugin mal escrito.
- Fica lento só das 19h às 22h — é concorrência. O servidor aguenta o dia, não aguenta o pico.
- Fica lento na semana de provas — é o questionário. O módulo
quizé o mais pesado do Moodle para o banco de dados.
Os três números que você precisa antes de abrir chamado
Antes de conversar com qualquer fornecedor, colete:
- TTFB medido de fora, com
curl -w "%{time_starttransfer}\n" -o /dev/null -s https://seu-moodle/. Rode dez vezes, em horário de pico e fora dele. - Tempo de geração da página e número de queries, que o próprio Moodle informa no rodapé quando você liga o performance info.
- Uso de CPU, RAM e I/O do servidor no mesmo intervalo, com
top,vmstat 1eiostat -x 1.
Se o TTFB é de 3 segundos e a CPU está em 20%, o servidor não é o problema. Guarde essa frase — ela economiza contratos inteiros.
As causas de aplicação que derrubam o Moodle sem culpa do hardware
Estas são as que encontro com mais frequência em auditoria. Todo Moodle lento que passou pela minha mesa tinha pelo menos duas delas — e todas se resolvem sem trocar uma linha de hardware.
Theme designer mode ligado
É a causa número um de Moodle lento na minha lista. Com o theme designer mode ativo, o Moodle recompila CSS e JavaScript a cada requisição de cada usuário. A própria documentação do Moodle avisa que isso derruba o desempenho de forma dramática. Alguém liga para ajustar uma cor no tema, esquece de desligar e o site fica arrastado por meses. Verifique em Administração do site → Aparência → Temas → Configurações de tema.
MUC e sessões em disco
O Moodle usa o MUC (Moodle Universal Cache), um sistema de cache em camadas para definições de curso, contextos, strings de idioma e permissões. Por padrão, ele vive no sistema de arquivos. Em site pequeno funciona; a partir de algumas centenas de usuários simultâneos, cada leitura vira I/O.
O mesmo vale para as sessões. A documentação de session handling do Moodle recomenda o driver Redis, e diz explicitamente que sessões em banco de dados têm desempenho baixo e não são recomendadas para sites grandes. A configuração vai no config.php:
$CFG->session_handler_class = '\core\session\redis';
$CFG->session_redis_host = '127.0.0.1';
$CFG->session_redis_prefix = 'meusite_us_';
$CFG->session_redis_acquire_lock_timeout = 120;
$CFG->session_redis_lock_expire = 7200;
Um detalhe que quase ninguém sabe: o Moodle bloqueia a sessão durante a requisição. Se uma página pesada segura o lock por 20 segundos, as outras abas daquele mesmo aluno ficam esperando. O usuário jura que o Moodle lento é do servidor; na verdade é ele competindo consigo mesmo.
OPcache desligado ou subdimensionado
A documentação oficial de recomendações de desempenho é direta: garanta que o acelerador embutido do PHP — o OPcache — esteja habilitado. Sem ele, o PHP reinterpreta milhares de arquivos a cada clique. Site com OPcache desligado é Moodle lento garantido, mesmo em máquina folgada: é o ajuste com melhor relação entre esforço e ganho que existe no Moodle. Confira com php -i | grep opcache.enable e olhe a taxa de acerto: se opcache_get_status() mostra misses subindo o tempo todo, a memória do OPcache está pequena para o tamanho do seu código mais os plugins.
Cron atrasado ou rodando por HTTP
A documentação recomenda executar o cron a cada minuto, e sempre por CLI (php admin/cli/cron.php), nunca por chamada HTTP — em instalações grandes, o cron por HTTP consome memória demais. Cron atrasado não é o tipo de Moodle lento que aparece no TTFB; ele acumula fila. Notificações, índice de busca, limpeza da lixeira e processamento de notas se empilham e explodem tudo de uma vez. Em Administração do site → Servidor → Tarefas agendadas você vê a última execução de cada tarefa. Se há tarefas que deveriam rodar de hora em hora e rodaram ontem, achou um problema.
Tabela de log inchada e estatísticas ligadas
O mdl_logstore_standard_log cresce sem parar. Em EAD ativo, passa de dezenas de milhões de linhas em um ano. Relatórios e o bloco de atividades recentes passam a varrer essa montanha. Ajuste o tempo de vida dos logs em Administração do site → Servidor → Limpeza, e desligue as estatísticas se você não as usa — o relatório de desempenho do próprio Moodle recomenda exatamente isso.
As causas de infraestrutura: quando o gargalo é real
Banco de dados sem tuning
Um MariaDB com configuração padrão trabalha com um buffer pool minúsculo. A recomendação da documentação do Moodle para máquina dedicada a banco é innodb_buffer_pool_size em torno de 80% da RAM, com innodb_buffer_pool_instances acompanhando o número de núcleos de CPU. Se o seu banco tem 40 GB e o buffer pool tem 128 MB, cada consulta vai ao disco. Buffer pool subdimensionado é a causa mais comum de Moodle lento no horário de pico, e não existe servidor grande o bastante para compensar isso.
Vale lembrar os mínimos de versão do Moodle 5.1: PostgreSQL 15, MySQL 8.4 ou MariaDB 10.11. Rodar abaixo disso não é só risco de suporte — é abrir mão de otimizações do próprio banco.
PHP-FPM mal dimensionado
Workers de menos criam fila: as requisições esperam em listen.backlog e o aluno vê a página congelada. Workers demais estouram a RAM e o sistema começa a usar swap — aí sim o Moodle lento vira Moodle travado. A conta é simples: pegue o consumo médio real de um worker (normalmente 60–120 MB em Moodle com plugins) e divida a RAM disponível para PHP por esse valor.
Disco, rede e assets
A documentação de instalação sugere 200 MB para o código mais espaço para conteúdo, com 5 GB como mínimo realista, e 8 GB de RAM ou mais para servidores de produção grandes. Mas o número que mais dói é o IOPS. Moodle com moodledata em disco de rede lento, ou em NFS mal configurado, entrega TTFB alto mesmo com CPU ociosa. Já vi ganho de 60% só movendo o localcachedir para disco local rápido.
Roteiro de diagnóstico de Moodle lento em 30 minutos
Faça nesta ordem. Cada passo elimina uma hipótese.
Passo 1 — abra o relatório de desempenho
Administração do site → Relatórios → Visão geral de desempenho. Ele checa, entre outros itens, se o theme designer mode está ligado, se o cache de JavaScript (cachejs) está ativo e se as estatísticas estão sendo gravadas. Três cliques, três causas eliminadas.
Passo 2 — ligue o performance info
Em Administração do site → Desenvolvimento → Depuração, ative Performance info. O rodapé passa a mostrar tempo de geração, memória e cache hit/miss. Para contar queries, adicione ao config.php:
define('MDL_PERF', true);
define('MDL_PERFDB', true);
define('MDL_PERFTOFOOT', true);
Página institucional com mais de 200 queries é sinal de plugin ou bloco mal comportado. Página de curso com 1.500 queries é bug, não é falta de servidor.
Passo 3 — registre as queries lentas
Ainda no config.php, o Moodle permite registrar consultas acima de um limiar na tabela mdl_log_queries, via dboptions com logslow. Rode por um dia inteiro e olhe as dez piores. Costuma ser sempre a mesma consulta, do mesmo plugin.
Passo 4 — correlacione com o horário
Cruze o TTFB com o gráfico de CPU e de conexões do banco. Moodle lento apenas no pico é problema de dimensionamento; Moodle lento o tempo todo é problema de configuração. É a distinção mais importante de todo o diagnóstico.
Tabela de sintoma, causa provável e onde olhar
| Sintoma | Causa provável | Onde verificar | Correção típica |
|---|---|---|---|
| Lento o dia inteiro, CPU baixa | Theme designer mode / OPcache off | Visão geral de desempenho; php -i |
Desligar designer mode; ligar OPcache |
| Lento só no pico da noite | Workers PHP-FPM ou banco saturado | top, conexões do MariaDB |
Redimensionar pool; tuning do InnoDB |
| Lento após ativar um plugin | Queries em laço | Performance info (nº de queries) | Substituir ou corrigir o plugin |
| Notificações e notas atrasadas | Cron atrasado ou por HTTP | Tarefas agendadas | Cron por CLI a cada minuto |
| Relatórios travam o site inteiro | mdl_logstore_standard_log gigante |
Tamanho da tabela | Reduzir log lifetime; réplica de leitura |
| Login lento, abas travando | Lock de sessão em disco | config.php |
Sessões em Redis |
O checklist de tuning que resolve a maioria dos casos de Moodle lento
Se eu tivesse uma hora e acesso root, faria exatamente isto, nesta ordem:
- Desligar theme designer mode e ligar
cachejs. - Habilitar e dimensionar o OPcache; revisar
memory_limitnophp.ini. - Mover sessões para Redis e apontar os stores do MUC para Redis também.
- Ajustar
innodb_buffer_pool_sizeeinnodb_buffer_pool_instancesno MariaDB. - Colocar o cron por CLI a cada minuto, em usuário e worker próprios.
- Reduzir o log lifetime e desligar estatísticas não usadas.
- Colocar
localcachedirem disco local rápido. - Publicar assets estáticos atrás de CDN com compressão.
Na média dos ambientes que assumi, esse checklist derrubou o TTFB de 3–4 segundos para menos de 1 segundo — sem trocar uma máquina. É o mesmo trabalho que fazemos no onboarding da nossa hospedagem gerenciada de Moodle, antes de discutir qualquer aumento de plano.
Quando trocar de servidor é a resposta certa, e quando não é
Trocar faz sentido quando, com o checklist acima já aplicado, você observa:
- CPU acima de 80% sustentados no pico, com fila de execução (
load average) acima do número de núcleos; - RAM saturada com swap ativo — swap em servidor de banco é sentença de lentidão;
- I/O wait de dois dígitos no
iostat; - Banco e web disputando a mesma máquina, com o buffer pool já no teto do que a RAM permite;
- Crescimento previsto que você consegue projetar: dobrar alunos no semestre seguinte, por exemplo.
Não troque quando: o problema aparece só em uma página, só depois de instalar um plugin, só na semana de provas (aí é o quiz e o cron), ou quando ninguém mediu nada. Servidor maior com cache desligado continua sendo Moodle lento — só que mais caro. Já peguei cliente que triplicou o custo mensal de infraestrutura e ganhou 8% de TTFB, porque o gargalo era mdl_log com 90 milhões de linhas.
Vale a comparação com os números que a própria comunidade usa como referência de escala: a documentação de desenvolvimento cita instalações chegando a 1 milhão de usuários, 50 mil cursos e 5 mil usuários por curso. Se o seu Moodle tem 3 mil alunos e está lento, o problema quase certamente não é capacidade.
Armadilhas e custos que ninguém conta na hora da migração
Versão do PHP. O Moodle 5.1 exige PHP 8.2 no mínimo, e aceita 8.3 e 8.4, apenas em 64 bits, com a extensão sodium e max_input_vars de pelo menos 5000. Migrar para um servidor com PHP antigo é migrar para um beco sem saída.
A mudança do /public. A partir do Moodle 5.1 existe um diretório /public, e o document root do servidor web precisa apontar para ele — não mais para a raiz do Moodle. Quem migra copiando o vhost antigo quebra o site ou expõe arquivos que não deveriam ficar acessíveis. Plugins instalados antes do upgrade continuam no lugar antigo e precisam ser movidos manualmente.
Ciclo de versões. O Moodle 4.5 LTS teve o suporte geral encerrado em 06/10/2025 e mantém apenas suporte de segurança até 04/10/2027. O 5.2 chegou em 20/04/2026 e a próxima LTS, a 5.3, está prevista para 05/10/2026. Planeje a migração de servidor junto com a de versão — fazer as duas separadas custa duas janelas e dois períodos de risco. Escrevi sobre esse cálculo no post de versão, LTS e upgrade do AVA da UFBA, e o caso da atualização do PVANet da UFV para o Moodle 4.5 mostra o tamanho real do esforço em uma instituição pública.
Custo de conviver com Moodle lento. Cada semestre adiando o diagnóstico é evasão, chamado no suporte acadêmico e professor migrando conteúdo para fora do AVA. Esse custo não entra na planilha de infraestrutura, mas é o maior de todos.
Custo escondido do downtime. Uma janela mal planejada em semana de provas custa mais que um ano de diferença de plano. O padrão de acesso de instituição pública, com pico concentrado no início de semestre, está bem ilustrado no que analisei sobre o pico de acesso do Moodle da UTFPR em 2026/2.
Como a Agathas Web resolve isso
Nossa hospedagem gerenciada de Moodle começa exatamente pelo diagnóstico descrito acima — e o diagnóstico inicial é gratuito, mesmo que você decida ficar onde está.
O que está incluso:
- Stack afinada para Moodle, não hospedagem genérica: PHP-FPM com pool dedicado por instância e OPcache ajustado, Redis para sessões e MUC, MariaDB 10.11+ com binlog, Nginx e cron isolado em worker próprio.
- Monitoramento 24/7 com Grafana, Sentry e verificação externa de uptime, com alerta na equipe técnica antes de o aluno reclamar.
- Backup diário com binlog incremental a cada 15 minutos, storage offsite criptografado e restore testado todo mês.
- Migração assistida em até 5 dias úteis, com paridade de usuários, cursos, notas, badges e fóruns, homologação em staging, cut-over em janela noturna ou de fim de semana e ambiente antigo preservado por 30 dias para rollback.
- SLA contratual de 99,9% de uptime, resposta em até 15 minutos para incidentes críticos e suporte sênior em português, por WhatsApp, sem nível 1 lendo roteiro.
- Relatório mensal com uso de recursos, eventos críticos, backups testados e melhorias sugeridas.
Como funciona na prática: você nos dá acesso de leitura ao ambiente atual, rodamos o diagnóstico e devolvemos um documento apontando o gargalo, o ganho esperado de cada correção e o dimensionamento que faz sentido. Se o seu servidor atual dá conta depois do tuning, dizemos isso. Se não dá, a migração já vem orçada.
Como se contrata: pelo formulário da página de hospedagem gerenciada de Moodle ou pelo WhatsApp da equipe técnica. Contratos mensais, sem fidelidade longa, com cancelamento em 30 dias e devolução dos dados em formato padrão.
Conclusão: diagnostique, depois decida
Moodle lento é sintoma, não diagnóstico. Meça TTFB, conte queries, olhe as tarefas agendadas e rode o relatório de visão geral de desempenho antes de qualquer decisão de infraestrutura. Na maioria dos casos, o ganho está em configuração — e é grande. Quando o gargalo for mesmo capacidade, você terá número para justificar a troca, e não uma sensação.
Se quiser começar pelo diagnóstico, é o primeiro passo da nossa hospedagem gerenciada de Moodle: apontamos os gargalos do seu ambiente atual e a proposta de correção antes de qualquer contrato.
Perguntas frequentes
Por que meu Moodle está lento mesmo com um servidor bom?
Porque a maior parte da lentidão do Moodle mora na camada de software, não no hardware. Os suspeitos habituais são o theme designer mode ligado (que recompila CSS e JavaScript a cada requisição), o OPcache do PHP desativado, o cache MUC e as sessões gravando em disco, o cron rodando de hora em hora em vez de a cada minuto e o InnoDB com buffer pool minúsculo. Nenhum desses problemas melhora com uma máquina maior: você paga mais e continua com o mesmo tempo de resposta. O teste decisivo é simples — se o TTFB passa de dois segundos enquanto a CPU do servidor fica abaixo de 30%, o gargalo não é capacidade.
Como saber se o problema é o servidor ou a configuração do Moodle?
Correlacione tempo de resposta com uso de recursos no mesmo intervalo. Meça o TTFB de fora com curl, em pico e fora de pico, e ao mesmo tempo acompanhe CPU, memória e I/O wait com top, vmstat e iostat. Lentidão que só aparece no horário de maior acesso, com CPU saturada ou swap ativo, é dimensionamento. Lentidão constante, com a máquina ociosa, é configuração. Some a isso o relatório Visão geral de desempenho, em Administração do site → Relatórios, e o performance info no rodapé: número de queries por página acima de 200 aponta plugin ou bloco mal comportado, não falta de servidor.
Redis realmente deixa o Moodle mais rápido?
Sim, em dois pontos distintos. O primeiro são as sessões: a documentação do Moodle recomenda o driver Redis e desaconselha sessões em banco de dados para sites grandes, porque o desempenho é baixo. O segundo é o MUC, o cache de aplicação do Moodle, que por padrão vive no sistema de arquivos e vira I/O sob concorrência. Mover os dois para Redis reduz leituras de disco e de banco no caminho crítico de cada página. Em ambiente maior, vale separar as instâncias: sessões com política de eviction noeviction e cache de aplicação com allkeys-lru, cada uma com seu prefixo, para não haver conflito de chaves.
De quanto em quanto tempo o cron do Moodle deve rodar?
A cada minuto, e sempre por linha de comando, com php admin/cli/cron.php. É a recomendação da documentação oficial, e existe uma razão prática: o agendador de tarefas do Moodle decide a cada execução o que precisa rodar, então executar de hora em hora não economiza recurso, apenas atrasa tudo. Com cron atrasado, notificações não saem, o índice de busca fica desatualizado, a lixeira não esvazia e o recálculo de notas se acumula — e quando finalmente roda, dá um pico que derruba o site. Evite disparar o cron por HTTP: em instalação grande, consome memória demais.
Trocar de hospedagem resolve o problema de Moodle lento?
Resolve quando o gargalo é capacidade comprovada: CPU acima de 80% sustentados no pico, RAM saturada com swap ativo, I/O wait de dois dígitos ou banco e web disputando a mesma máquina com o buffer pool já no teto da memória. Fora desses casos, migrar sem diagnóstico apenas transporta o problema para uma fatura maior. A ordem correta é: aplicar o tuning de aplicação e banco, medir de novo e só então decidir. Se depois disso os números continuarem no vermelho, a troca é justificada — e nesse ponto você já sabe exatamente qual dimensionamento pedir, em vez de comprar um plano no escuro.
Posts relacionados
Backup do Moodle: a rotina que salva a instituição
Banco, moodledata e código: o que copiar, com que frequência e como provar que a restauração funciona antes do desastre chegar.

Hospedagem Moodle: Requisitos, Custos e Erros em 2026
PHP 8.3, cron a cada minuto e moodledata fora da pasta pública: o que separa o plano que aguenta semana de prova do que cai.
Migrar Moodle de Servidor Sem Perder Dados nem Parar o AVA
O roteiro de quem opera EAD: as três peças que precisam chegar juntas, o ensaio antes do dia D e a janela de corte medida em minutos.