现在简单的描述一下zabbix_server端的各个进程及其功能
1.main_dbconfig_loop:这是一个同步数据库的hosts表和items表的内容到内存的进程,时间间隔默认为1s,由于这两个表用的很频繁,出于性能考虑,在内存上用哈希表的形式缓存了这两个表的信息
2.main_watchdog_loop:用来检查database有没有挂掉,时间间隔默认60s,如果挂了需要向管理员报警,检查的方式为每隔60s重连一次数据库,没有报错表明运行正常
3.main_poller_loop:调用get_values会主动连接zabbix_agent然后发送请求然后获取zabbix_agent响应的数据,在get_values中调用dc_add_history函数将获取的数据存放到history表的内存缓存中,并且要更新item的状态(normal、unreachable),
4.main_trapper_loop:从监听端口接收数据并调用process_trapper_child进行处理:
if (0 == strncmp(s, "ZBX_GET_ACTIVE_CHECKS", 21)) /* Request for list of active checks */ //与上一篇讲的agent有个更新active_list的进程对应
{
ret = send_list_of_active_checks(sock, s);
}
else if (strncmp(s, "ZBX_GET_HISTORY_LAST_ID", 23) == 0) /* Request for last ids */
{
send_history_last_id(sock, s);
return ret;
}
else /* Process information sent by zabbix_sender */
{...}
5.main_pinger_loop:周期性针对每个item上的ip进行ping操作,周期是算出来的,具体怎么算的还没研究
6main_alerter_loop: 每隔30s将alerts表中的未发送的警报都发送出去,并且发送成功后将ALERT_STATUS_NOT_SENT改为ALERT_STATUS_SENT
7.main_housekeeper_loop:定时对数据库中一些过期的数据进行清理删除
for (;;)
{
now = time(NULL);
DBconnect(ZBX_DB_CONNECT_NORMAL);
d = housekeeping_history_and_trends(now); //清除数据库historys和trends表中过期的数据
housekeeping_process_log(now); //对housekeeper表中的过时数据进行清理
housekeeping_events(now); //清理acknowledges和events中的数据
housekeeping_alerts(now); //清理alerts中的数据
housekeeping_sessions(now); //清理sessions中的数据
DBclose();
zbx_sleep_loop(CONFIG_HOUSEKEEPING_FREQUENCY * SEC_PER_HOUR);
}
8.main_timer_loop:这个进程最主要的功能就是定时的调用计算数据库中定义的触发器的值,如果新值和原有的值不相等,表示有新的事件产生,然后就将新的事件插入到数据库,关键函数:process_time_functions, evaluate_expressions(用于计算触发器表达式的值&产生事件),process_event(处理事件,主要是将新事件插入数据库)
9.main_nodewatcher_loop:这个进程跟zabbix实现的分布式部署有关系,最主要的函数是main_historysender,当这个进程运行在slave节点上时会周期性的将history数据(zabbix_agent收集到的监控数据)发送给master节点
10.main_httppoller_loop:周期性的检测httptest表中定义的http服务是否运行正常,代码中使用调用libcurl库实现的
11.main_discoverer_loop:它会扫描定义ip地址范围内的ip,如果发现有zabbix_agent存在则会将它加入hosts表中
12.main_dbsyncer_loop:负责将内存中的history数据(zabbix_agent发送的监控数据)同步到数据库中
13.main_escalator_loop:escalator是将触发器事件和所需执行的动作联系起来的一个表,这个相应动作可以是重复执行的,动作有两个选择:发送邮件和执行远程shell命令
调用函数顺序:process_escalations=》execute_escalation=》execute_operations,在execute_operations中可以看到,它其实就是在alert表中插入一条记录,上面我们提到有个main_alerter_loop会周期性的处理这个表中数据
14.main_proxypoller_loop:用于主动连接代理,并且获取代理上接收的history数据
15.main_selfmon_loop:用于收集收集系统本身的各个进程的运行情况如用掉的cpu时间
转载请注明出处:http://blog.csdn.net/liujian0616/article/details/7946492