李照国 ,潘洪湘 ,张 婷
(1.南瑞集团公司(国网电力科学研究院),南京 211106;2.国电南瑞科技股份有限公司,南京 211106;3.智能电网保护和运行控制国家重点实验室,南京 211106)
电力系统是与时间相关的系统,各子系统应基于统一的时间基准运行,以满足时间一致性的要求[1-4]。随着电力系统时间同步监测功能的推广,对变电站监控系统的对时精度也提出了更高的要求,站内时间同步监测精度应小于3 ms。
NTP(网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步[5]。NTP基于UDP(用户数据报协议)报文进行传输,使用的UDP端口号为123。使用NTP的目的是对网络内所有具有时钟的设备进行同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用[6-9]。对于运行NTP的本地系统,既可以接受来自其他时钟源的同步,又可以作为时钟源同步其他时钟,并且可以和其他设备互相同步。
目前,大部分变电站监控系统通过NTP实现时间同步,监控系统主要采用Linux操作系统,因此本文的策略针对Linux系统。在互联网上,通过NTP同步的2台机器之间的典型精度在几毫秒之内。在局域网上,通过优化NTP的对时过程,其精度通常可以达到几十微秒,如果使用硬件时间戳或硬件参考时钟,也可以达到亚微秒级的精度。
计算机时间以各种方式表示,具体取决于硬件功能、操作系统和系统时钟模型。
Linux系统实际上有2个时钟,分别为硬件时钟和系统时钟。硬件时钟,也叫做RTC或者CMOS时钟,由主板电池进行驱动。当操作系统关机时,计算机使用硬件时钟来保持时间,但是运行时的操作系统是不用这个时间的。系统时钟,也叫做内核时钟或者软件时钟,是由软件根据时钟中断来进行计数的,系统时钟在操作系统关机的情况下是不存在的,因此,操作系统启动时,系统时钟通过读取硬件时钟的时间进行初始化。系统时间是指当前系统时钟的时间。
时钟由1个振荡器和1个振荡器计数器组成,用于记录在给定时间内相对某个初始值的增量。时钟中断是由计算机的计时电路产生的。计时电路按照一定的计数方式对晶体振荡器产生的输入脉冲进行计数操作,每次计数到期,计时电路就产生1个时钟中断。操作系统利用时钟中断维护系统时钟的正常工作,每次时钟中断,操作系统的时间计数变量就加1。
在使用NTP进行对时的计算机系统中,影响计算机时钟误差的3个主要因素分别为:不对称的网络延迟;计算机硬件和软件的潜在因素;时钟振荡器的漂移。文献[10]给出了计算机时钟和理想时钟误差的计算公式:
式中:t为当前时间;t0为上一次更新时间;T为时间偏差;R为频率偏差;D为时钟振荡器的漂移偏差;x为随机误差。
式(1)中前三项偏差有一定的规律,可以进行修正。时钟振荡器的漂移偏差,通常可以被时间偏差和频率偏差进行控制。NTP协议可以对前两项偏差进行预测。
分辨率是一个时钟读数与另一个时钟读数的区别程度。系统时钟分辨率定义为用户态下获得的系统时钟的最小增量,可以为1 ns,1μs,1 ms,10 ms等,最坏情况下也不会超过1 s。
使用操作系统函数gettimeofday()获取系统时钟的分辨率,过程如图1所示。现在商用计算机的时钟分辨率可以达到微秒级。
图1 获取时钟分辨率流程
NTP客户端第一次向NTP服务端发送报文时,有一个地址解析过程。以太网上每一个网络接口都有其硬件地址,在硬件层次上进行的数据帧交换必须有正确的接口地址。Linux内核必须知道目的端的硬件地址才能发送数据,获取目的端硬件地址的工作由ARP(地址解析协议)完成,其过程如图2所示。
图2 地址解析过程
因此,客户端应该首先向服务端发1帧ECHO报文,以使内核缓存IP地址和硬件地址之间进行映射,在下次发送报文时,直接使用该映射,减少中间环节。同时,该操作也促使内核把客户端程序加载到内存中,加快指令执行速度。
本文中的NTP对时方式采用客户机/服务器方式。其工作原理为:客户机首先向服务器发送1个NTP包,其中包含了该包离开客户机的时间戳T1(以客户时间为参照);当服务器接收到该包时,依次填入包到达的时间戳T2、包离开的时间戳T3(以服务器时间为参照),然后立即把包返回给客户机;客户机在接收到响应包时,记录包返回的时间戳T4(以客户时间为参照)。
客户机使用上述4个时间戳可以计算出路径时延: d=(T4-T1)-(T3-T2), 客户机相对服务器的时间偏差: offset=[(T2-T1)+(T3-T4)]/2。
客户机在对服务器时间的连续采样中,需要检查数据包的有效性,以便做进一步的处理。有效性检查需要经过如下6个步骤:
(1)复制数据包检查。防止本包数据是上一包数据的完全复制,消除对同一包数据处理2次的可能性。
(2)连贯性检查。收到的数据包里所包含的时间戳T1,必须和客户机最近发出去的数据包里T1保持一致。连贯性检查保证服务器回复的是客户机最近一次的请求,这将保证接收数据包的顺序,同时可以防止伪造的数据包。
(3)正确初始化检查。检查时间戳T1和T2是否为零,防止客户机和服务器没有进行正确的初始化。
(4)路径时延检查。在变电站的网络结构下,客户机和服务器之间的路径时延必须小于20 ms,否则丢弃该数据包。当站内网络拥堵时,客户机计算出的路径时延就会比较大。
(5)路径时延变化率检查。检查本次采样中的路径时延与采样库中最小的路径时延之比,如果大于2,则丢弃本次数据包。
(6)路径时延增长量检查。检查本次采样中的路径时延与采样库中最小的路径时延之差,应该小于采样库里路径时延标准差的10倍,否则丢弃本次数据包。
只有数据包通过这些有效性检查后,才可进行进一步的统计处理。
通过NTP不仅要同步计算机时间,同时要计算出计算机时间的误差范围。时间偏差为客户机/服务器的查询时间之差与服务器/客户机的响应时间之差的和的一半。通过记录数据包到达和离开服务器的时间、离开和到达客户机的时间,可以计算出这些差值。路径时延为从客户机请求到接收应答的时间,并减去服务器处理请求的时间,因为服务器的处理时间是和网络问题无关的。在处理NTP采样数据时,必须考虑时间偏差、路径时延和误差因素。误差因素主要反映了读时钟操作和时钟频率的公差。
本策略中最大的采样数设置为64个采样点,通过循环的方式进行更新,每次丢弃时间最久的采样点。新的采样点的T4时间如果小于最近一次采样点的T4时间,说明服务器或者本地时间进行了调整,这时需要清空采样库,重新开始积累采样。
一元线性回归方程的模型表示如下:
式中:Yt为因变量;Xt为自变量;Ut为随机误差;b为截距项;a为回归系数。
以T4为自变量,时间偏差为因变量,使用最小方差线性拟合技术估算出回归系数和截距,回归系数为客户机与服务器之间的频差,截距为客户机与服务器之间的相差。
NTP算法假设在服务器与客户机通信过程中,请求报文和应答报文经历的路径时延相等。但在变电站监控系统的网络环境中,NTP服务器到客户机(监控系统)方向上的网络报文远远多于客户机(监控系统)到NTP服务器方向上的网络报文,因此请求报文与应答报文往返时延并不相等,此外路径时延还受到操作系统协议栈时延、网络链路时延、路由器处理和排队时延的影响。在时间采样数据的筛选中对路径时延的大小、变化率、增长量进行检查,并丢掉不合格的数据包,这些数据不再参与回归分析。
对采样数据进行加权处理,可以减少不对称的往返路径时延对对时精度的影响,从而提高监控系统对时精度。本策略中根据路径时延的大小对采样数据进行加权,路径时延越小其所占权重越大。同时,在线性回归的计算中,对残差进行分析,根据其是否均匀分布,多次对该组采样数据进行回归计算,每次计算中去掉该组数据中的一个采样点,最终取残差最好的一组值计算出客户机与服务器之间的频差、相差。
Linux内核使用David L.Mill的时钟调整算法,系统调用adjtimex()读取和可选地设置该算法的调整参数。它以一个指向结构体timex指针为参数,更新内核参数相应的值,并且通过相同的结构体来返回内核当前的值。该算法的目标是将计时精度提高到1μs,最终达到1 ns。
内核将系统时钟实现为64位逻辑时钟,在每个硬件中断或时钟滴答时其值递增。通过循环地对时钟滴答增加或减少某个值调整时钟频率,其范围为-0.5‰~0.5‰。在可用的情况下,一个称为处理器周期计数器的辅助计数器用于在时钟滴答中断之间插值。每秒结束时系统时钟校正例程重新计算,并确定新的相位调整和频率调整,在接下来的一秒中,时钟调整例程在每个时钟滴答中断处分摊这些调整。
Adjtimex()函数适用于时间变量以秒和纳秒以及以秒和微秒表示的内核。无论哪种情况,当必要的硬件支持可用时,系统时钟分辨率都是纳秒级。即使硬件时钟的分辨率仅为微秒级,该函数也能提供大量信号进行整饰和平均,以最大限度地减少读取和舍入误差。虽然时钟校正在NTP中每次应答执行一次,但在内核算法中每次时钟中断处都执行。
使用NTP对时的计算机,其时间波动主要是由于网络和操作系统延迟造成的,其频率波动主要是由温度变化造成的。商业计算机没有明确的手段来控制环境温度,因此在一天的正常运行中,振荡器频率可能会在百万分之几之间变化。为了进一步提高对时精度,可以根据温度对频率进行调节,由于振荡器在物理上与CPU(中央处理单元)芯片接近,因此可以根据CPU的温度对频率进行调节。此外,也可以使用驱动程序或硬件时间戳,进一步提高监控系统对时精度,但这需要介入内核驱动或网络接口程序。