最近被对时折腾的够呛,想找个地方记录一下,费老劲了把原来csdn的账号找回来,我真是太南了
环境:
时钟源板卡系统linux,服务器程序ntpd,可以接外部时钟源irigb或者其他ntp服务器
客户端板卡系统linux,客户端程序systemd-timesyncd,只有一个时钟源ip
测试时碰到的一系列问题,表现出来的现象非常一致,linux无法对时,问题定位分析过程记录
1. Ping命令检查和时间服务器之间的连通性
2. 手动执行systemd-timesyncd服务,输出如下:
“Synchronized to time server.....” > 对时成功
“System clock time unset or jumped backwards, restoring from recorded timestamp” > 对时有成功有失败
无输出 > 对时失败
时钟源不得往回跳,否则对时可能失败
3. cat /var/log/messages | grep time有如下信息:[ 4.320686] systemd[1]: System time before build time, advancing clock. 时钟源时间不得早于系统编译时间,否则对时失败。
4. 先调整系统时间,再调整时钟源时间为系统时间增加一定偏移量,最长对时花费30分钟多,但最终都能对上。
5. 先调整系统时间,在调整时钟源时间为系统时间减少一定偏移量,只要不在编译时间之前,都能对上。
6. 连续小幅度调整时钟源时间,系统对时花费的时间在缩短
7. 首次对时完毕后大幅度调整时钟源时间,系统对时花费的时间与幅度相关
写个结论:
1. timesyncd上电时刻对时不管偏差多大都是很快速的
2. 上电第一次对时完毕后,系统认为时间不应该产生较大的偏差,此时时钟源发生大幅度跳变将导致对时时间开销很长,测试往后跳2年大约需要30分钟左右完成对时
3. 时钟源在短时间内连续跳变,系统将会缩短对时时间,测试往后跳2年大概2分钟以内完成对时
以下是理论部分:
1. NTP是通过UDP来进行数据交换的,每一个时间数据包内均包含客户端发送NTP请求报文和接收NTP应答报文的时间,服务器接收NTP请求报文和发送NTP应答报文的时间。客户端可以根据这4个时间计算出时间偏差以及网络传输延迟。
2. NTP对时的4个核心算法:数据过滤算法,时钟选择算法,合并算法和时钟调节算法
3. 数据过滤算法:NTPv3采用最小时延准则,从一个服务器的8对数据中选出质量最优的一组。检测健全性并滤波。
4. 时钟选择算法:在多台时钟服务器中选择质量最好的服务器。
5. 合并算法:利用加权平均分析所有时间服务器,得到一组精度最好的服务器
6. 时钟调节算法:对系统时钟进行校正。上电时刻通常采用非线性调整,适用于偏移量较大的情况,调整速度快。在时钟稳定后则采用线性调整,适用于偏移量较小的情况,调整速度比非线性要慢,但是精度更高。
参考链接: