Linux关于NTP同步硬件时钟的可靠性验证
- 1. 常见的时钟类型
- 1.1 系统时钟
- 1.2 硬件时钟
- 2. 常见时钟同步方式
- 2.1 ntpd服务
- 2.1.1 推荐配置/etc/ntp.conf
- 2.1.2 推荐配置/etc/sysconfig/ntpd
- 2.2 定时任务+ntpdate
- 2.3 ntp命令同步状态相关命令解读
- 2.3.1 ntpq -pn解读
- 2.3.2 ntpdate -u解读
- 2.3.4 ntpdate -udq解读
- 2.4 该如何配置时钟同步?
- 3. 系统时钟同步到硬件时钟
- 3.1 ntpd.service的相关配置/etc/sysconfig/ntpd SYNC_HWCLOCK=yes【不生效】
- 3.2 ntpdate.service 的配置/etc/sysconfig/ntpdate能够在重启这个服务的瞬间执行一次时钟同步【默认禁用】
- 3.3 linux内核默认有 11 分钟模式【默认关闭,同步逻辑复杂,不靠谱】
- 3.4 该如何同步硬件时钟?
- 4. 疑问和思考
- 4.1 reach是什么?377代表什么?
- 4.2 如果时钟有延迟,但是能够ntp缓慢追时间,该如何配置?
- 5. 参考文档
NTP(Network Time Protocol)是一种用于同步网络中各个计算机的时间的协议。它的主要目的是确保网络中的所有计算机都能够精确地使用相同的时间。NTP通过在网络中的某个服务器上提供准确的时间源,然后将该时间源同步到其他计算机上,来实现时间同步。
NTP使用一种层级化的结构来同步时间。在这个结构中,有一个或多个主要的时间服务器,称为Stratum 1服务器。这些服务器通过一些高精度的时钟源(如原子钟或GPS)来提供准确的时间。其他计算机通过与这些主时间服务器交互,定期询问并调整自己的时间。
NTP的工作原理基本上是通过比较计算机的本地时钟与主时间服务器的时钟来确定时间的差异,并对本地时钟进行调整。这个调整过程是连续的,直到本地时钟与主时间服务器的时钟达到同步。
NTP具有很高的精度和稳定性,并且能够在广域网和局域网等各种网络环境下工作。它在互联网和许多其他计算机网络中被广泛使用,特别是需要时间同步的应用,如金融交易、科学研究和电信系统等。
ntp是比较常用的进行时钟同步的方式,通常使用ntpd或者定时执行ntpdate的方式进行时间同步,时钟同步的都是系统时钟,但是通常比较少关注硬件时钟的同步。如果系统不能将时间同步到硬件时钟,就有可能导致服务器重启时,服务器的时间出现错乱。
本文针对常用的硬件时钟同步方式进行探讨。
1. 常见的时钟类型
1.1 系统时钟
系统时钟是指操作系统内部维护的一个计时器,用于记录和管理系统运行的时间。系统时钟通常基于硬件时钟的参考,并通过操作系统内核进行管理和更新。系统时钟可以提供更高精度的时间信息,并支持各种时间相关功能,如定时器、调度器和时间同步等。
1.2 硬件时钟
硬件时钟(也称为实时时钟或RTC)是计算机的一部分,通常是一个电池供电的石英时钟芯片。硬件时钟会持续运行,即使计算机处于关机状态,以确保计算机重新启动时有一个可靠的时间参考。硬件时钟通常以二进制编码的方式记录时间,包括年、月、日、时、分、秒等信息。
2. 常见时钟同步方式
通常使用ntpd和ntpdate 2钟方式进行时钟同步。两者有联系,也有差别。
2.1 ntpd服务
通常会部署ntpd服务来进行时钟同步,这种方式比较优雅。
- 优点:如果时钟出现延迟能够缓慢、平滑的追踪数据
- 缺点: 如果跟上游时钟延迟(默认1000s)过大,ntpd服务会自动退出
2.1.1 推荐配置/etc/ntp.conf
推荐的相关配置如下/etc/ntp.conf
# Common configure
driftfile /var/lib/ntp/drift
logfile /var/log/ntp.log #####优化项:日志文件输出
# tinker config panic 1000 seconds and step-threshold 1000 seconds
tinker panic 1000 step 1000 #####优化项:同步阈值配置(按需修改,参考下文【时钟跳变阈值】)
# Default acl #####优化项:调整acl策略
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
# Local acl
restrict 127.0.0.1
restrict ::1
# NTP server acl #####优化项:调整acl策略,规避安全风险(下列域名按需修改)
restrict time1.tencentyun.com nomodify notrap nopeer noquery
restrict time2.tencentyun.com nomodify notrap nopeer noquery
restrict time3.tencentyun.com nomodify notrap nopeer noquery
restrict time4.tencentyun.com nomodify notrap nopeer noquery
restrict time5.tencentyun.com nomodify notrap nopeer noquery
# NTP server configure #####优化项:调整同步参数(下列域名按需修改)
server time1.tencentyun.com iburst minpoll 6 maxpoll 10
server time2.tencentyun.com iburst minpoll 6 maxpoll 10
server time3.tencentyun.com iburst minpoll 6 maxpoll 10
server time4.tencentyun.com iburst minpoll 6 maxpoll 10
server time5.tencentyun.com iburst minpoll 6 maxpoll 10
# Enable public key cryptography.
#crypto
includefile /etc/ntp/crypto/pw
# Key file containing the keys and key identifiers used when operating
# with symmetric key cryptography.
keys /etc/ntp/keys
# Specify the key identifiers which are trusted.
#trustedkey 4 8 42
# Specify the key identifier to use with the ntpdc utility.
#requestkey 8
# Specify the key identifier to use with the ntpq utility.
#controlkey 8
# Enable writing of statistics records.
#statistics clockstats cryptostats loopstats peerstats
disable monitor
2.1.2 推荐配置/etc/sysconfig/ntpd
ntpd中还有2个关键配置-x
和-g
,在时钟延迟的情况下,有很大的影响。先通过man ntpd
获取原文解释。
-x Normally, the time is slewed if the offset is less than the step threshold, which is 128 ms by default, and stepped if above
the threshold. This option sets the threshold to 600 s, which is well within the accuracy window to set the clock manually.
Note: Since the slew rate of typical Unix kernels is limited to 0.5 ms/s, each second of adjustment requires an amortization
interval of 2000 s. Thus, an adjustment as much as 600 s will take almost 14 days to complete. This option can be used with
the -g and -q options. See the tinker command for other options. Note: The kernel time discipline is disabled with this
option and the step threshold is applied also to leap second corrections.
通过原文,可以得知
-x 能够在一定范围内进行平滑同步,当时间差超过跳变阈值后,时钟会以跳变的方式进行同步
- 当时间差在128 ms以内,平滑同步, 最大的平滑周期时0.5ms/s(同步1s需要2000ms,同步600s许需要14d左右)
- 当时间差超过128ms后,跳变同步
- 可以通过tinker中的step设置平滑同步的跳变阈值
-g Normally, ntpd exits with a message to the system log if the offset exceeds the panic threshold, which is 1000 s by default.
This option allows the time to be set to any value without restriction; however, this can happen only once. If the threshold
is exceeded after that, ntpd will exit with a message to the system log. This option can be used with the -q and -x options.
See the tinker command for other options.
通过原文,可以得知
当时钟偏差超过1000s时,ntpd认为发生了严重的故障,从而会自动退出,此时应该需要人工干预。 -g
能够在ntpd进程运行的生命周期中,有且仅容忍这种严重的时钟偏差故障,ntpd不退出。
- 如果持续发生这种严重的时钟偏差故障或者时钟偏差故障恢复后在出现,
-g
参数将不再起作用。 - 默认情况下,这种严重的时钟偏差故障是1000s,也可以通过可以通过tinker中的panic设置相关的值
所以推荐的配置如下
# Command line options for ntpd
OPTIONS="-x -p /var/run/ntpd.pid"
并配合如下配置,来适配不同场景下的时间同步需求。
配置来源 | 配置值 | 解释 | 最长追平耗时 (每1s校准0.5ms) |
---|---|---|---|
默认配置 | tinker panic 1000 step 0.128 | 低于0.128s平滑同步,超过0.128s开始跳变,超过1000s进程退出 | 几乎无 |
公有云配置 | tinker panic 10 step 10 | 不产生跳变,超过10s进程退出 | 约5.55小时 |
⭐推荐配置 | tinker panic 1000 step 1000 | 不产生跳变,超过1000s进程退出 | 约23天 |
2.2 定时任务+ntpdate
还有一种时钟同步方式ntpdate,能够强行跟远端时钟源进行强行同步,同步方式是通过跳变的方式进行,如果部署的应用对时钟特别敏感,不建议使用这种方式。
# 配置10min同步一次
*/10 * * * * ntpdate -u time1.tencentyun.com 2>/dev/null
2.3 ntp命令同步状态相关命令解读
2.3.1 ntpq -pn解读
# 可以通过如下命令
ntpq -pn
使用该命令,并不会跟远端进行时钟同步,只是进行时间查询同步情况。该命令查询的offset并不一定是完全准确的,因为该命令会有限读取时钟缓存,因此可能是不准确的,但是并不妨碍我们进行下一步定位。
- remote:表示NTP主机的IP或者是主机名,其中:
- *表示目前正在使用的NTP服务器;
- +表示已经连接成功,并且可以作为下一个提供时间更新的候选者;
- #表示服务正常但是不在使用节点之内
- x表示无法连接
- refid:表示上一层NTP主机的地址(和DNS服务器的结构类似,一层一层递归),当remote已经是根NTP服务器的时候就不会显示ip或域名了。可能有以下值(太多了没法全部列举,有需要可自行搜索相关文档):
- .LOCL.:本机,当没有配置远程ntp服务时;
- .IRIG.:Inter-Range Instrumentation Group 时间码;
- .PPS.:时间标准中的“Pulse Per Second”(秒脉冲);
- .NICT.:日本情报通信研究机构(NICT),也就是此ntp服务提供者;
- .DENY.:服务拒绝访问;
- .AUTH.:认证错误(适用于配置了访问权限的NTP服务器);
- .TIME.:连接超时;
- .INIT.:初始化,常出现在服务刚刚启动后不久;
- st:远程服务器的级别。当此值为1是表示为根NTP服务器
- t:类型,有以下值:
- u:unicast,单播;
- b:broadcast,广播;
- l:local,本地;
- s:对称节点,用于备份;
- A:选播服务器;
- B:广播服务器;
- M:多播服务器;
- when:距上次同步的时间,单位是秒
- poll:同步频率,单位为秒,默认每128秒同步一次
- reach:已同步次数
- delay:网络延迟,单位毫秒
- offset:时间偏移量,显示-为负偏移,单位是毫秒
- jitter:与远程ntp服务的平均偏差,单位毫秒
2.3.2 ntpdate -u解读
使用如下命令强行同步本地时间
ntpdate -u 10.26.0.35
2.3.4 ntpdate -udq解读
使用如下命令测试和验证跟上游进行ntp同步的过程,并验证同步过程是否正常。
ntpdate -udq 10.26.0.35
transmit:代表本地发出同步请求
receive: 代表本地接收到相关的包
从而验证同步链路过程中卡在哪个环节。
2.4 该如何配置时钟同步?
由于ntpd本身容易退出,并且能够容忍的时钟并不是很好,并在实际生产中,如果相关的运维、监控能力不足时,经常会莫名出现ntpd同步失败的情况。因此建议
- 如果对时钟要求很高,很敏感,且完全不接受时钟调变,使用ntpd部署,但是推荐配置
# Command line options for ntpd
OPTIONS="-x -p /var/run/ntpd.pid"
并配合如下配置,来适配不同场景下的时间同步需求。
配置来源 | 配置值 | 解释 | 最长追平耗时 (每1s校准0.5ms) |
---|---|---|---|
⭐推荐配置 | tinker panic 1000 step 1000 | 不产生跳变,超过1000s进程退出 | 约23天 |
但是需要配套强监控,需要实时监控和告警ntpd的同步状态,如
- remote状态,必须包含*
- reach,应该为377
- offset,表示时钟延迟,根据情况调整
- 如果对时钟要求不是很高,能够介绍短时的时钟调变,推荐使用ntpd + 定时ntpdate的模式
- ntpd的配置参考上面的配置
- ntpdate的配置
# 配置10min同步一次
*/10 * * * * ntpdate -u time1.tencentyun.com 2>/dev/null
3. 系统时钟同步到硬件时钟
按照现在服务器的时钟同步标准架构,使用ntpd服务进行时钟同步,经过排查定位,发现了2个问题
- ntpd服务只能同步linux的系统时间,无法将系统时间写入到硬件时钟,如果机器的硬件时钟不准确,并且发生异常重启时,开机后操作系统会读取硬件时钟作为机器的系统时钟,从而导致时间不一致
- ntpd服务进行时间同步时,如果时间超过1000s,ntpd服务会自动退出,此时需要人工完成时间同步后,才能把ntpd正常启动(此时ntpd的进程可能是正常的,但是不会跟上游进行同步时钟)。
目前整理出常用的硬件时钟同步方式以及可能性
3.1 ntpd.service的相关配置/etc/sysconfig/ntpd SYNC_HWCLOCK=yes【不生效】
SYNC_HWCLOCK=yes
这个方案没有效果, 是网上的资料中呼声最高的配置,别被网上资料误导了.
ntpd的官方文档没有提供SYNC_HWCLOCK这个环境变量, ntpd的代码里边也没有关于SYNC_HWCLOCK的处理逻辑.
3.2 ntpdate.service 的配置/etc/sysconfig/ntpdate能够在重启这个服务的瞬间执行一次时钟同步【默认禁用】
这个变量SYNC_HWCLOCK=yes
可能最初来自于ntpdate.service, ntpdate服务调用 ntpdate-wrapper脚本, ntpdate-wrapper脚本souce /etc/sysconfig/ntpdate, 脚本判断如果SYNC_HWCLOCK=yes
, 就调用/sbin/hwclock --systohc
命令把系统时间写入硬件时钟. ntpdate.service默认禁用.
3.3 linux内核默认有 11 分钟模式【默认关闭,同步逻辑复杂,不靠谱】
linux内核自带有"11分钟模式",在开启的情况下,大约11分钟左右会自动同步系统时钟到硬件时钟,但是该配置有很多限制,默认情况关闭。并且有很多场景下,会自动关闭,因此利用该模式实现系统时钟同步到硬件时钟不稳定。
3.4 该如何同步硬件时钟?
可以在服务器上配置计划认为,定期将系统时钟同步到硬件时钟,一周同步一次即可。
0 0 * * 0 /sbin/hwclock --systohc
4. 疑问和思考
4.1 reach是什么?377代表什么?
reach用来测试能否和服务器连接,是一种衡量前8次查询是否成功的位掩码值,每成功连接一次它的值就会增加,377表示都成功,0表示不成功。它是八进制数,正常情况下值为[1, 3, 7, 17, 37, 77, 177, 377],对应的二进制为[1, 11, 111, 1111, 11111, 111111, 1111111, 11111111]。reach值越大,表示最近8次同步成功的次数越多,跟上游时钟源同步的成功率就越高。
ntp服务启动后,reach就以poll值为周期与ntp server通信,为了方便理解,我们可以简单的认为每次ping一下上层ntp server,如果成功,那reach就向左移一位,右边补1,如果失败,则右边补0,所以如果reach不是上面给出的枚举值,那就是在通信过程中出错了。当reach 达到17时(对应1111,即最近的4次通信都成功了),那才开始同步时间,这时,remote项对应的域名或IP列表有,其中一个前面会有号,表示该IP就是NTP server。而在开始同步时间之前,当客户端访问NTP server时,都会出现stratum 16,no server suitable for synchronization found这样的错误。也就是说如果你在NTP server主机上重启了ntp服务,那要等4poll秒(在前4次通信都是成功的前提下),该NTP server才与上层NTP server开始同步时间,而且只有当开始同步时,该NTP server才能为其它客户端提供NTP服务。因此,你在/etc/ntp.conf中设置的同步周期minpoll maxpoll不能太大,因为每次ntp服务重启后,要等4倍长的时间才能开始同步。
4.2 如果时钟有延迟,但是能够ntp缓慢追时间,该如何配置?
5. 参考文档
暂无