igozhang

——

    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=0active≈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。

    MP3