Publicado por Sysadmin Urbano | Infraestrutura, SysOps e DevOps
Um guia prático para quem vive na linha de frente da operação de sistemas.
Zabbix sob pressão: resolvendo travas, timeouts e queries lentas
Capítulo 5 da série “Zabbix — da Migração ao Fine-Tuning” no Sysadmin Urbano.
Mesmo depois de otimizar e particionar o banco, é inevitável: em algum momento o Zabbix vai trabalhar no limite e começar a mostrar sintomas de pressão — travas, timeouts e queries lentas. Este capítulo é o manual de sobrevivência para quando o banco “agarra” e o Zabbix Server não responde como deveria.
“Quando o Zabbix fica lento, quase nunca é o Zabbix — é o banco implorando por ajuda.” Este guia é essa ajuda.
1) Entendendo o sintoma: lock, timeout ou lentidão?
- Lock: uma sessão está impedindo outra de alterar a tabela. Sintoma clássico:
Lock wait timeout exceeded. - Timeout: uma operação ultrapassou o tempo máximo de espera definido pelo MySQL (
innodb_lock_wait_timeout). - Lentidão: queries que antes rodavam em segundos passam a demorar minutos — normalmente reflexo de índices desatualizados ou tabelas inchadas.
Em ambientes grandes, os três problemas podem ocorrer simultaneamente.
2) Diagnóstico rápido: quem está travando?
2.1) Identificando bloqueios no MySQL
SELECT ml.LOCK_STATUS, ml.LOCK_TYPE, ml.LOCK_MODE,
ps.ID AS thread_id, ps.USER, ps.HOST, ps.TIME, ps.STATE, ps.INFO
FROM performance_schema.metadata_locks ml
JOIN performance_schema.threads th ON ml.OWNER_THREAD_ID = th.THREAD_ID
JOIN information_schema.PROCESSLIST ps ON th.PROCESSLIST_ID = ps.ID
WHERE ml.OBJECT_SCHEMA = 'zabbix'
AND ml.LOCK_STATUS = 'GRANTED'
ORDER BY ps.TIME DESC;
Quando encontrar uma sessão que mantém lock há muito tempo, elimine-a com:
KILL <thread_id>;
2.2) Listando queries lentas
Ative o log de queries lentas para entender onde o gargalo está.
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 3;
SHOW VARIABLES LIKE 'slow_query_log_file';
O arquivo registrado mostrará as consultas mais demoradas. Muitas vezes o culpado é o próprio Housekeeper.
3) Recuperando tabelas bloqueadas
3.1) History travada durante TRUNCATE
Se você receber Lock wait timeout exceeded ao tentar truncar:
-- Ver quem está segurando o lock
SELECT * FROM information_schema.PROCESSLIST WHERE STATE LIKE '%lock%';
-- Encerrar a sessão problemática
KILL <id>;
-- Repetir TRUNCATE
TRUNCATE TABLE zabbix.history;
Caso o TRUNCATE ainda não funcione, prefira o método de rename swap:
CREATE TABLE zabbix.history_tmp LIKE zabbix.history;
RENAME TABLE zabbix.history TO zabbix.history_old,
zabbix.history_tmp TO zabbix.history;
DROP TABLE zabbix.history_old;
Essa troca é quase instantânea e evita o bloqueio prolongado.
4) Lentidão geral: verificando índices e estatísticas
4.1) Recriar estatísticas de tabela
ANALYZE TABLE zabbix.history;
ANALYZE TABLE zabbix.trends;
4.2) Verificar índices ausentes
O Zabbix já cria índices padrão, mas após migrações antigas é comum faltar algum.
SHOW INDEX FROM zabbix.history;
-- Índices recomendados:
ALTER TABLE zabbix.history
ADD INDEX idx_clock (clock),
ADD INDEX idx_itemid (itemid);
5) Consultas úteis para auditoria
5.1) Tabelas mais pesadas
SELECT table_name,
ROUND((data_length + index_length) / 1024 / 1024, 2) AS tamanho_mb
FROM information_schema.tables
WHERE table_schema = 'zabbix'
ORDER BY tamanho_mb DESC
LIMIT 10;
5.2) Status atual do InnoDB
SHOW ENGINE INNODB STATUS\G
5.3) Sessões e queries abertas
SELECT id, user, host, db, command, time, state, info
FROM information_schema.PROCESSLIST
ORDER BY time DESC;
6) Timeouts e parâmetros críticos
6.1) Ajustes no MySQL
Revise estes parâmetros em /etc/my.cnf:
[mysqld]
innodb_lock_wait_timeout = 120
wait_timeout = 600
max_connections = 500
innodb_flush_log_at_trx_commit = 2
innodb_buffer_pool_size = 4G
innodb_io_capacity = 4000
6.2) Ajustes no Zabbix Server
Verifique os valores em /etc/zabbix/zabbix_server.conf:
CacheSize=1G
HistoryCacheSize=512M
HistoryIndexCacheSize=256M
TrendCacheSize=128M
StartDBSyncers=8
StartPollers=50
7) Boas práticas de manutenção
- Evite
DELETEmassivo — prefira partições ou rename swap. - Faça ANALYZE e OPTIMIZE TABLE em períodos de baixa carga.
- Mantenha
slow_query_logativo em ambientes de produção. - Monitore os tempos de resposta do banco com
SHOW GLOBAL STATUS LIKE 'Threads_running'. - Agende o script de limpeza de partições (do capítulo anterior) com logs centralizados.
8) Conclusão
Travas e lentidão são sinais de que o Zabbix está crescendo — e isso é bom. O segredo é reconhecer cedo quando o banco pede alívio, aplicar técnicas de particionamento e manter os índices saudáveis. O resultado: menos sustos e mais estabilidade.
Sobre o Sysadmin Urbano
O Sysadmin Urbano nasceu da vivência real no front das operações de infraestrutura moderna. Aqui falamos de servidores, containers, automação, boas práticas e também dos desafios invisíveis da rotina de quem mantém sistemas vivos. Sem fórmulas mágicas, sem tutoriais pela metade — apenas conteúdo prático, direto e feito para quem sabe que a TI é tanto técnica quanto sobrevivência.
Gostou deste conteúdo?
Siga o Sysadmin Urbano para mais artigos técnicos sobre Infraestrutura, SysOps e DevOps.

Nenhum comentário:
Postar um comentário