The problem appears to be due to cpu frequency scaling. The article Host Power Management Causes Problems with Guest Timekeeping on Linux Hosts has details on solving the problem.
You have to edit a config file to specify your max cpu frequency. You can find it out in a couple of ways:
$ cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
1833000
or
$ cpufreq-info
cpufrequtils 002: cpufreq-info (C) Dominik Brodowski 2004-2006
Report errors and bugs to linux@brodo.de, please.
analyzing CPU 0:
driver: centrino
CPUs which need to switch frequency at the same time: 0
hardware limits: 1000 MHz - 1.83 GHz
available frequency steps: 1.83 GHz, 1.33 GHz, 1000 MHz
available cpufreq governors: userspace, powersave, ondemand, conservative, performance
current policy: frequency should be within 1000 MHz and 1.83 GHz.
The governor "ondemand" may decide which speed to use
within this range.
current CPU frequency is 1000 MHz.
analyzing CPU 1:
driver: centrino
CPUs which need to switch frequency at the same time: 1
hardware limits: 1000 MHz - 1.83 GHz
available frequency steps: 1.83 GHz, 1.33 GHz, 1000 MHz
available cpufreq governors: userspace, powersave, ondemand, conservative, performance
current policy: frequency should be within 1000 MHz and 1.83 GHz.
The governor "ondemand" may decide which speed to use
within this range.
current CPU frequency is 1000 MHz.
or (verified on Mac)
$ sysctl -a | grep cpufreq
hw.cpufrequency = 2400000000
hw.cpufrequency_max: 2400000000
hw.cpufrequency_min: 2400000000
hw.cpufrequency: 2400000000
Since my max CPU is 1.83 GHz, I added these lines to /etc/vmware/config:
host.cpukHz = 1830000
host.noTSC = TRUE
ptsc.noTSC = TRUE
I restarted VMware. So far, it seems to be keeping time. I think it simply stops the clock getting ahead of itself, then the VMWare Tools time synchronization ensures if it runs slow, it periodically catches up to the correct time.