sexta-feira, 17 de outubro de 2025

Zabbix — da Migração ao Fine-Tuning - capítulo 5

Zabbix sob pressão: resolvendo travas, timeouts e queries lentas

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 DELETE massivo — prefira partições ou rename swap.
  • Faça ANALYZE e OPTIMIZE TABLE em períodos de baixa carga.
  • Mantenha slow_query_log ativo 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.

🔗 Confira mais artigos ou volte para a página inicial.

Gostou deste conteúdo?

Siga o Sysadmin Urbano para mais artigos técnicos sobre Infraestrutura, SysOps e DevOps.

Voltar para a página inicial

Nenhum comentário:

Postar um comentário