welcome: please sign in
location: Ntp

有关如何使用 TUNA 的 NTP 服务,请参看 NtpHowto 一文。

简介

ntp (network time protocol)是网络中保持时间同步的协议(How does it work)。简单来说,客户端通过向服务器发送带有时间戳的数据包和服务器回复带有时间戳的数据包,来获得客户端发送时间,服务端接收时间、服务端发送时间、客户端接收时间4个时间戳。客户端系统时间偏移量定义为δ = (t₃ - t₀) - (t₂ - t₁)。如果运行ntpd服务,一般来说ntpd会逐渐调整时钟,避免时间跳变。这对于运行计费系统、交易系统或者其他对时间准确性和事件先后顺序敏感的操作十分重要。

ntp为层级结构,stratum 0为时钟源(GPS接收器、原子钟、无线电接收器等),stratum 1为与stratum 0设备直接相连的计算机,stratum 2从stratum 1同步时间,依次类推。网络延时越低且延时对称,则对时越精确。

普通用户配置

很多Linux发行版提供ntp软件包。普通用户在安装ntp后可以从发行版的默认配置中包含的pool服务器同步时间(Debian ubuntu archlinux),pool通过dns负载均衡工作。

也可以手动选择授时服务器,ntp pool project还维护了一个按照地域划分的ntp服务器列表

基于GPS和原子钟的stratum 1 ntp服务器的配置

Reference clock的配置可以参考这里。ntp服务器应达到高的精度。目前普通PC级服务器的软硬件条件允许运行stratum 1时的精度达到50µs或更优。达到此精度必须使用硬件中断和LinuxPPS内核模块。

实现方法是将时钟源设备输出的PPS(pulse per second)信号连接到服务器上可引发CPU中断的引脚。如parallel port的ACK引脚(DB-25 pin 10),则在信号上升沿产生中断,服务器在中断处理程序中可以获取中断时的系统时间(如脉宽合适,则中断处理程序也可以轮询到下降沿时刻,轮询次数由内核pps_parport模块的clear_wait参数指定)。也可将PPS信号连接到serial port的DCD引脚(DB-9 pin 1, DB-25 pin 8),在上升沿和下降沿产生中断。

下面的例子中使用Motorola Oncore GT GPS模块和FE-5680A铷原子钟模块作为stratum 0设备,PC端软件使用Debian wheezy。

Debian wheezy的ntp从版本1:4.2.6.p5开始正确包含了Oncore和PPS的refclock代码,wheezy自带pps_parport和pps-ldisc内核模块,软件已经基本不用改动。FE-5680A输出的PPS信号脉宽太窄(~1µs)有时无法被并口捕获,故需要增加一个延长脉宽的电路。

若使用serial port,用ldattach 18 /dev/ttyS*添加pps源。建议使用parallel port,以使用上升沿触发和兼容TTL电平。

rmmod lp
modprobe parport_pps

Motorola官方只提供了Oncore的Windows版本的配置工具WinOncore。我们可先在Windows下按照Motorola Oncore手册进行调试和Site Survey

Motorola Oncore

硬件将Oncore模块的TTL与USB转TTL模块(PL2303HX)相连,PPS连parport的pin 10

在ntp.conf中添加

server 127.127.30.0 prefer
fudge 127.127.30.0 time1 0.0 stratum 0

建立文件ntp.oncore,在其中添加

MODE    1
# these are my coordinates
LON     ??? ?? ??.???
LAT     ?? ?? ??.???
HT      ??.??   # METER
DELAY   ?? ns
SHMEM /var/log/ntpstats/ONCORE

上面配置中每个变量的定义在ntpd/refclock_oncore.c源代码中有详解。

最后添加软链接,

/dev/oncore.pps.0 -> /dev/pps0
/dev/oncore.serial.0 -> /dev/ttyUSB0

然后重启ntpd即可。

FEI FE-5680 PPS源

FEI FE-5680A的配置可以参考非官方wikiFE-5680A可以使用固定频率的“双标签”版本。原子钟锁频后pin 3低电平,pin 6才有PPS输出,PPS信号经过电路将脉宽适当延长后接并口pin 10,ntp.conf配置添加如下内容:

server 192.168.0.x burst minpoll 3 maxpoll 17 prefer
server 127.127.22.0 minpoll 3 maxpoll 3
fudge 127.127.22.0 flag3 1 time1 -0.xxxxxx

由于ntp将PPS上升沿(或下降沿)的时间定为每秒的开始,而原子钟加电启动时并没有参考标准,PPS上升沿在一秒中的位置是随机的,故偏移量time1值必须在每次重启原子钟后手动指定。第一行server必须保证在ntpd启动阶段能提供正确稳定的授时,参考1 2

注意,新的Intel CPU支持Enhanced cstate技术,若中断被分配到正处于休眠中的cpu,将导致中断响应时间延长,所以需要在引导内核时增加intel_idle.max_cstate=0内核参数,实测在Intel i5平台上关闭c_state可以减少50µs延时. AMD CPU尚未进行测试过。

测试结果

尚未进行PPS Api的延时测试,因为需要一个示波器的协助。下面的测试是对PPS Api捕获的时间戳的方差分析。

Pentium 4 M平台,i845D ISA总线原生并口,Motorola Oncore GT。PC上监控测得PPS信号的标准差为2.5µs,其中Oncore手册上给出时钟源误差为±500ns.

Core 2+i945G平台,Motorola Oncore GT,PCI转parallel port卡(wch CH350),共享中断,中断程序开头获取时间戳,测得PPS信号的标准差为1.2µs。

Core i5+H55平台,原生并口,FE-5680A的PPS引脚连接8051(STC89C52, 22M晶振,12分频)的nINT0脚,8051中断子程做延时(主程为空循环ajmp $),测得PPS信号的标准差为1.3µs,其中8051产生的延时按照时序应在0 ~ 24/22 MHz之间均匀分布。

Ntp (2012-09-07 14:56:14由xiaq编辑)