HowTo Reduce System Clock Drift

The DNS-323 (like most computer devices) has two clocks - the “hardware clock” that runs all the time, and the “system clock” that runs only while the computer is on. To measure and reduce the system clock drift you will need:

  • telnet access to your DNS-323
  • a busybox binary with the adjtimex function defined (from here or here) The D-Link provided /bin/busybox (FW v1.02b) does NOT have adjtimex defined
  • internet access to a NTP time server (or a time server on your local network)

Note: The release notes for firmware v1.04 claim to have “Fixed clock drift issue”.

Measure the clock drift

To measure the default clock drift, you can set up a cron job to run the following script log_time.sh to record the NTP calendar time at one hour intervals. This script uses pool.ntp.org to get accurate calendar time.

#!/bin/sh
# FILE: log_time.sh

LOG=/mnt/HD_a2/log_time.log
NTPSERVER=pool.ntp.org

# look for zombie sntp processes
PID=$(/bin/pidof sntp)

# kill zombie sntp process
if [ -n "$PID" ] ; then
   /bin/kill -9 $PID
fi

# log NTP time
/usr/sbin/sntp  $NTPSERVER >> $LOG

Create this script and place it on the DNS-323 hard drive, i.e. /mnt/HD_a2. Don't forget to make it executable with:

# chmod a+x log_time.sh

Telnet to the DNS-323 and create a new cron job with the command

# /bin/crontab -e

and add the following line to the crontab (using vi commands)

0 * * * * /mnt/HD_a2/log_time.sh

Let the cron job run for several hours, then examine the log. Find the difference in time between two successive entries. Each entry in the log is recorded when the DNS-323 system clock determines that 60 minutes of system time has passed.

From the following log: 22:59:43.663 (line 2) - 21:59:58.687 (line 1) = 00:59:44.976, this means 59 minutes and 44.976 seconds of NTP calendar time has passed but the DNS-323 computed 60 minutes has passed… the DNS-323 system clock is drifting just over 15 seconds fast, each hour.

 /mnt/HD_a2/log_time.log...

 2007 Feb 22 21:59:58.687 + 13.589 +/- 0.240 secs
 2007 Feb 22 22:59:43.663 + 27.586 +/- 0.133 secs
 2007 Feb 22 23:59:31.404 + 41.601 +/- 0.272 secs

Fix the clock drift

To fix the clock drift you need a busybox binary with the adjtimex function defined. In this example the busybox3 binary is located in the /mnt/HD_a2/lnx_bin directory. The adjtimex function, with the -t ticks option, allows the root user to set the number of clock ”ticks” in a day. To fix the clock drift you need to compute the number of clock ”ticks” that your DNS-323 will need for 24 hours of calendar time.

The Linux kernel, used by the DNS-323, is supposed to have 10000 clock ”ticks” per day (someone else may be better able to explain this?), so each clock ”tick” is equal to 8.64 seconds of calendar time per day.

In my example, the DNS-323 will run 360 seconds (15 seconds per hour ∗ 24 hours) fast each day. 360 seconds is equal to 41.667 ”ticks” (360 seconds ÷ 8.64 seconds per ”tick”) Subtracting 41 clock ”ticks” from the standard number (10000) of ”ticks” in a day, ( 10000 - 41 = 9959) give the number of clock ”ticks” in a day for this DNS-323. I can telnet to the DNS-323 and issue the following command to fix the clock drift…

# /mnt/HD_a2/lnx_bin/busybox3 adjtimex -t 9959

After setting the new ”tick” value, let the cron job run for several more hours and review the log file. You may have to adjust the ”tick” value further. I settled on 9960, which keeps my DNS_323 system clock accurate within one tick (8.64 seconds) per day (<1 second drift per hour).

There is an additional option -f frequency for the adjtimex function, (see man page here), which allows you to further tune the clock drift in finer increments than one ”tick” (8.64 seconds per day).

When you find the correct ”tick” value for you system, place the adjtimex command in your fun_plug script so the correct clock ”ticks” are set each time you restart your system. Then remove the cron job with the crontab -e command.


Navigation

Personal Tools