mzh/blog

Sntpd开发日志-实现学生T分布滤波器

最近在实现sntpd的时间选取,但是遇到了一个问题,怎么查询到集群里“合适”的机器,一开始我只是用delay最低的,但是这样并不是最好的,而RFC5905里的实现太复杂了,这样的话,我就需要一个“滤波器”,但是样本实在太少了,学过统计学的就知道,样本要大于30才算好,但是,查询太多的机器很影响性能,所以样本一般低于5个。因此一番搜索之后,发现“学生T分布”是最好的选择:小样本估计置信区间。

那正态分布呢?因为我们知道,生物过程或者其他变量过多样本都符合正态分布,而学生T分布就是对正态分布的估算。回到ntp的问题,ntp影响的因素有太多了,网络拥塞,时钟抖动,时钟偏移等等,其实,跟网络打上交道,因素就已经够多了。

所以这个条件下,给sntpd安上一个学生T分布滤波器就很好了:)

首先要选个置信度,我只是要排除非法值,所以95%是个很好的选择。 根据公式

Wiki-学生T分布

计算样本均值,样本标准差,自由度(样本数-1),再按表格查询,就知道置信区间了,这样就大于或者小于置信区间的值,就可以当作非法值去掉了。