本节提供监控项值预处理的详细信息。监控项值预处理允许定义和执行转换规则,用于接收的监控项值。
预处理由预处理管理器进程管理,预处理工作者执行预处理步骤。 所有值(经过预处理或未经预处理)从不同的数据收集器传递到预处理管理器,然后再添加到历史缓存中。数据收集器(轮询程序、捕获器等)和预处理进程之间使用基于套接字的 IPC 通信。无论是 Zabbix server还是 Zabbix proxy(对于由proxy 监视的监控项)都执行预处理步骤。
为了可视化从数据源到 Zabbix 数据库的数据流,我们可以使用下面的简化图:
上图仅以简化形式显示了与监控项值处理相关的流程、对象和操作。 该图没有显示有条件的方向变化、错误处理或循环。 预处理管理器的本地数据缓存也没有显示,因为它不直接影响数据流。 此图的目的是显示监控项价值处理中涉及的流程及其交互方式。
如果任何预处理步骤失败,则在执行预处理时,监控项可以将其状态更改为不支持。
如果数据规范化失败(例如,当文本值无法转换为数字时),监控项可以将其状态更改为不支持。
数据预处理按以下步骤进行:
请注意,在图表中,主监控项的预处理略有简化,跳过了预处理缓存的步骤。
预处理队列组织如下:
预处理缓存被引入,以改善具有相似预处理步骤的多个依赖监控项(这是常见的LLD结果)的预处理性能。
通过对一个依赖监控项进行预处理,并重用一些内部预处理数据,来为其余的依赖监控项提供缓存。预处理缓存仅支持以下类型的第一个预处理步骤:
[?(@.path == "value")]
)Zabbix server配置文件允许用户设置预处理工作线程的数量。 应使用StartPreprocessors配置参数来设置预处理工作线程预启动实例的数量,该数量应至少与可用CPU核心数相匹配。
如果预处理任务不受CPU限制且涉及频繁的网络请求,建议配置额外的工作线程。 预处理工作线程的最优数量可由多种因素决定,包括“可预处理”监控项(需要执行任何预处理步骤的监控项)的数量、数据采集进程的数量、监控项预处理的平均步骤数等。 预处理工作线程不足可能导致内存使用率高。对于Zabbix安装中内存使用过度的故障排查,请参阅使用tcmalloc分析内存使用过度。
但假设没有像解析大型XML/JSON数据块这样的重预处理操作,预处理工作线程的数量可以与数据采集器的总数相等。这样,通常(除了数据从采集器批量到达的情况)至少会有一个空闲的预处理工作线程来处理收集的数据。
过多的数据采集进程(轮询器、无法到达的轮询器、ODBC轮询器、HTTP轮询器、Java轮询器、ping程序、陷阱接收器、proxy轮询器)加上IPMI管理器、SNMP陷阱接收器和预处理工作线程可能会耗尽预处理管理器的每个进程文件描述符限制。
耗尽每个进程文件描述符限制将导致Zabbix server停止,通常在启动后不久,但有时可能需要更长时间。 为了避免这些问题,请审查Zabbix server配置文件,以优化并发检查和进程的数量。 此外,如果必要,确保通过检查和调整系统限制来设置足够高的文件描述符限制。
监控项值处理分多个步骤(或阶段)在多个进程中执行。 这可能导致:
UINT
,(可以使用陷阱监控项),依赖项具有值类型TEXT
。因此,依赖项收到一个值,而主要监控项状态将变为不支持。
CHAR
类型,则主要监控项值将在历史同步阶段被截断,而依赖项将从主要监控项的初始(未截断)值接收它们的值。