Nagios分析文档(2)
本帖最后由 monicazhang 于 2015-10-30 21:29 编辑20151030淡然续上
21、清理downtime数据22、清理注释数据23、如果是关闭信号,清理status.dat24、如果是关闭信号,删除cmd文件
步骤比较简单,其中比较重要的有两个,一个是13,初始化循环,另一个就是17,nagios在作为daemon运行的过程中,就是在不断的执行这个循环。执行图如下:
(二)流程详细分析1、初始化循环 nagios是个基于事件的监控系统,所有的操作都是由事件触发器触发的。 nagios安装
nagios启动的时候,会启动一个init_timing_loop函数,来进行事件循环的初始化。init_timing_loop主要流程如下:
(1)建立scheduling_info表,表的内容有: 总service数(在时间表外的也算) 已经在表中的service数 总host数(时间表外的也算) 在列表中的host数 单个host平均service数(总service数/总host数) 列表中单个host的service数(列表中service数/列表中host数) 平均service检查时间间隔(service检查总间隔/列表中service数) service检查总间隔 平均service检查延时 host检查总间隔 平均host检查延时(2)得到被调度的服务监测的一些信息,并填充相应的sche_info结构(3)得到被调度的主机监测的一些信息,并填充相应的sche_info结构 开源监控软件(4)确定服务调度参数 Scheduling_info.service_inter_check_delay Scheduling_info.service_interleave_factor(5)调度服务检测计算每一个服务下一次检测时间 for() 并把服务的每一个检测事件插入到事件队列中区for()(6)确定主机调度参数Scheduling_info.host_inter_check_delay(7)调度主机检测计算每一个主机下一次检测时间 for() 并把主机的每一个检测事件插入到事件队列中区for()(8)插入其他事件(高优先级队列) Event_list_high
2、主循环(event_execution_loop)
nagios在进入守护状态以后,会一直运行一个循环event_execution_loop,nagios所有的操作全部在这个循环中得到实现。
循环会不断检查两个event队列,一个是高优先级,包括nagios的除了检查之外的所有任务,另外一个是低优先级,包括host和service的检测。循环会先检测高优先级的event队列,然后一个一个执行完毕,最后再判断下host和service的检测是不是有必要,然后再对其进行检测。在执行event队列的时候,用的函数都是一样的,名字是handle_timed_event,当每个handle_timed_event执行完以后返回,然后再执行下一个事件任务。handle_timed_event函数的开始是个case语句,对事件进行分类处理,具体event_type如下: nagios配置(1)event_service_check(检查service)(2)event_host_check(检查host)(3)event_command_check(检查cmd文件,被动监控,cgi发送的命令都会送到cmd文件中)(4)event_log_rotation(日志滚动)(5)event_program_shutdown(nagios关闭)(6)event_program_restart(nagios重启)(7)event_check_reaper(检查结果回收)(8)event_orphan_check(检查孤儿host和service)(9)event_retention_save(保存检查结果到retention.dat,关闭nagios不删除此文件)(10)event_status_save(保存检查结果到status.dat,关闭nagios会删除)(11)event_scheduled_downtime(12)event_sfreshness_check(检查service新鲜度?)(13)event_hfreshness_check(检查host新鲜度?)(14)event_expire_downtime(15)event_reschedule_checks(重新编排event列表,与上文说的初始化循环类似) 监控软件(16)event_expire_comment(17)event_user_function
3、主动监测(event_service_check,event_host_check)
event_service_check调用了run_scheduled_service_check函数, 然后再调用函数run_async_service_check。这个函数主要完成以下任务:(1)、首先从service结构体中得到命令行。Processed_command函数(2)、给全局变量check_result_info赋值,其中output_file_fp为一临时文件,记录了check_result_info的一些信息(3)、perl解释器运行脚本(如果没有定义的话就跳过)(4)、fork()进程,在子进程中处理具体的命令(服务监测) 》popen执行命令 》继续往check_result_info中添加内容 》move_check_result_to_queue Check_result_info记录以及输出结果生成.ok文件 nagios实施(5)、父进程等待子进程运行结束
如果在配置文件中开启了use_large_installation_tweaks选项,那么在检查的时候,会fork两次子进程,父进程并不会等待检查进程返回结果,只要fork的进程数量不超过配置文件中设置的最大进程数量(max_service_check_spread和max_host_check_spread),就不会有问题。
4、结果回收(event_check_reaper)
event_check_reaper调用reap_check_results函数,读取所有检查结果,并且在循环中依次调用process_check_result_queue进行结果回收。process_check_result_queue负责把保存在文件中的检查结果读出,并且插入check_result_list中,删除结果文件。然后handle_async_service_check_result再对结果进行处理,这些处理包括了:更新检查结果到service_list链表,obsessive检查结果,event_broker,报警等等handle_async_host_check_result_3x 用来检查host状态,和service类似。如果在reap_check_result中时间超过max_check_reaper_time,则退出循环。max_check_reaper_time的默认值为30s,在nagios.cfg中,可以通过设置max_check_result_reaper_time来进行设置。我们得到了两个链表:host_list和service_list,里面存储了我们所有host和service的最新的检查结果。 nagios培训
5、结果输出(event_status_save)
event_status_save比较简单,就是将host_list和service_list中的数据同步到status.dat中,不过是全部同步,如果检查结果很多的话,虽然不知道具体要占用多少io,但是如果对于数据在页面上的展示没有需求的,只需要检查,处理报警(或许还需要入库)的,就没必要再来这么一步了。
待续:http://ITIL-foundation.cn/thread-53039-1-1.html
本帖关键字:Nagios
页:
[1]