Zabbix 源码解析之监控项数据采集流程
本文将从 Zabbix 源码角度对监控项数据采集流程进行分析,主要讲解监控项 vm.memory.size 的采集实现和数据上送过程。
概述
监控项数据采集是监控工具最基本的功能,监控数据采集的准确、实时、有效是 Zabbix 其它监控功能正常运转的前提。因此,Zabbix 运维人员有必要了解监控项数据采集流程,并有针对性的设计巡检和问题处理流程,确保监控数据质量。
程序流程图
下图是我们梳理的 vm.memory.size 监控项采集流程图,数据采集的过程设计得缜密而复杂:
![流程图](流程图.png)
相关数据结构定义
在介绍 vm.memory.size 具体实现之前,我们先介绍几个相关数据结构的定义:
1. `struct ZBXMETRIC`:该结构体用于记录 Zabbix 的监控项配置信息。
2. `struct AGENTREQUEST`:该结构体用于记录 Zabbix Agent 的监控项请求信息。
3. `struct AGENTRESULT`:该结构体用于记录给 Zabbix Agent 返回的采集数据。
监控项 vm.memory.size 配置用法
`vm.memory.size` 监控项的配置用法如下:
* `total`:总物理内存,默认值。
* `free`:可用内存。
* `active`:内存当前使用或最近使用,它在 RAM 中是活跃的。
* `inactive`:未使用内存。
* `wired`:被标记为始终驻留在 RAM 中的内存,不会移动到磁盘。
* `pinned`:同“wired”。
* `anon`:与文件无关的内存(不能重新读取)。
* `exec`:可执行代码,通常来自于一个(程序)文件。
* `file`:缓存最近访问文件的目录。
* `buffers`:缓存磁盘读写数据。
* `cached`:缓存文件系统读写数据。
* `shared`:可以同时被多个进程访问的内存。
* `used`:已使用内存。
* `pused`:已使用内存占总内存的百分比。
* `available`:可用内存。
* `pavailable`:可用内存占总内存的百分比。
监控项 vm.memory.size 采值实现
`vm.memory.size` 监控项在不同的操作系统下实现各不相同,Linux 系统下的实现,在 `src/libs/zbxsysinfo/linux/linux.c` 中。其配置项存放于 `parameters_specific` 数组中,可以看到对应的实现函数为 `VM_MEMORY_SIZE`。
`VM_MEMORY_SIZE` 函数用来接受参数,并对应调用对应的取值函数进行数据采集,并返回数据。具体实现如下:
从源码中可以看到,Linux 系统支持的模式包括以下参数,与官方文档中所列的参数不同:
* `total`
* `free`
* `buffers`
* `used`
* `pused`
* `available`
* `pavailable`
* `shared`
* `cached`
* `active`
* `anon`
* `inactive`
* `slab`
通过分析各个参数对应的取值逻辑,可分为 2 种方法:
* 第一种:调用 `sysinfo` 函数获取指标值。
* 第二种:读取 `/proc/meminfo` 文件中的指标值。
下面我们分别对两种情况进行分析。
(1)调用 sysinfo 函数
Linux 中 `sysinfo()` 函数是用来获取系统相关统计信息的函数。它会将结果存储在 `struct sysinfo` 结构体中。函数声明:
`int sysinfo(struct sysinfo *info);`
...(省略)