Knowledge Base

The VMware Knowledge Base provides support solutions, error messages and troubleshooting guides
 
Search the VMware Knowledge Base (KB)   View by Article ID
 

Time in a virtual machine advances slowly on a Linux host when using a desktop product (1011628)

Symptoms

You may experience these symptoms:
  • Time in the virtual machine runs slower than real time.
  • The slowness is reported by TimeTrackerStats. In particular, the behind by amount reported is increasing. See the Troubleshooting section of Timekeeping in a VMware Virtual Machine  for more details on enabling and interpreting TimeTrackerStats.
  • Periods on the order of several minutes (or indefinitely for 64bit HPETs) where no RTC interrupts are generated on the host.
  • Running the command cat /proc/interrupts on the host can be used to view the number of each type of interrupt that has been handled by the kernel. When this issue is manifesting, the count for the rtc interrupt source stops incrementing.

Resolution

Problem

On Linux hosts, when /dev/rtc is used to generate a high rate of host timer interrupts and the Linux kernel is using the HPET to emulate /dev/rtc, bugs in the Linux kernel may cause fewer timer interrupts than requested to be raised, thus causing time in the virtual machine to advance slowly.

Solution

Pass the host kernel a command line parameter to to avoid using the HPET.
  • For a x86_84 architecture host kernel, specify nohpet on the kernel command line.
  • For an i386 (or i686) architecture host kernel, specify hpet=disable on the kernel command line.
Kernel command line parameters are specified in the /etc/lilo.conf or /boot/grub/grub.conf file, depending on your choice of boot loader.

For LILO, put the kernel command line parameters at the end of the append line.
 
For example, if the append line looks like:
append="resume=/dev/hda6 splash=silent"
and you want to add nohpet, the updated text is:
append="resume=/dev/hda6 splash=silent nohpet"
Remember to run /sbin/lilo after editing lilo.conf, so that your edits take effect.
 
For GRUB, put the kernel command line parameters at the end of the kernel line.
 
For example if the kernel line looks like:
kernel /vmlinuz-2.6.18 ro root=/dev/hda2
and you want to add nohpet, the updated text is:
kernel /vmlinuz-2.6.18 ro root=/dev/hda2 nohpet
For additional information about working with boot loaders, see your Linux distribution's documentation.

Additional Information

Linux hosts typically provide a fixed rate of timer interrupts. When running a guest operating system that requests timer interrupts at a higher rate than the Host operating system, /dev/rtc is used to request additional interrupts to aid in providing the correct timer interrupt rate to the guest operating system. Usually /dev/rtc is an interface to the CMOS Real Time Clock (CMOS RTC), but newer Linux kernels may use one-shot HPET interrupts instead of the physical CMOS RTC. When the Linux kernel programs the HPET and there is a delay between calculating the desired time for the interrupt and programming the HPET, the kernel may request a time in the past, which prevents the interrupt from firing until the HPET counter wraps. The amount of time it takes for the HPET counter to wrap is several minutes for 32bit HPET implementations and many years for 64bit HPET implementations. During this period the virtualization layer may have difficulty giving the guest operating system as many timer interrupts as it has requested, causing time in the guest operating system to fall behind.

Request a Product Feature

To request a new product feature or to provide feedback on a VMware product, please visit the Request a Product Feature page.

Feedback

  • 0 Ratings

Did this article help you?
This article resolved my issue.
This article did not resolve my issue.
This article helped but additional information was required to resolve my issue.
What can we do to improve this information? (4000 or fewer characters)
  • 0 Ratings
Actions
KB: