Guys,

Every few months I have to remind the group about the laws of physics and the evils of implementation. First, the ntpd discipline algorithm described in various documents and the book is basically a linear, type-II phase-lock loop with characteristics carefully tailored for optimum response. In principle, there is no limitation on the step threshold or even if it is disabled. However, there are gotchas:

1. The original Unix adjtime() function uses a constant slew rate of 500 PPM. This results in very long convergence times for a large initial offset of several seconds or more.

2. In an apparently misguided attempt to "fix" this problem, Linux (and Solaris) added variable slew feature to adjtime(). This creates an extra poll in the discipline loop resulting in unstable behavior, especially with initial offsets of a second or more.

3. The reason for the 0.5 second limitation in the kernel code is that the ntp_adjtime() function is limited to a one-second interval due to overflow in the 32-bit word.

4. In the design of the nanokernel code that leaves here, the time as seen by the application is not stepped backward unless the kernel clock is stepped backward more than two seconds. So, if the kernel clock is stepped backward more than the step threshold and less than two seconds, the time as observed by an application would effectively stand still or advance at a low rate for the interval required. There are other features designed to avoid inconsistent reading of the kernel clock via various means in and out of the kernel. These features have been implemented in the stock Tru64 kernel for the Alpha, but so far as I know have not been implemented in other kernels.

5. If for some reason the server(s) are not reachable at startup and the applications must start, then I would assume the applications would fail, since the time is not synchronized. If the applications use the NTP system primatives, the synchronization condition is readily apparent in the return code. Since they can't run anyway, there is no harm in stepping the clock, no matter what the initial offset. Forcing a slew in this case would seem highly undesirable, unless the application can tolerate large differences between clocks and, in that case, using ntpd is probably a poor choice in the first place.

Dave

David Woolley wrote:

In article <[EMAIL PROTECTED]>,
Joe Harvell <[EMAIL PROTECTED]> wrote:

I have an application that is sensitive to step corrections and am considering 
using 'tinker step 0' to disable them altogether.  However, I noticed a thread 
on this topic in February 2005 
(http://lists.ntp.isc.org/pipermail/questions/2005-February/004468.html) that 
suggested setting 'tinker step 0' without explicitly using 'disable kernel' 
will essentially yield unpredictable behavior.


So when "disable kernel" has been used, how is the clock frequency
adjusted?  Also, why is the kernel time discipline disabled when a


By doing all the calculations in user space and periodically (every 4 seconds
on ntpd v3) calling adjtime to apply the slew correction for that second.
The result is a sawtoothing of the phase.

The kernel mode does the calculations every tick.


correction of > 0.5 seconds is required?


I suspect the limit is imposed because something in the kernel overflows.

PS.  Please don't keep starting new threads for what is clearly part of
a single thread.

_______________________________________________
questions mailing list
[email protected]
https://lists.ntp.isc.org/mailman/listinfo/questions

Reply via email to