Zabbix Server Poller 利用率告警处理
日期: 2026-06-17
环境: zabbix-k8s-01(K8s 单节点)
Zabbix 版本: 6.0.46
ENV
| 类别 | 版本/规格 |
|---|---|
| 操作系统 | Ubuntu 20.04.6 LTS |
| 内核 | 5.4.0-216-generic |
| Kubernetes | v1.29.10(单节点 control-plane) |
| 容器运行时 | containerd 1.6.28 |
| Zabbix Server | 6.0.46(镜像 zabbix/zabbix-server-pgsql:ubuntu-6.0-latest) |
| 部署方式 | Helm zabbix-4.4.1,命名空间 zabbix |
| 数据库 | PostgreSQL(Pod:zabbix-postgresql-0) |
| 硬件/资源 | 内存 16GB(可用约 3.2GB);LoadAvg 1.39 / 1.91 / 2.04 |
| Server Pod | zabbix-zabbix-server-54d944bc8f-xxxxx(2/2 Running) |
1. 问题现象
- Zabbix 告警:Zabbix server: Utilization of poller processes over 75%
- 自监控指标
zabbix[process,poller,avg,busy]持续 100% - 监控规模:37 台 Linux 客户机(基地A/基地B)+ Zabbix Server 自监控
2. 问题原因
2.1 定位推导过程
步骤 1:确认 Server 配置与进程
命令(zabbix-k8s-01):
POD="zabbix-zabbix-server-54d944bc8f-xxxxx"
kubectl exec -n zabbix "$POD" -c zabbix-server -- sh -c \
"grep -E 'StartPollers|StartHTTPPollers|Timeout' /etc/zabbix/zabbix_server.conf | head -n 10"
kubectl exec -n zabbix "$POD" -c zabbix-server -- sh -c \
"ps -eo pid,comm --no-headers | grep zabbix_server | wc -l"
关键输出:
# StartPollers=5 (全部注释,使用默认值 5)
# StartHTTPPollers=1
50 (zabbix_server 进程总数)
步骤 2:读取 poller 利用率与监控项规模
命令:
kubectl exec -n zabbix zabbix-postgresql-0 -- bash -c \
"PGPASSWORD=password psql -h 127.0.0.1 -U zabbix -d zabbix -c \"
SELECT to_timestamp(h.clock) AS time, h.value AS busy_pct
FROM items i JOIN history h ON i.itemid=h.itemid
WHERE i.key_='zabbix[process,poller,avg,busy]' ORDER BY h.clock DESC LIMIT 5;
\""
关键输出:
busy_pct = 100(连续多条)
监控项统计(初期全库 COUNT):
| 类型 | 数量 |
|---|---|
| 启用监控项 | 9320 |
| SNMP (type=20) | 2002 |
| Passive Agent (type=0) | 1917 |
| Simple check/ICMP | 403 |
注:初期全库统计含模板定义项,后续按主机类型拆分后才明确真实负载。
步骤 3:确认客户机 Agent 项类型
命令:
SELECT h.host,
SUM(CASE WHEN i.type=0 THEN 1 ELSE 0 END) AS passive_items,
SUM(CASE WHEN i.type=7 THEN 1 ELSE 0 END) AS active_items
FROM hosts h JOIN items i ON h.hostid=i.hostid
WHERE h.status=0 AND i.status=0 AND i.flags=0 AND i.type IN (0,7)
GROUP BY h.host ORDER BY passive_items DESC LIMIT 10;
关键输出(整改前):
8.8.238.31 | passive_items=39 | active_items=0
8.8.238.32 | passive_items=39 | active_items=0
...(所有客户机均为 39 passive / 0 active)
单台主机 39 个 passive 项示例:
Linux: CPU user time | system.cpu.util[,user] | 1m | type=0
Linux: Available memory | vm.memory.size[available] | 1m | type=0
Linux: Zabbix agent ping | agent.ping | 1m | type=0
...(共 39 项,均来自「Linux by Zabbix agent」被动模板)
步骤 4:排除 SNMP/ICMP 误认
按主机类型拆分:
SELECT CASE h.status WHEN 0 THEN 'monitored_host' WHEN 3 THEN 'template' END AS host_type,
SUM(CASE WHEN i.type=20 THEN 1 ELSE 0 END) AS snmp,
SUM(CASE WHEN i.type=3 AND i.key_ LIKE 'icmpping%' THEN 1 ELSE 0 END) AS icmp,
SUM(CASE WHEN i.type=0 THEN 1 ELSE 0 END) AS passive_agent,
SUM(CASE WHEN i.type=7 THEN 1 ELSE 0 END) AS active_agent,
COUNT(*) AS total
FROM hosts h JOIN items i ON h.hostid=i.hostid
WHERE i.status=0 AND i.flags=0 GROUP BY 1;
关键输出:
host_type | snmp | icmp | passive | active | total
template | 2002 | 295 | 474 | 182 | 7709 ← 仅模板定义,不采集
monitored_host | 0 | 0 | 0 | 1482 | 1615 ← 实际采集负载
整改后 poller 利用率:
busy_pct = 0(连续多条)
2.2 根因结论
| 项目 | 说明 |
|---|---|
| 直接原因 | 约 38 台客户机链接 「Linux by Zabbix agent」被动模板,每台 39 个 type=0 项 |
| 配置因素 | StartPollers=5(默认),无法承载约 1500 个 passive 项 |
| 排除项 | SNMP/ICMP 仅在模板层,不占 poller |
2.3 问题形成原因推测
运维在部署 Zabbix 自动发现(规则 morocco10.85.247.igozhang.cn,主机组 mo-srv)时,发现动作链接了官方默认被动模板 「Linux by Zabbix agent」;虽可能配置了 Agent ServerActive,但监控项类型仍为 Passive,Server 持续派 poller 轮询。约 38 台 × 39 项压满 5 个 poller,利用率 100% 触发告警。后期发现动作改为 Active 模板,但已有主机未自动更新,直至批量换模板后恢复。
3. 解决方案
3.1 治本:批量更换 Active 模板
操作路径: 配置 → 主机 → 筛选客户机 → 勾选 → 批量更新
| 操作 | 模板 |
|---|---|
| 取消链接 | Linux by Zabbix agent |
| 链接 | Linux by Zabbix agent active |
前提: Agent 配置 ServerActive=zabbix.igozhang.cn:10051,且 Hostname 与 Zabbix 主机名一致。
3.2 发现动作修正(新主机)
发现动作(匹配 8.8.247.*)→ 链接模板改为 「Linux by Zabbix agent active」。
3.3 验证命令
验证 Agent 项类型:
sudo timeout 10 bash -c '
POD=$(kubectl get pod -n zabbix -l app.kubernetes.io/name=zabbix-server -o jsonpath="{.items[0].metadata.name}")
DBENV=$(kubectl exec -n zabbix "$POD" -c zabbix-server -- sh -c "env | grep -E \"^POSTGRES_USER=|^POSTGRES_PASSWORD=|^POSTGRES_DB=\"")
eval "$DBENV"
kubectl exec -n zabbix zabbix-postgresql-0 -- bash -c "PGPASSWORD=\"$POSTGRES_PASSWORD\" psql -h 127.0.0.1 -U \"$POSTGRES_USER\" -d \"$POSTGRES_DB\" -c \"
SELECT SUM(CASE WHEN i.type=0 THEN 1 ELSE 0 END) AS passive,
SUM(CASE WHEN i.type=7 THEN 1 ELSE 0 END) AS active
FROM items i JOIN hosts h ON i.hostid=h.hostid
WHERE h.status=0 AND i.status=0 AND i.flags=0 AND i.type IN (0,7);
\""
'
期望: passive=0,active≈1482
验证 poller 利用率:
sudo timeout 10 bash -c '
POD=$(kubectl get pod -n zabbix -l app.kubernetes.io/name=zabbix-server -o jsonpath="{.items[0].metadata.name}")
DBENV=$(kubectl exec -n zabbix "$POD" -c zabbix-server -- sh -c "env | grep -E \"^POSTGRES_USER=|^POSTGRES_PASSWORD=|^POSTGRES_DB=\"")
eval "$DBENV"
kubectl exec -n zabbix zabbix-postgresql-0 -- bash -c "PGPASSWORD=\"$POSTGRES_PASSWORD\" psql -h 127.0.0.1 -U \"$POSTGRES_USER\" -d \"$POSTGRES_DB\" -c \"
SELECT to_timestamp(h.clock) AS time, h.value AS busy_pct
FROM items i JOIN history h ON i.itemid=h.itemid
WHERE i.key_='\''zabbix[process,poller,avg,busy]'\'' ORDER BY h.clock DESC LIMIT 5;
\""
'
期望: busy_pct < 75(实测 0%)
4. 后续预防措施
运维
| 建议 | 说明 |
|---|---|
| 自动发现模板统一用 Active | 发现动作链接 Active 模板 |
| 换模板后验证 | 查 type=0/7 分布及 poller 利用率 |
| 已有主机变更 | 修改发现动作不更新已有主机,须批量处理 |
| 扩容预留 | 500 台规模预备 StartPollers 10–15 |
开发/平台
| 建议 | 说明 |
|---|---|
| 标准化模板 | 定制模板默认 Zabbix agent (active) 类型 |
| 文档区分概念 | 「Agent ServerActive 配置」≠「监控项 Active 类型」 |
| Helm values 固化 | 大规模 passive 场景预设 ZBX_STARTPOLLERS |
| 告警联动 | poller >75% 时排查 monitored_host 上 passive 项数量 |
5. 配置参数建议
| 参数 | 当前值 | 建议值 | 原因/后果 |
|---|---|---|---|
| 客户机模板 | Passive 模板 | Active 模板 | Passive 占 poller;Active 不占 |
StartPollers |
5 | 5(当前);500 台 10–15 | 整改后 0%,暂不需调;引入 Passive/ICMP/SNMP 时需加大 |
StartPingers |
1 | 1;链 ICMP 模板后 5–10 | ICMP 走 pinger |
StartHTTPPollers |
1 | 1;有 HTTP 监控 5 | 按 HTTP 项数量调整 |
| 发现动作模板 | 已改 Active | 保持 Active | 新主机不引入 Passive |
6. 处理结果
| 指标 | 整改前 | 整改后 |
|---|---|---|
| Poller 利用率 | 100% | 0% |
| 已启用主机 Passive 项 | ~1482 | 0 |
| 已启用主机 Active 项 | 0 | 1482 |
| 告警状态 | 触发 | 已消除 |
结论: 批量更换 Active 模板后问题已解决,无需调整 StartPollers。