通用PC机自带两类时钟源:硬件时钟和软件时钟(或称为系统时钟)。不论是硬件时钟还是软件时钟,都是由石英晶体振荡器驱动的,通过累计石英晶体振荡器输出脉冲数,换算出时间。所以计算机时钟的准确度取决于晶振频率准确度。受温度变化、电压、芯片老化等因素影响,晶振频率会发生小幅度波动,其中温度对晶振频影响最大。由于工艺和材料的原因,同一生产线上标称频率相同的石英晶体,其实际频率是不同的,实际频率与标称频率偏差率从10-4量级到10-9量级不等。以10-4量级为例,时钟每天至少误差8.64 s,所以对于集群系统,进行统一的时钟同步是十分有必要的。
在集群系统方案设计中,需要将服务端和终端的时钟进行同步,使用ntp时钟同步的方式进行多个系统时间同步,是一种可行的方案。
一、NTP协议简介
网络时间协议NTP(Network Time Protocol)的主要开发者是美国特拉华大学的MILLS David L教授设计实现的,由时间协议、ICMP时间戳消息及IP时间戳选项发展而来。NTP用于将计算机客户或服务器的时间与另一服务器同步,使用层次式时间分布模型。在配置时,NTP可以利用冗余服务器和多条网络路径来获得时间的高准确性和高可靠性。即使客户机在长时间无法与某一时间服务器相联系的情况下,仍可提供高准确度时间。
二、NTP授时原理
NTP最典型的授时方式是Client/Server方式。如下图1所示,客户机首先向服务器发送一个NTP 包,其中包含了该包离开客户机的时间戳T1,当服务器接收到该包时,依次填入包到达的时间戳T2、包离开的时间戳T3,然后立即把包返回给客户机。客户机在接收到响应包时,记录包返回的时间戳T4。客户机用上述4个时间参数就能够计算出2个关键参数:NTP包的往返延迟d和客户机与服务器之间的时钟偏差t。客户机使用时钟偏差来调整本地时钟,以使其时间与服务器时间一致。
图1中:T1为客户发送NTP请求时间戳(以客户时间为参照);T2为服务器收到NTP请求时间戳(以服务器时间为参照);T3为服务器回复NTP请求时间戳(以服务器时间为参照);T4为客户收到NTP回复包时间戳(以客户时间为参照);d1为NTP请求包传送延时,d2为NTP回复包传送延时;t为服务器和客户端之间的时间偏差,d为NTP包的往返时间。
现已经T1、T2、T3、T4,希望求得t以调整客户方时钟:
....................................................式(1)
假设NPT请求和回复包传送延时相等,即d1=d2,则可解得“
.....................................式(2)
根据式(1),t也可表示为:t=(T2-T1)+d1=(T2-T1)+d/2.....................式(3)
可以看出,t、d只与T2、T1差值及T3、T4差值相关,而与T2、T3差值无关,即最终的结果与服务器处理请求所需的时间无关。因此,客户端即可通过T1、T2、T3、T4计算出时差t去调整本地时钟。
三、NTP授时精度分析
NTP授时精度与NTP服务器与用户间的网络状况有关,主要取决于NTP包往返路由的延时对称程度,往返路由的延时不对称值最大不超过网络延时。式(2)是在假设NTP请求和回复包在网上传送延时相等,即d1=d2=d/2的情况下得出的,而d1、d2的取值范围在(0...d)间,由式(3)可以得出最大授时误差是±d/2。一般广域网的网络延时在10 ms~500ms之间;局域网的网络延时在计时操作系统内核处理延迟的情况下通常小于1ms。
四、在ubuntu系统上搭建ntp服务器实现本地局域网时钟同步
为验证ntp服务器在mcp系统上搭建的可行性,使用ubuntu系统进行模拟搭建;
1、硬件准备
1台linux Ubuntu主机作为server端;若干台Ubuntu作为client端,连接到同一交换机上组建局域网计算机阵列;交换机连接到internet,确保每台电脑网络通信正常,可以连接到ubuntu.com,便于在线安装服务包;可将每台电脑的IP设定为固定IP,确保client端ping server端通信正常。
2、Ntp服务的安装与配置
服务端:
Ubuntu18.04系统默认未安装ntp服务和ntpdate服务,执行命令
sudo apt install ntp
安装ntp服务,若提示包无法解析,尝试执行sudo apt-get update更新安装库,再安装。
安装完成后,会生成/etc/ntp.conf文件,对其进行以下修改
sudo vim /etc/ntp.conf 进行编辑修改,若没有安装vim,则使用sudo vi /etc/ntp.conf,通过vi编辑器修改也可以,一定要使用sudo权限,不然无法修改/etc的内容
1)注释掉原有的默认ntp服务器
默认ntp是从ntp.ubuntu.com获取时钟,我们要将本机设置为本地局域网ntp服务器,所以将其注释;
2)添加ntp服务器服务覆盖的网段
这里我设置为覆盖192.168.2.*网段,可根据自己的网络环境做对应修改;
3)设置本机为本地ntp服务器,并设定相应级别
Stratum后面的数字为响应级别,不能设置为0
4)启动或重启ntp服务器,应用设置
/etc/init.d/ntp start
或者
/etc/init.d/ntp restart
5)查看服务状态 ntpq -p
可以看到服务器设置为本地,本机delay offset jitter都为0;
客户端:
1)使用ntp服务配置
Ntp既可以作为客户端也可以作为服务端,修改ntp.config的配置即可
第一步与服务端相同,注释掉默认服务器地址
第二步,修改ntp.config设定服务器地址,其他不做修改
第三步,启动或重启ntp服务
/etc/init.d/ntp start
或者
/etc/init.d/ntp restart
第四步,查看ntp状态
第五步,等待同步,并查验ntp服务同步,将配置文件修改好后并启动服务,默认5分钟会自动同步一次时钟,如何修改这个时间待研究,目前尚未能修改
2)使用ntpdate手动同步
第一步,安装ntpdate服务
sudo apt install ntpdate;
第二步,执行ntpdate [IP]获取时间
执行后os时间会同步到ntp服务器获取的时间;再执行hwclock –w可将osclock同步到BIOS
除了使用本地服务器外,其他的一些常用ntp服务器如下,也可以执行ntpdate向其申请同步
以下是一些可用的NTP服务器地址:
Name |
IP |
Location |
210.72.145.44 |
210.72.145.44 |
中国(国家授时中心) |
133.100.11.8 |
133.100.11.8 |
日本(福冈大学) |
time-a.nist.gov |
129.6.15.28 |
NIST,Gaithersburg,Maryland |
time-b.nist.gov |
129.6.15.29 |
NIST,Gaithersburg,Maryland |
time-a.timefreq.bldrdoc.gov |
132.163.4.101 |
NIST,Boulder,Colorado |
time-b.timefreq.bldrdoc.gov |
132.163.4.102 |
NIST,Boulder,Colorado |
time-c.timefreq.bldrdoc.gov |
132.163.4.103 |
NIST,Boulder,Colorado |
utcnist.colorado.edu |
128.138.140.44 |
UniversityofColorado,Boulder |
time.nist.gov |
192.43.244.18 |
NCAR,Boulder,Colorado |
time-nw.nist.gov |
131.107.1.10 |
Microsoft,Redmond,Washington |
nist1.symmetricom.com |
69.25.96.13 |
Symmetricom,SanJose,California |
nist1-dc.glassey.com |
216.200.93.8 |
Abovenet,Virginia |
nist1-ny.glassey.com |
208.184.49.9 |
Abovenet,NewYorkCity |
nist1-sj.glassey.com |
207.126.98.204 |
Abovenet,SanJose,California |
nist1.aol-ca.truetime.com |
207.200.81.113 |
TrueTime,AOLfacility,Sunnyvale,California |
nist1.aol-va.truetime.com |
64.236.96.53 |
TrueTime,AOLfacility,Virginia |
需要注意的是,ntpdate和ntp service是不能同时运行的,安装ntp后就不能再安装ntpdate,需要卸载才能安装。
3)ntpq –p命令的参数解析
说明:
remote :
用于同步的远程节点或服务器。“LOCAL”表示本机 (当没有远程服务器可用时会出现)
表中第一个字符(统计代码)是状态标识(参见 Peer Status Word),包含 " ","x","-","#","+","*","o":
" " – 无状态,表示: 没有远程通信的主机
"LOCAL" 即本机 (未被使用的)高层级服务器 远程主机使用的这台机器作为同步服务器
“x” – 已不再使用
“-” – 已不再使用
“#” – 良好的远程节点或服务器但是未被使用 (不在按同步距离排序的前六个节点中,作为备用节点使用)
“+” – 良好的且优先使用的远程节点或服务器(包含在组合算法中)
“*” – 当前作为优先主同步对象的远程节点或服务器
“o” – PPS 节点 (当优先节点是有效时)。实际的系统同步是源于秒脉冲信号(pulse-per-second,PPS),可能通过PPS 时钟驱动或者通过内核接口。st:即stratum阶层,值越小表示ntp serve的精准度越高;
refid:远程的服务器进行同步的更高一级服务器
when:几秒前曾做过时间同步更新的操作;
Poll表示,每隔多少毫秒与ntp server同步一次;
reach:已经向上层NTP服务器要求更新的次数;
delay:网络传输过程钟延迟的时间;
offset:时间补偿的结果;
jitter:Linux系统时间与BIOS硬件时间的差异时间
注意:NTP服务端重启后,客户机要等5分钟再与其进行时间同步,否则会提示“no server suitable for synchronization found”错误。等待的时间可以通过命令 watch ntpq -p来监控。