在Linux系统中,NTP协议由运行在用户空间中的守护程序实现,用户空间守护程序更新内核中运行的系统时钟,系统时钟可以通过使用各种时钟源来节省时间。通常使用时间戳计数器(TSC),TSC是一个CPU寄存器,用于计数自上次复位以来的周期数,具有高分辨率并且没有中断。当前主流的NTP(Network Time Protocol,网络时间协议)实现包括ntpd服务、chrony服务等。在CentOS6中默认是使用ntpd来同步时间的,在Centos7中默认使用chrony服务来实现时间同步。下面具体介绍两种时钟同步服务的使用方式以及性能对比。
一、相关时间概念介绍
1.1 GMT、UTC、CST
UTC:整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时间 (UTC, Universal Time Coordinated)。
GMT:格林威治标准时间 (Greenwich Mean Time) 指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。(UTC与GMT时间基本相同)
CST:中国标准时间 (China Standard Time)
GMT + 8 = UTC + 8 = CST
1.2 硬件时间和系统时间
硬件时间:RTC (Real-Time Clock)或CMOS时间,一般在主板上靠电池供电,服务器断电后也会继续运行。仅保存日期时间数值,无法保存时区和夏令时设置。
系统时间:一般在服务器启动时复制 RTC 时间,之后独立运行,保存了时间、时区和夏令时设置。
二、NTPD
CentOS6.x中默认使用ntpd来同步时间,现存大量服务器依然在沿用该服务进行时间同步。可通过相关命令确认当前主机是否已经安装ntp。
systemctl status ntpd 或 rpm -qa | grep ntp
如果当前系统未安装ntpd服务,可以手动进行安装:yum isntall ntp
修改配置文件/etc/ntp.conf:
(1)注释掉配置文件中的 server xxx iburst xxx xxx
(2)新增 server 10.8.79.239 iburst
配置完毕后启动ntpd服务:systemctl start ntpd && systemctl enable ntpd
查看ntp[服务器的状态:ntpq -p
字段 | 说明 |
---|---|
符号 |
(*)代表响应的NTPserver和最精确的server; (+)代表响应这个查询请求的NTPserver; |
remote | NTPserver的名称。 |
refid | NTPserver使用的更高一级server的名称。 |
st | 正在响应请求的NTPserver的级别。 |
when | 上一次成功请求之后到如今的秒数。 |
poll | 单位秒,本地和远程server多少时间进行一次同步。刚开始执行NTP时poll值比較小,server同步的频率高,能够尽快调整到正确的时间范围。之后poll值会逐渐增大,同步的频率对应降低。 |
reach | 用来测试是否能和server连接,是一个八进制值,每成功连接一次它的值就会添加。 |
delay | 从本地机发送同步要求到ntpserver的往返时间。 |
offset | 主机与所同步时间源的时间偏移量,单位为毫秒,offset越接近于0,主机和ntpserver的时间越接近。 |
jitter | 统计在特定个连续的连接数里offset的分布情况,这个数值的绝对值越小,主机的时间就越精确。 |
查看时间同步的状态:ntpstat
此外,可以手动进行时间同步:ntpdate <ntpserver_ip>
三、Chrony
chrony 是网络时间协议(Network Time Protocol )的通用实现,它不但可以提供保持系统时间与 NTP 时钟服务器同步的服务,还能作为 NTP 服务器对其他服务器提供时间同步服务。
chrony主要包括两个核心组件:
(1)chronyd:守护进程,主要用于调整内核中运行的系统时间和时间服务器同步;
(2)chronyc:命令行界面程序,用户可以借助该命令对chronyd的性能进行监控等;
chrony的主要特点包括:
(1)任何情况下都能够运行良好,即使运行在不稳定的网络或者系统中;
(2)精度非常高,通常以几十微秒为单位;
(3)开源
Centos7.x默认已安装并启用chronyd服务,使用前可通过相关命令进行确认。
systemctl status chronyd 或 rpm -qa | grep chrony
如果当前系统未安装chronyd服务,可以手动进行安装:yum install chrony
修改配置文件/etc/chrony.conf:
(1)注释掉配置文件中的 server x.centos.pool.ntp.org iburst
(2)新增 server 10.8.79.239 iburst minpoll 6 maxpoll 10
配置完毕后启动chronyd服务:systemctl start chronyd && systemctl enable chronyd
检查时间是否同步:chronyc tracking
字段 | 说明 |
---|---|
Reference ID | 参考编号:计算机当前同步到的服务器的参考ID和名称(或地址)。参考ID是一个十六进制数,以避免与IPv4地址混淆。 |
Stratum | 层次:表示带有附加参考时钟的计算机距计算机的跳数。 |
Ref time (UTC) | 这是处理来自参考源的最后一次测量的时间(UTC)。 |
System time | 在正常操作中,chronyd步进系统时钟,因为时标的任何跳跃都可能对某些应用程序产生不利影响。取而代之的是,通过稍微加快或降低系统时钟的速度来纠正系统时钟中的任何错误,直到错误被消除,然后恢复到系统时钟的正常速度。 |
Last offset | 最后偏移:上次时钟更新时本地偏移量。 |
RMS offset | 偏移值的长期平均值。 |
Frequency | “频率”是如果chronyd不对其进行校正,则系统时钟出错的速率,用ppm(百万分之一)表示。例如1 ppm表示系统时钟认为它已提前1秒时,它实际上已相对于真实时间提前了1.000001秒。 |
Residual freq | 显示了当前选定参考源的“剩余频率”。这反映了来自参考源的测量结果,表明该频率应与当前使用的频率之间的任何差异。 |
Skew | 频率上的估计误差范围。 |
Root delay | 这是到第1层计算机的网络路径延迟的总和,该计算机最终从该第1层计算机同步。根延迟值以纳秒分辨率打印。在某些极端情况下,该值可以为负。 |
Root dispersion | 根扩散:这是通过所有计算机累积到第1层计算机的总色散,最终从第1层计算机对其进行同步。色散是由于系统时钟分辨率,统计测量变化等引起的吗,根色散值以纳秒分辨率打印。 |
Update interval | 更新间隔 |
Leap status | 飞跃状态,可以是“正常”或”未同步“。 |
查看时钟源的状态
如果需要立即进行时间同步,可以重启chronyd服务:systemctl restart chronyd
此外,对/etc/chrony.conf进行相应的配置,当前主机可作为时钟同步服务器供其他主机同步这台服务器上的时间。限于篇幅,这里不再具体介绍。
四、Chrony 和 NTPD 性能对比
我们可以从 Chrony 的官方网站上看到与 NTPD 各维度的详细对比。
可以看出,在稳定系统(稳定网络、稳定时钟)以及不稳定系统(不稳定网络、不稳定时钟)条件下,chrony的时钟同步性能都要优于ntp。
可以看出,chrony可以随机间歇性校准时间,而ntp需要定期轮询才能正常工作。此外,chrony拥有更小的时间轮询间隔,能够更快的同步时钟。
参考来源:chrony – Comparison of NTP implementations