这个坑值得记一笔。Zabbix 6.0 监控六百多台主机,最近告警延迟十几分钟,报表页面的队列里一直有几千个监控项在排队,服务器 CPU 却只有 15%。
刚开始盯着「数据库写入慢,history 表没有分区,单表已经上亿行」,折腾了半个多小时,排掉了。
原因不止一个,得分开看。StartPollers 还是默认的 5,轮询能力跟不上监控项数量;有几个脚本类型的监控项自己超时,把 poller 全占住;Housekeeper 每小时跑一次,和采集抢数据库资源。
第一件事是看队列里积压的是哪类监控项
zabbix_get -s 127.0.0.1 -k 'zabbix.stats[127.0.0.1,10051]'
再往下把轮询进程按 CPU 核数调大
grep -n '^StartPollers' /etc/zabbix/zabbix_server.conf
接着找出执行超时的自定义监控项
grep -i 'timeout' /var/log/zabbix/zabbix_server.log | tail -20
等前面都确认过,再重启服务后观察队列是否回落
systemctl restart zabbix-server && tail -f /var/log/zabbix/zabbix_server.log
怎么算真的好了,看的是同一批现象。监控页面的队列长度降到一百以内,新产生的告警在 30 秒内送达,history 表的写入延迟明显下降。
这里还有个坑。先解决慢监控项再谈加进程,加 poller 只是把等待摊薄;历史数据表一定要做分区,否则数据量上来后数据库会先扛不住。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。
