用了这么久 Zabbix,你真的懂它的底层吗?
从进程架构到数据链路,一文吃透 Zabbix 核心工作原理
很多运维同学日常使用 Zabbix,加主机、套模板、配告警都操作得很熟练,但一旦遇到 Server 性能拉满、监控数据断更、告警莫名延迟之类的问题,就容易摸不着头脑。本质上是只掌握了「怎么配置」,没搞懂「它底层怎么跑」。
Zabbix 能支撑从几十台到上万台主机的监控规模,靠的不是堆砌资源,而是一套经过二十多年打磨的底层架构设计。本文严格基于 Zabbix 官方文档,从进程模型、内存设计、采集调度、数据处理、告警引擎到时序存储,逐层拆解 Zabbix 的核心工作原理,帮你建立从表层配置到底层逻辑的完整认知。
一、内核根基:多进程 + 共享内存的 Server 架构
Zabbix Server 的底层设计核心,是预派生多进程模型 + 共享内存全局缓存。它没有采用多线程架构,而是用独立进程实现职能隔离,用共享内存实现数据共享,既避免了线程锁的性能损耗,也保证了单进程故障不拖垮整体服务。
1.1 预派生多进程模型:各司其职,故障隔离
Server 启动时,主进程(supervisor)会先读取配置文件、初始化系统资源,然后按照配置参数 fork 出一批功能独立的子进程。主进程核心职责有二:一是协调所有进程的启动与关闭,监控其就绪状态;二是子进程异常退出时自动重启,保障服务整体可用性。
所有子进程按职能严格分工,互不阻塞,核心分为六大类:
1. 数据采集类进程:所有监控数据的入口
负责各类协议、各类模式的数据采集任务,是整个系统的数据输入端。
-
agent poller:Zabbix 5.0 新增的异步 Agent 专属轮询进程,基于 IO 多路复用实现非阻塞采集,仅负责 Zabbix Agent 被动模式检查,主动向 Agent 10050 端口发起请求。单进程可同时承载上千个并发请求(由
MaxConcurrentChecksPerPoller控制上限),资源利用率远高于同步轮询,是 Agent 被动采集的核心主力,对应配置参数StartAgentPollers。 -
poller(通用同步轮询进程):传统同步阻塞型采集进程,单进程同一时间只能处理 1 个采集任务,负责所有未做异步优化的被动采集项,包括 IPMI 硬件监控、ODBC 数据库直连、简单检查(Simple checks)等,不承载 Agent 被动检查的主力流量,对应配置参数
StartPollers。生产调优提示:Agent 被动采集出现延迟时,优先查看 agent poller 繁忙率与并发使用率;非 Agent 类被动采集延迟时,再排查通用 poller 负载;主动模式数据上报积压时,关注 trapper 进程数量与繁忙度。
-
trapper:数据接收进程,监听 10051 端口,接收 Agent 主动模式上报数据、zabbix_sender 推送数据、Proxy 上报数据,对应配置参数
StartTrappers。 -
icmp pinger:专门处理 ICMP Ping 连通性、丢包、延迟类监控项,采用异步批量探测机制,对应配置参数
StartPingers。 -
http poller:Web 场景监控与 HTTP 接口检查,模拟 HTTP 请求采集响应时间、状态码、内容匹配等数据,对应配置参数
StartHTTPPollers。 -
java poller:JMX 采集代理进程,通过 Zabbix Java Gateway 间接获取 Java 应用的 JMX 指标,对应配置参数
StartJavaPollers。 -
ipmi manager / ipmi poller:服务器硬件 IPMI 接口监控,采集电源、温度、风扇等硬件数据,采用 manager-worker 架构。
-
odbc poller:直连数据库执行 SQL 查询,采集数据库层面的业务与性能指标,归属同步采集体系。
-
history poller:处理需要读取数据库历史值的计算型监控项(如计算项、聚合项)。
-
unreachable poller:专门处理已标记为不可达设备的探测任务,执行降级后的低频探测,避免故障主机占用正常采集资源。
-
vmware collector:VMware 数据采集器,负责从 VMware 服务中批量采集虚拟化资源数据,采用 manager-worker 架构。
-
internal poller:内部检查专用轮询进程,专门处理
zabbix[*]格式的 Server 自监控指标,不占用通用采集进程资源。 -
snmp poller:Zabbix 7.0 新增的独立异步 SNMP 采集进程,专门处理 SNMP get/walk 类监控项,采用异步非阻塞模型,大幅提升网络设备采集效率,对应配置参数
StartSNMPPollers。
2. 数据处理与入库类进程:数据清洗与落库
负责原始数据的预处理、计算与持久化存储。
-
preprocessing manager / preprocessing worker:数据预处理进程,按配置执行正则提取、JSONPath 取值、单位换算、自定义脚本等转换操作
-
history syncer:历史数据批量写入进程,将处理完成的监控数据攒批后批量插入数据库,是写入性能的核心瓶颈点
-
alert syncer:告警事件数据库写入进程,负责将事件、告警记录持久化到数据库
重要澄清:不存在独立的「触发器计算进程」与「趋势同步进程」。触发器表达式的计算在数据预处理完成、写入值缓存后实时 inline 执行;趋势数据的聚合由 history syncer 在数据流入时同步完成,均属于数据处理流水线的内嵌逻辑,而非独立进程轮询执行。
3. 告警与动作类进程:通知与升级执行
负责告警事件的分发、通知投递与升级逻辑。
- alert manager:告警队列管理器,统一管理待发送的告警任务,做去重、排序、优先级处理
- alerter:告警通知发送进程,调用邮件、钉钉、企业微信等媒介接口,实际投递告警消息
- escalator:告警升级进程,按动作配置的时间阶梯执行升级操作,超时未处理的告警自动上报给更高层级
4. 发现与自动化类进程:自动纳管能力
负责网络发现、低级别自动发现等自动化运维能力。
- discovery manager / discovery worker:网络自动发现,按配置扫描 IP 网段,探测存活主机与服务
- lld manager / lld worker:低级别自动发现(LLD),处理主机内的磁盘、网卡、进程等自动发现规则
- proxy poller:被动模式下的 Proxy 数据拉取,主动向 Proxy 索要采集数据
5. 配置与状态管理类进程:缓存与状态维护
负责共享内存中的配置数据同步、主机状态管理。
- configuration syncer / configuration syncer worker:配置同步核心进程,定时从数据库拉取最新配置,更新共享内存中的配置缓存,是 Web 配置生效的关键
configuration syncer worker为 Zabbix 8.0 新增拆分进程,专门负责解析监控项名称中的用户宏等精细化操作;7.0 版本中该部分逻辑由 configuration syncer 统一执行,无独立子进程 - availability manager:主机可用性管理器,更新共享内存中各主机的可达状态、连续失败次数、最后探测时间
6. 后台运维类进程:系统内部保障
负责系统自身的运维、清理与高可用管理。
- housekeeper:数据清理进程,按保留周期删除过期的历史数据、趋势数据、事件与告警记录
- trigger housekeeper:专门用于删除已被删除触发器生成的问题和事件
- timer:定时调度进程,处理维护周期、时间相关的触发器等定时任务
- task manager:任务管理进程,处理远程执行类任务,如关闭问题、确认告警、立即检查、远程命令
- ha manager:高可用集群管理进程(Zabbix 6.0+),负责 Server 集群节点的状态同步与主备切换
1.2 共享内存缓存体系:把性能拉满的核心设计
如果每次采集、每次告警计算都去查数据库,再强的数据库也扛不住上万监控项的并发访问。Zabbix 的解决方案是:把所有高频访问的数据全部加载到共享内存里,所有进程直接读内存,尽量不碰数据库。这是 Zabbix 支撑大规模监控的性能基石。
基于官方配置参数,共享内存中包含四类核心缓存:
-
配置缓存(Configuration Cache)
- 对应参数:
CacheSize,默认 32M(6.0+),最大支持 64G - 存储内容:主机、监控项、触发器、模板、动作、用户权限等所有配置数据全量加载
- 更新机制:由
configuration syncer进程定时同步,默认每 60 秒执行一次增量更新 - 作用:所有采集调度、触发器计算、工作进程(Poller、Trapper 等)都直接读取内存配置,全程不访问数据库
- 对应参数:
-
值缓存(Value Cache)
- 对应参数:
ValueCacheSize,默认 8M,最大支持 64G - 存储内容:监控项的最近历史采样值,采用 LRU 淘汰策略
- 作用:触发器计算、趋势聚合、数据预处理需要的历史值,全部从值缓存里直接取,彻底避免高频查询数据库的开销,是 Server 性能调优的核心参数
- 对应参数:
-
历史缓存(History Cache)
- 对应参数:
HistoryCacheSize - 存储内容:预处理完成后、尚未写入数据库的历史数据队列
- 作用:作为数据写入数据库前的缓冲层,实现采集与入库的解耦,支撑批量写入机制。
history syncer进程批量将缓存中的数据写入数据库历史表,显著降低数据库写入频率,高频采集场景下提升效果尤为明显。若 History Cache 使用率长期接近 100%,说明写入速度跟不上采集速度,需要增加 history syncer 进程数或优化数据库性能。
- 对应参数:
-
趋势缓存(Trend Cache)
- 对应参数:
TrendCacheSize,默认 4M - 存储内容:当前小时内各监控项的趋势聚合中间值(最小值、最大值、数值总和、计数)
- 作用:由 history syncer 实时维护,小时结束时一次性落库,避免回查历史表做聚合,大幅降低数据库压力;同时提升前端长周期趋势图表的查询效率。
- 对应参数:
二、采集调度底层:监控任务是怎么分发执行的
成千上万个监控项,到底是按什么规则、由谁、在什么时候执行的?
2.1 被动模式:时间轮驱动的任务队列
被动模式的采集调度权完全在 Server 侧,底层基于下一次执行时间队列实现,并非简单的定时轮询。
-
每一个被动类型的监控项,在 Server 的共享内存配置缓存中都会维护一个
nextcheck时间戳,记录下一次计划采集的时间。版本说明:Zabbix 6.4 及更早版本中,该字段同时持久化存储在
items数据库表中;7.0 版本起已从数据库表移除,改为纯内存运行时维护,不再落库。 -
所有被动监控项按
nextcheck时间升序排列,形成全局有序的采集任务队列。 -
对应采集进程(agent poller、snmp poller、通用 poller 等)空闲时,从队列头部取出已到期的任务执行采集。
-
采集完成后,根据监控项的更新间隔
delay计算出新的nextcheck时间,重新放回队列对应位置。
这种设计的核心优势是任务被均匀打散,不会出现同一时刻大量任务集中触发的性能尖峰,整体负载非常平稳。
2.2 主动模式:Agent 本地自治 + 批量上报
主动模式下,采集调度权下放到 Agent 侧,Server 只负责提供配置列表和接收数据。
- Agent 启动后先从 Server 拉取自身对应的全部主动监控项列表,在本地维护每个监控项的采集定时器
- Agent 用单个进程串行执行所有采集任务,按时间顺序逐个采集
- 采集结果不会立刻上报,而是先写入本地内存缓冲区,满足三个条件之一才批量发送:
- 缓冲区容量达到
BufferSize设定的阈值 - 距离上次上报时间达到
BufferSend设定的最大间隔 - Agent 正常退出前强制上报所有缓存数据
- 缓冲区容量达到
相比被动模式的单条请求响应,主动模式的批量上报大幅减少了 TCP 连接建立开销,也显著降低了 Server 侧的压力。
2.3 不可达主机降级:自动节流的容错设计
Zabbix 底层内置了主机可用性状态机,避免故障主机占用过多采集资源:
- 连续多次采集失败后,主机自动标记为「不可达」,由专门的
unreachable poller进程处理,探测间隔从正常频率大幅拉长 - 不可达期间只发送轻量探测包,一旦恢复连通就自动回到正常采集频率
- 所有状态实时同步到共享内存的可用性缓存,所有采集进程全局共享
三、数据处理流水线:从采集到入库的完整旅程
采集到的原始数据,并不是直接写入数据库。它会经过一条标准化的内存处理流水线,全程尽可能少地访问数据库,最终才批量落库。
3.1 完整处理链路
基于官方预处理技术文档,数据从采集到落库的标准链路如下:
原始数据采集 → 基础校验 → IPC 传递给预处理管理器 → 数据预处理 → 写入历史缓存 → 触发器实时计算 → history syncer 批量入库 → 趋势缓存实时累加
- 基础校验:采集进程拿到数据后,先做合法性检查——数据类型是否匹配、监控项是否存在、主机是否启用,非法数据直接丢弃
- IPC 传递:通过基于套接字的进程间通信机制,将数据从采集进程传递给预处理管理器,采集进程立即返回继续采集,无需等待处理结果
- 数据预处理:按照监控项配置的预处理规则依次执行,比如正则提取、JSONPath 取值、单位换算、自定义脚本处理、数据节流、依赖项处理等,全程在内存中完成
- 写入历史缓存:预处理完成的数据写入共享内存的历史缓存区,等待批量入库
- 触发器实时计算:新值写入缓存的同时,立即触发关联的所有触发器重新计算,属于事件驱动模式,而非定时轮询
- 批量入库:由
history syncer进程定期将历史缓存中的数据攒批后,一次性批量写入数据库 - 趋势缓存更新:数据入库的同时,history syncer 同步更新趋势缓存中的当前小时聚合中间值。
3.2 批量入库:用攒批换性能
历史数据的写入由 history syncer 进程专门负责,它不会来一条写一条,而是攒够一批再一次性批量插入数据库。
- 批量写入大幅减少了数据库的事务次数和 IO 开销,是 Zabbix 应对高并发写入的核心优化手段
StartHistorySyncers参数可调整该进程的数量,是写入性能调优的关键参数
3.3 趋势聚合:内存实时累加,整点落库
常见误区纠正:趋势数据不是每小时从历史表中查询聚合生成,该方式会给数据库带来巨大查询压力。
Zabbix 实际采用内存实时累加机制:
- 每条监控数据流入时,history syncer 同步更新趋势缓存中对应监控项的当前小时聚合值(min/max/sum/count)
- 每小时整点时,history syncer 将缓存中完整的上一小时趋势数据一次性写入 trends 表
- 触发落库还有两个兜底时机:Server 正常停止时、小时结束前 5 分钟仍无新数据的低频监控项
这种设计全程无需回查历史表,完全在内存中完成计算,数据库压力极低。
四、告警引擎底层:触发器是怎么工作的
很多人以为触发器是定时去数据库查数据判断的,实际上完全不是。Zabbix 的告警引擎是一套全内存、事件驱动的计算体系,效率和实时性都远高于轮询方案。
4.1 全内存计算:不靠数据库查历史值
触发器表达式的计算全程在内存中完成,不查询数据库:
- 当监控项有新值到达时,直接从共享内存的值缓存中取出表达式所需的所有历史值
- 解析表达式并计算结果,支持
avg、max、min、last、count等各类函数,所有函数运算都基于缓存数据 - 整个过程纳秒级完成,完全不会给数据库带来任何查询压力
4.2 触发器状态机:只在状态变更时生成事件
每个触发器维护一个独立的状态机,只有状态发生跳变时才会生成事件,从根源上避免重复告警:
- 两种基础状态:OK(表达式结果为假,指标正常)、PROBLEM(表达式结果为真,指标异常)
- 只有状态从 OK 变为 PROBLEM,或从 PROBLEM 变回 OK 时,才会生成对应事件。中间连续的相同状态不会重复触发
- 支持「连续 N 次异常才切换状态」的防抖逻辑,过滤单次数据抖动导致的误告警
4.3 依赖抑制:从根源避免告警风暴
触发器依赖关系采用向上递归检查机制,是应对告警风暴的核心设计:
- 当某个触发器触发告警时,系统会递归检查它所有上级依赖触发器的状态
- 如果父级触发器已经处于异常状态(比如核心交换机宕机),就自动抑制下游所有子触发器的告警通知,只保留事件记录不发消息
- 这样核心设备故障时,不会收到上百条下游主机的连通性告警,运维人员能第一时间定位根因
五、时序存储底层:海量监控数据怎么存最划算
监控数据是典型的时序数据,写入量大、查询模式固定。Zabbix 在存储层做了大量针对性优化,而不是简单用单表存储。
所有数据最终存储在关系型数据库中。关键表包括:
- hosts / items / triggers:配置信息。
- history / history_str / history_text / history_log:原始历史数据(按数据类型分表)。
- trends / trends_uint:趋势数据(按小时聚合)。
- events / alerts:事件与告警记录。
5.1 按类型分表:为监控场景量身定制
Zabbix 没有把所有监控值存在一张表里,而是按数据类型拆分成 5 张历史表:
history:浮点型数值(如 CPU、内存使用率),行长度固定,写入查询效率最高history_uint:无符号整数(如连接数、进程数)history_str:255 字符以内的短字符串history_text:长文本数据history_log:日志类数据,附带时间戳与日志级别
Syncer 进程从 History Cache 批量读取数据,构造 INSERT 语句写入以上表。为提升性能,支持数据库分区和批量插入。
分表的核心优势:数值类数据表行长度固定,索引效率更高;不同类型数据可以独立设置保留周期,灵活控制存储成本。
5.2 联合索引设计:贴合监控查询模式
所有历史表的主键都采用 (itemid, clock) 联合索引,这是完全贴合监控查询场景的设计:
itemid是监控项唯一 ID,作为前导列可以快速定位单个监控项的全部数据clock是时间戳,用于时间范围过滤- 监控数据 99% 的查询都是「指定某个监控项 + 指定时间范围」,这套索引组合刚好命中所有常见查询模式,查询效率最优
5.3 趋势数据聚合
对应历史表的数值类型,趋势数据也分为两张表:
trends:浮点型数值的小时级聚合数据trends_uint:无符号整数的小时级聚合数据
数据流入时,在 history syncer 进程中同步完成趋势缓存的实时累加,每张表存储每个监控项每小时的最小值、最大值、平均值、计数,占用空间远小于原始历史数据,保留周期更长。前端查看超过 1 天的大时间范围图表时,Zabbix 会自动切换为趋势数据渲染,避免查询海量原始数据,大幅提升页面加载速度。
5.4 两种过期清理方案
监控数据持续增长,必须有高效的过期清理机制,Zabbix 提供了两种方案:
-
传统 Housekeeper 模式
由housekeeper进程定时逐行删除过期数据。优点是无需数据库特殊配置,开箱即用;缺点是大数据量下删除操作会产生大量 IO,甚至影响正常写入,只适合小规模环境。 -
表分区模式
按时间对历史表、趋势表做分区(按天/周/月),过期数据直接通过DROP PARTITION删除。这是元数据操作,几乎没有 IO 消耗,清理效率提升百倍以上,是中大规模环境的标准方案。Zabbix 6.0 之后官方也提供了原生分区管理支持。
六、Agent 端内部运行机制
Zabbix 官方提供两代 Agent 实现,二者对外协议兼容,但底层进程架构完全不同:传统 C 语言版 Agent 1 采用多进程模型,Go 语言版 Agent 2 采用单进程多协程模型。
6.1 Agent 1(zabbix_agentd):多进程架构
传统 Zabbix Agent 1 采用预派生多进程设计,启动后包含四类进程,可通过启动日志直接验证:
agent #0 started [main process]
agent #1 started [collector]
agent #2 started [listener #1]
agent #3 started [listener #2]
agent #4 started [listener #3]
agent #5 started [active checks #1]
-
listener 进程
- 数量由
StartAgents参数控制,默认 3 个 - 监听 10050/TCP 端口,每个进程独立处理 Server 发起的被动检查请求
- 被动模式的并发处理能力直接受此参数限制
- 数量由
-
collector 进程
- 固定 1 个,不可配置数量
- 后台常驻,周期性预采集 CPU、磁盘等系统基础指标并缓存
- 主、被动模式均可复用缓存数据,避免每次请求都重复读取系统文件,降低系统调用开销
-
active checks 进程
-
固定 1 个,不可配置数量
-
主动模式的核心进程,全链路负责:从 Server 拉取监控项配置、按间隔调度采集、管理本地内存缓冲区、批量上报数据
澄清:不存在独立的「Sender 发送进程」,主动模式的采集、缓冲、上报逻辑均由 active checks 进程串行完成。
-
6.2 Agent 2(zabbix_agent2):单进程协程架构
Zabbix Agent 2 基于 Go 语言重写,采用单进程 + 多协程的并发模型,整体只有一个主进程,所有功能模块以 Goroutine 协程方式在内部运行,ps 命令看不到独立子进程。
- 被动检查:由内部协程监听 10050 端口,协程级并发处理 Server 请求,无需预派生多个进程
- 主动检查:由内部协程负责配置拉取、任务调度、批量上报,支持插件级并发控制
- 插件化架构:所有指标采集由插件实现,不同插件的检查可并发执行,单个插件的并发上限可通过容量参数配置
- 优势:内存占用更稳定,上下文切换开销更低,原生支持长连接复用,适合大规模、插件化的监控场景
6.3 两类监控项的实现差异(两代 Agent 通用)
- 内建 key:由 Agent 原生代码直接实现,通过系统调用读取
/proc、/sys等内核接口获取数据,性能极高,如system.cpu.load、vfs.fs.size等。 - UserParameter 自定义参数:用户自定义的外部命令或脚本,执行时 Agent 会 fork 子进程(Agent 1)或启动协程调用外部程序(Agent 2),执行超时由
Timeout参数控制(默认 3 秒)。大量执行缓慢的自定义参数会长时间占用资源,导致采集排队,需合理规划与控制超时。
七、通信协议底层:Server 与 Agent 的交互规范
Zabbix 采用基于 TCP 的私有二进制协议,而非 HTTP 之类的通用协议,核心是为了极致的传输效率。
7.1 ZBXD 私有协议通用格式
所有 Zabbix 协议报文都有统一的头部结构,头部所有数字均采用小端序存储:
| 字段 | 标准包长度 | 大包长度 | 说明 |
|---|---|---|---|
| 协议标记 | 4 字节 | 4 字节 | 固定为 ZBXD 四个字符,用于快速识别协议 |
| 协议标志位 | 1 字节 | 1 字节 | 0x01=标准协议;0x02=压缩模式;0x04=大包模式 |
| 数据长度 | 4 字节 | 8 字节 | 后续数据体的字节长度 |
| 保留字段 | 4 字节 | 8 字节 | 压缩模式下存储未压缩数据长度;非压缩模式为 0 |
| 数据体 | N 字节 | N 字节 | JSON 格式的业务数据 |
从 Zabbix 4.0 开始,默认启用压缩模式,网络流量可降低约 10 倍,CPU 开销可忽略不计;大包模式主要用于 Proxy 配置同步,最大支持 16GB 数据包。
7.2 两种模式的交互差异
- 被动模式:Server 主动向 Agent 10050 端口发起连接,发送包含监控项 key 的请求,Agent 采集后返回结果,单次连接完成一次交互。
- 主动模式:Agent 主动向 Server 10051 端口发起连接,包含两类核心请求:
- 配置拉取请求:发送
active checks指令,携带主机名,Server 返回该主机的所有主动监控项列表与参数。 - 数据上报请求:发送
agent data指令,批量携带多条监控数据,一次连接可以传输上百条数据,传输效率远高于被动模式。
- 配置拉取请求:发送
八、核心设计哲学总结
拆解完整个底层链路,回头看 Zabbix 的设计思路非常清晰,所有机制都围绕「大规模、高可靠、高性能」三个目标展开,核心可以总结为五点:
- 内存优先:能放内存的绝不查数据库,用共享内存承载所有高频访问数据,把数据库的压力降到最低。
- 批量处理:数据写入、配置同步、数据上报全都做批量,用攒批换取更低的 IO 开销和连接成本。
- 事件驱动:触发器计算、状态变更都由新数据到达触发,而非定时轮询,兼顾了实时性和资源效率。
- 故障容错:进程守护、主机自动降级、本地数据缓存,多层机制保障局部故障不影响整体服务。
- 分层存储:原始历史数据 + 聚合趋势数据两层存储,在查询精度和存储成本之间找到最优平衡。
九、生产环境性能调优核心逻辑
在实际运维中,Zabbix 性能瓶颈按出现概率从高到低依次为:数据库 I/O 与写入性能 > 共享内存缓存不足 > 采集/处理进程资源不足 > 架构容量上限。调优必须遵循「先定位根因、再针对性优化」的核心原则,禁止盲目调大所有进程数;官方推荐基于 Zabbix 自监控指标(进程繁忙率、队列长度、缓存使用率)做决策,而非凭经验统一加量。
1. 采集侧调优:按类型匹配进程,不盲目加量
不存在“小集群统一调高 StartPollers”的通用规则,需根据采集类型精准定位瓶颈、对应调整:
-
Agent 被动采集延迟:优先调整
StartAgentPollers(异步 Agent 专属进程)与MaxConcurrentChecksPerPoller(单进程并发上限),这是 Agent 被动采集的核心调优参数;通用StartPollers不承载 Agent 被动检查主力流量,盲目调大无收益。- 查看 agent poller 繁忙率:
zabbix[process,"agent poller",avg,busy] - 查看通用 poller 繁忙率:
zabbix[process,"poller",avg,busy]- 如果 agent poller 繁忙率长期 >75%:说明 Agent 被动采集真的有压力,这时候去调
StartAgentPollers,先调到 2~4,同时可配合调大MaxConcurrentChecksPerPoller。 - 如果 通用 poller 繁忙率高:说明压力在 IPMI、ODBC 这类同步采集上,这时候再去调
StartPollers才有用。
- 如果 agent poller 繁忙率长期 >75%:说明 Agent 被动采集真的有压力,这时候去调
- 查看 agent poller 繁忙率:
-
SNMP 设备采集延迟(7.0+ 版本):调整
StartSNMPPollers,该独立异步进程专门处理 SNMP 采集,不占用通用 poller 资源。 -
IPMI、ODBC、简单检查等同步采集延迟:再针对性调整
StartPollers(通用同步轮询进程)。 -
主动模式上报、Proxy 上报、zabbix_sender 数据积压:调整
StartTrappers进程数。
对于 500 台主机以内的小规模集群,默认参数通常可覆盖基础需求,仅在出现明确采集延迟、进程繁忙率持续高于 75% 时再按需扩容。
2. 数据处理与写入侧调优:数据库优先,进程次之
大规模集群(1000 台主机以上)的写入阻塞与数据堆积,根源几乎都在数据库与缓存层面,而非进程数量不足。正确优化顺序按收益从高到低排列:
- 数据库层(第一优先级):中大规模环境必须启用历史表、趋势表的时间分区,通过
DROP PARTITION替代逐行删除清理过期数据;同步优化 InnoDB 核心参数、隔离数据盘与日志盘 IO,这是解决写入瓶颈的根本手段。 - 缓存层(第二优先级):调大
ValueCacheSize(值缓存)、CacheSize(配置缓存)、HistoryCacheSize(历史缓存),将高频访问数据留在内存,大幅减少数据库交互,其调优收益远高于单纯增加进程数。 - 进程层(最后调整):确认数据库与缓存无瓶颈后,若预处理队列持续堆积则调大
StartPreprocessors;若历史缓存长期处于高水位、写入持续滞后,则调大StartHistorySyncers。
3. 架构扩展:Proxy 仅用于分担采集压力
Zabbix Proxy 的核心作用是下沉采集任务,并非解决所有 Server 瓶颈,扩展时机与场景需严格区分:
- 适用场景:当瓶颈明确出现在采集层(采集进程持续满载、跨区域网络延迟高、主机数量持续线性增长)时,优先横向扩展 Proxy 节点,将采集压力下沉到边缘,释放 Server 算力。
- 不适用场景:若瓶颈在数据库写入、触发器计算、告警处理等计算存储层,增加 Proxy 完全无效,反而会因 Proxy 批量上报数据进一步加剧 Server 与数据库压力。
- 超大规模部署推荐采用「多层 Proxy 分组负载 + 数据库分区 + Server 高可用集群」的分布式架构。
4. 告警风暴抑制:多层收敛,根源规避
告警收敛的核心是从触发源头减少无效告警,而非仅靠通知侧过滤:
- 核心手段:合理配置触发器依赖关系(Dependencies),核心交换机、防火墙等设备故障时,自动抑制下游所有主机的连通性类告警,从根源避免单点故障引发的成百上千条批量告警。
- 补充手段:配合告警去重规则、动作条件精细化过滤、计划维护周期、事件关联聚合规则,形成多层收敛机制,确保核心故障告警不被无效信息淹没。

浙公网安备 33010602011771号