I too noticed that ntpd was not keeping time after upgrading to OS 10.9. The 10.9.1 upgrade didn't improve things either. Reverting to the ntpd installed under 10.8 fixed the problem so I kept poking around.
As has been noted, pacemaker is the new bit of code here along with an Apple specific version of ntpd. This eventually led me to notice the timestamps on the drift file were never changing. Enter this command in your terminal window to read the timestamp:
ls -la /var/db/ntp.drift
On my machine (Mac mini) it would always return the same time even though the contents are being updated by ntpd. Check the contents with:
cat /var/db/ntp.drift
On a hunch, I used the "touch" command to update the timestamp to the present moment:
sudo touch /var/db/ntp.drift
(You will need to enter an admin password at this point.)
Surprisingly, this had an effect on the time so I wrote a simple python script to read the drift file once a minute and "touch" the drift file if it had changed. I've been running this script continuously for several days now and my time has returned to the accuracies I experienced prior to the 10.9 upgrade.
Frankly, I don't understand how the drift file can be changed by ntpd while the timestamp remains constant. I'd be very interested to hear if anyone else can confirm this observation.
If you are new to ntpd, be aware that it could take a few hours before you see a change in the contents of the drift file.