通过使用缓存检测机制可以显著改善Nagios监控逻辑的性能,缓存检测能够为Nagios在按要求检测或者称为经要求检测(on-demand)上***能上的改进,具体的做法就是通过使用被检测主机或者服务相关的最近检测结果来替代实际的主机和服务的检测。

换言之,缓存检测的作用是当Nagios发现可以利用最近一次检查结果来替代这次检测时,那么Nagios将会放弃执行这次主机与服务的检测。

 

缓存检测仅适用于经要求检测

对于定期的主机和服务检测,如果使用缓存检测机制将不会有性能上的提高,因此在这种情况下不能使用缓存检测机。缓存检测(cached check)仅对于经要求检测检测的主机检测和服务检测提高性能有用。

    定期检测用于确保主机和服务状态能够有规律的更新,这种检测的结果将来可能更多会被用于缓存检测使用。

    经要求主机检测发生的情况:

u       当与主机相关的服务发生改变;

u       由于网络主机可达性逻辑的需要;

u       由于预测主机依赖性检测的需要;

 

经要求服务检测发生的情况:

u       由于预测服务依赖性检测的需要;

需要注意的是除非使用服务依赖性,否则Nagios将不能够使用缓存检测结果来提高检测性能。对于缓存主机检测在性能上会有很大的提高,每个主机监控都能够从中获益。

 

缓存检测的工作原理

    Nagios需要执行经要求(或者说是按照需要)的主机或者服务检测时,那么Nagios将会做出是否使用缓存检测结果,或者是否需要通过执行插件进行实际检测,到底是进行哪一个,它的根据是查看最后X秒内发生的最后一次主机或者服务检查,这里的X是主机或者服务检查的门限值。如果最后一次被执行的检测在缓存检测的门限值内,那么Nagios将会使用这个最后的主机或者服务检测结果,并且不再进行新的检测。如果主机或者服务尚未被检测,或者是最后一次检查超出了检查的门限值(或者称为时限值,由指令cached_host_check_horizon或者cached_service_check_horizon设置),那么Nagios将会使用插件执行一次新的主机或者服务检查。

    Nagios执行经要求检查的目的是想知道当前运行服务和主机在某一个特定时刻的状态。利用缓存的检查的目的是确定当前主机/服务状态“足够好”,而并没有真正的进行实际意义上的重新检查主机或者服务的状态。

    缓存检查的门限值告诉Nagios可以使用最近多久的检查结果,以便能够可靠的反应主机或者服务当前的状态。例如,将缓存检查门限值设置为30秒(就是将选项cached_host_check_horizon或者cached_service_check_horizon的值设置为30),这设置的意义在于告诉Nagios如果主机/服务状态在30秒内被检查过,那么这个检查的结果将会被看做是该主机/服务的当前状态。

如果在经要求检查时Nagios在使用了执行缓存检查,那么称为“命中”,相应的,命中测次数与检查的次数将会被计算为命中率。通过增加缓存检查门限值到等于定时检查间隔值,那么在理论上缓存的命中率是100%,如果是这种情况(就是说缓存的命中率为100%),那么所有经要求检查将会使用缓存检查结果,这个性能是相当可观的!但是能够真的如此吗?实际上是不可能的!

随着时间的推移缓存的检查结果信息的可靠性降低,高缓存命中率需要先前期检测结果在一个较长的时间阶段内被看做是“有效”的。在网络环境中,所有的事情总是发展很快,因此,谁也不能保证在30秒内服务器会发生什么情况。

    要权衡一下可靠性与速度,如果设置一个大的缓存门限值,那么在监控逻辑中将会使用不可靠的检测值。

Nagios将最终确定所有的主机和服务的正确的状态,所以即使缓存的检查结果证明不可靠的结果代表true值,Nagios将只是在很短的时间内使用了不正确的信息。

    即使是在很短的时间内使用了不可靠的信息,但是对于管理员来说也是一个讨厌的行为,原因很简单,对于一个已经不存在了的问题,管理员还是收到了该问题的通知,原因很简单就是使用了过期的信息。

关于缓存门限对于每一个Nagios用户来说没有标准值,或者说没有标准的缓存命中率,有些Nagios用户可能想使用短门限值和低缓存率,其它一些用户却可能使用一个大门限值和高缓存率(需要注意的是可能是一个低可靠性),而其它一些用户将会禁用缓存检测,从而获取100%的可靠性。可以通过对不同的门限值测试,以便获取它们的可靠性状态信息,对于个别的用户这样获取一个比较正确的值,也就是说以便在它们的环境中获取合适门限值。

 感谢原作者:【http://blog.itpub.net/27043155/viewspace-732405/】