buf

BE something YOU love and understand
posts - 94, comments - 35, trackbacks - 0, articles - 2
   :: 首页 :: 新随笔 :: 联系 ::  :: 管理

NTPD NTP Server 网络时间服务器

Posted on 2009-04-18 22:27 buf 阅读(8527) 评论(-1)  编辑 收藏 引用

1) 如果在局域网中配置一台网络时间服务器,该局域网中的计算机(OS = Windows XP)时间同步精度能达到多少?
2) 如何测试?


关于测试:
-----------------
a) Windows自带一个w32tm.exe,指定/stripchart选项可以用来显示此计算机和另一计算机之间的偏移量的条带图。

w32tm /stripchart /computer:<target> [/period:<refresh>] [/dataonly] [/samples:<count>]
   computer:<target> - 要测量偏移量的计算机。
   period:<refresh> - 在示例之间的时间间隔,以秒为单位。默认为 2 秒
   dataonly - 只显示数据,没有图表。
   samples:<count> - 收集 <count> 示例,然后停止。如果没有指定,将一直收集示例,直到按下 Ctrl-C。
缺点:原理不清楚,精度无从判断

b) 使用一个脉冲源,将其输出分别连接到所有待测试计算机的串口的一个输入脚上(例如CTS/DSR/RING)。
编写一个测试程序SyncTest,在每个脉冲的上升沿读取本机时间并记录到文件中,运行一段时间后,比较采样下来的时刻,统计计算
缺点:Windows响应外部事件的实时性有限,会引入误差。

c) 在客户端计算机运行一个程序,不断读取系统时间,每到整秒就反转串口的一个输出脚的电平,由此产生的pps与服务器端输出的pps同时接入示波器观察比较
问题:从程序指令到电平反转存在延迟?而且,怎样才能正好在整秒时刻上发出反转指令?


/------------------------------------
19:26:16, 2009年5月4日
在debian lenny上安装了ntpd version 4,由于GPS时钟部分还没有准备好,所以临时采用本地时钟作为时钟参考。在ntp的配置文件/etc/ntp.conf指定server:
server 127.127.1.0
fudge 127.127.1.0 stratum 12

然后在同一子网的windows xp通过自带的时间服务同步到ntpd,第一次点击“更新”比较顺利,不过过一段时间再尝试就出错了。原因比较多样,记不清了,不过好像报超时的居多。运行w32tm /stripchart,从最初的输出看,offset有逐步收敛的趋势,曾经有一小段时间(<20s)保持在1ms一下。但是后面的输出会发生跳跃,比如从<100ms突然加大到>1s。尝试时间同步,操作超时。


/--------------------------------------
22:37:54, 2009年5月5日
在使用本地时钟(LCL)作为参考时钟,为了支持广播(broadcast),需要在server那一行指定prefer关键字:
server 127.127.1.0 prefer
fudge127.127.1.0 stratum 12

大概看一下ntpq的用法,它是标准ntp套件的性能(时间同步精度)测试工具。常用子命令(subcommand)有pe/as/rv等。offset变量标记了本地时钟和参考时钟之间的差值(是一个统计值,单位为ms)。按照文档的说法,使用ntp在局域网可以指望达到1ms以下的同步精度。
ntp还考虑了安全和认证等内容,不过现在我不关心。

发现ntp套件已经有了win平台下的移植,虽然尚未实现全部功能,但对我来说已经够用了:-)


/--------------------------------------
22:40:29, 2009年5月7日
为了使本地时钟尽快同步到参考时钟:
a) 启动ntpd时,增加-g选项
b) 在ntp.conf中,为相应的参考时钟(server)增加iburst关键字

另外,除了ntpq工具,ntpd所提供的丰富的监控选项(monitoring options)也可以作为性能测试的一种选择。比如:
# Enable this if you want statistics to be logged.
statsdir c:\ntpstats

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable

以上面的loopstats为例,ntpd会在c:\ntpstats目录下生成loopstats.yyyymmdd文件。
每次系统时间更新后,将在该文件写入一条记录,例如:
50935 75440.031 0.000006019 13.778 0.000351733 0.013380 6

Item Units Description
50935 MJD date
75440.031 s time past midnight
0.000006019 s clock offset
13.778 PPM frequency offset
0.000351733 s RMS jitter
0.013380 PPM RMS wander
6 log2 s clock discipline loop time constant



/--------------------------------------
20:14:08, 2009年05月16日
要开始搭建测试平台了,没想到一开始就遇到了问题。

准备在一台dell品牌机机装debian+ntpd做时间服务。装系统时居然不认网卡!linux对硬件支持不好,那应该是很久远的说法了,至少在此之前我没有经历过。那是一台没有Internet连接的机器,我没有其它选择,只能不装网卡驱动,打算先装完系统再说。还好同一批次的机器配置一样,在另一台机器上copy了网卡型号:intel 82567lm-3 gigabyte network controller。

回家上网,在intel的官方网站找到了这款网卡芯片的linux驱动和安装说明,还好。不过,按照说明尝试make install安装的时候却出错了:
    "no rule to make target"

再上网找资料,发现有人说2.6.28|29内核可以支持这个网卡芯片,而我的debian lenny的内核版本是2.6.26。心说为了一个网卡,难道还要升级内核?真是麻烦...后来仔细看了一下报错的消息,终于发现了问题:原来驱动源码的路径名中有空格,makefile里执行pwd获得的路径名就被截断了,第一段被作为路径名,第二段被作为make的target,怪不得找不到target呢///stupid.

然后网卡驱动的编译安装就没问题了。


/--------------------------------------
23:21:28, 2009年5月18日
使用ntpq -c rv检查ntpd,示例输出如下(win32,meinberg distribution):
D:\Program Files\NTP\bin>ntpq -c rv
assID=0 status=06f4 leap_none, sync_ntp, 15 events, event_peer/strat_chg,
version="ntpd 4.2.4p6@vegas-v2-o Jan 12 15:27:46 (UTC+01:00) 2009  (4)",
processor="unknown", system="WINDOWS/NT", leap=00, stratum=2,
precision=-19, rootdelay=65.003, rootdispersion=81.220, peer=20248,
refid=210.72.145.44,
reftime=cdbbfa40.14d3ca54  Mon, May 18 2009 23:16:16.081, poll=6,
clock=cdbbfaed.b0061992  Mon, May 18 2009 23:19:09.687, state=4,
offset=-67.855, frequency=49.741, jitter=8.469, noise=16.150,
stability=7.225, tai=0

offset是最重要的变量,它表示ntp计算出的当前计算机时间与若干时钟源时间的差的组合值(combined offset)。
precision标记了当前计算机的计时精度,-19表示pow(2,-19) = 1 / (219) s, 近似于1.9μs
reftime为最近一次的同步时间
clock为执行ntpq时的当前计算机时间


 
/--------------------------------------
22:19:52, 2009年5月19日
进行了ntp性能的简单测试,主要关注offset分布情况,效果很不理想。
两次测试,每次2小时左右,每30秒运行一次ntpq -c rv,提取offset并记录到log文件。第一次测试时offset最初超过60ms,运行一段时间后最小达到-2ms左右,然后呈递增趋势,结束时超过10ms。第二次的情况稍好一些,从6ms收敛到1~2ms,然后又缓慢增加,结束时超过10ms。
不知道是否和以下事实有关:
1、ntp server运行在一台长时间没有使用过的老机器上,主板电池没电了。每次启动后系统时间都从2002年某时刻开始...
2、使用LCL(本地时钟)作为时钟源
 
我觉得1应该不会对试验结果产生影响。我的理解,系统运行期间并不依赖主板上的计时模块进行计时,只是在启动初始化时读取一个初始值。 


/--------------------------------------
22:16:20, 2009年7月20日
关于NTP的有用链接:
http://www.ntp.org/
http://groups.google.com/group/comp.protocols.time.ntp/topics
http://www.wraith.sf.ca.us/ntp/
http://www.satsignal.eu/ntp/index.html
http://davehart.net/ntp
http://time.qnan.org/
maillist: questions@list.ntp.org

/--------------------------------------
12:09:11, 2009年7月25日
NTP在Win32平台的编译
NTP:ntp-4.2.4p7
OS:Windows XP Pro SP3
IDE:VC++ 6.0 SP6 ,PSDK 2003Feb
在Win32平台使用NTP,除了选择Meinberg制作的安装包,也可以自己编译。从www.ntp.org下载NTP源码包,解压后仔细阅读ntp-4.2.4p7\html\build\hints\winnt.html,我这里说一下实际编译过程中遇到的问题,以供参考。

首先编译安装openssl(编译这玩意儿需要perl环境,所以还得先安装perl),我编译的版本是openssl-0.9.8k。编译完成后安装在
D:\OPENSSL-0.9.8K
├─bin
│      libeay32.dll
│      openssl.exe
│      ssleay32.dll

├─include
│  └─openssl
│          aes.h
│          applink.c
│          asn1.h
│          asn1t.h
│          ...
└─lib
    │  libeay32.lib
    │  ssleay32.lib
    │
    └─Debug

有了openssl后,打开ntp-4.2.4p7\ports\winnt\ntp.dsw进行批构建,注意以下几点:
1、某些工程需要连接libeay32.lib,工程选项中设定的路径为$(OPENSSL)\out32dll\libeay32.lib。根据你的情况修改这个路径(或者保证文件在此路径上);
2、需要添加$(OPENSSL)\include到VC的include目录列表中(或者在工程选项中设置);
3、NTP支持IPv6,编译时会通过_MSC_VER这个宏来检测编译器版本。如果发现使用VC6,会帮你添加一些IPv6的相关定义——因为VC6本身是不包含这些定义的。但是,因为我这里装了PSDK,相关的定义已经被添加进来了,所以会产生重定义错误,解决方法有二:
a)不使用PSDK中的文件,也就是在vc->tools->options->directories选项卡中移除PSDK的相关目录
b)在源文件中增加对PSDK的检测,修改以下两个文件:
>>> ntp-4.2.4p7\ports\winnt\include\config.h
#define HAVE_PLATFORMSDK // 我不知道有什么官方的办法检测PSDK,于是自己定义了一个...
#if ((defined _MSC_VER && _MSC_VER > 1200) || (defined HAVE_PLATFORMSDK))
//#if defined _MSC_VER && _MSC_VER > 1200
#define HAVE_STRUCT_SOCKADDR_STORAGE
#define ISC_PLATFORM_HAVEIPV6
#define ISC_PLATFORM_HAVEIN6PKTINFO
#define NO_OPTION_NAME_WARNINGS
#endif 
>>> ntp-4.2.4p7\ports\winnt\include\isc\net.h
//#if _MSC_VER < 1300
#if _MSC_VER < 1300  && !defined HAVE_PLATFORMSDK
#define in6addr_any isc_net_in6addrany
#define in6addr_loopback isc_in6addr_loopback
#endif
这样编译就不会有错误了^^。
 

/--------------------------------------
23:35:48, 2009年9月26日

原来NTP在NT下已经支持NMEA来作为参考时钟了呀,我太土了。手头没有可用的GPS,于是写了一小段模拟GPS输出的代码,测试一下,果然可以的。比方说NMEA由串口3输入,ntp.conf中应指定参考时钟为:
server 127.127.20.3
至于mode选项,要用的时候再查查doc吧。
ok的话,事件查看器会看到这样的记录:
synchronized to GPS_NMEA(3), stratum 0

 

 /--------------------------------------
21:43:07, 2010年3月29日
对于NMEA driver,虽然NTP的文档声称支持4800/9600/19200……等多种波特率(通过mode选项中的bit 4/5/6指定),但至少我没有成功过,除了默认的4800bps。在GPS模块以9600bps的速率送出GGA语句的情况下,即使指定了mode 18,NTP依然无法正常接收数据(i386/FreeBSD 7.2R/NTP 4.2.5)。经过一番Google和好一番的尝试,终于通过stty限定波特率的方法,使NTP正常接收串口数据并同步到NMEA refclock了。串口通信的所有细节,包括波特率/数据位/停止位/校验位/流控制......等都可以通过stty设定初始化值或固定值,应根据GPS模块的设置进行相应设置。

详见man stty。

 /--------------------------------------
23:34:40, 2010年4月22日
更正一下,上一篇中说到NTP对非4800bps的NMEA driver支持有问题,是我错了。当时用的版本是4.2.4p5(FreeBSD 7.2R默认安装),这个版本本来就支持4800bps,而我看的NTP文档是针对4.2.6p1的。在FreeBSD 7.2R编译并安装ntp 4.2.6p1后,测试可以支持9600bps。

今天整个下午都在调试pps,晚上又跑去办公室调了一会,依然无果。内核已启用PPS_SYNC选项重新编译过;pps信号-7v ~ +8v,占空比50%,送入串口1的#1(DCD);ntp.conf也启用了pps相关选项。然而ntptime和ntpdc -c kern返回的状态只有PLL和NANO,偶尔会出现PPSTIME和PPSFREQ,PPSSIGNAL却从未出现过。


 /--------------------------------------
22:54:06, 2010年4月23日
只是修改了Kernel Configuration File中的ident字段值,重新编译内核,配置NTP,检查输入信号,测试输出……似乎一切正常了……难道,假如把GENERIC复制一份到PPSGENERIC,然后在PPSGENERIC中仅仅添加一行options   PPS_SYNC,不修改ident字段,保存,make buildkernel installkernel KERNCONF=PPSGENERIC,重启,使用的依然是默认的、不支持kernel pps discipline的GENERIC内核?不管怎样,总算出来我想看到的结果了。


# ntpdc -c kern
pll offset:           -2.7815e-05 s
pll frequency:        -1.809 ppm
maximum error:        0.221987 s
estimated error:      1.4e-05 s
status:               2107  pll ppsfreq ppstime ppssignal nano
pll time constant:    6
precision:            1e-09 s
frequency tolerance:  496 ppm
pps frequency:        -1.809 ppm
pps stability:        0.076 ppm
pps jitter:           8.42e-07 s
calibration interval: 128 s
calibration cycles:   24
jitter exceeded:      2
stability exceeded:   0
calibration errors:   1

 


# ntptime
ntp_gettime() returns code 0 (OK)
  time cf7c2309.ba3970f4  Fri, Apr 23 2010 21:45:45.727, (.727439275),
  maximum error 216487 us, estimated error 14 us, TAI offset 0
ntp_adjtime() returns code 0 (OK)
  modes 0x0 (),
  offset -32.258 us, frequency -1.809 ppm, interval 128 s,
  maximum error 216487 us, estimated error 14 us,
  status 0x2107 (PLL,PPSFREQ,PPSTIME,PPSSIGNAL,NANO),
  time constant 6, precision 0.001 us, tolerance 496 ppm,
  pps frequency -1.809 ppm, stability 0.076 ppm, jitter 1.246 us,
  intervals 24, jitter exceeded 2, stability exceeded 0, errors 1.


 # ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*GPS_NMEA(2)     .gps.            0 l   16   64  377    0.000   -0.007   0.100


/--------------------------------------
15:29:27, 2010年5月9日
在FreeBSD 7.2R上手工编译安装了NTPD v4.2.6p1,用以替代系统默认安装的4.2.4p5,重启发现NTPD的初始化时间似乎长了些,日志记录也没有前一版本详细,ntpq -p的输出的状态标记是一个"o",而前一版本是"*"。

只有注册用户登录后才能发表评论。