/var/log/step2k

December 13, 2007

Clock in a Linux Guest Runs More Slowly or Quickly Than Real Time

Filed under: Virtualization - Salman Teguh @ 5:09 am

If your Linux 2.6 guest’s clock is running too quickly, it indicates a problem with lost tick correction. Apply one of the workarounds in the section “Preventing the Clock from Running Too Quickly.”

Note: The overcorrection for lost ticks has been fixed in Linux kernel 2.6.18. Upgrading to 2.6.18 or later also solves this problem.

If your guest’s clock is running too slowly, it indicates that the host’s real timer interrupt rate can’t keep up with the guest’s virtual timer interrupt rate. There are two approaches to dealing with the problem: either decrease the guest’s rate or increase the host’s rate. Apply one of the workarounds in the section “Preventing the Clock from Running Too Slowly.” Also apply one of the workarounds for running too quickly, because correcting the first problem often reveals the second one.

In both cases, also make sure that VMware Tools is installed in your guest, that time synchronization is enabled and that you are not running any other clock synchronization software in the guest at the same time (such as ntpd).
If your host uses power management features (such as Intel SpeedStep, or AMD PowerNow or Cool’n'Quiet) that vary the processor speed, see http://kb.vmware.com/kb/1591.
Preventing the Clock from Running Too Quickly
32-bit Systems
For 32-bit systems, there are two kernel options that help with the guest kernel’s over-correction for lost ticks:

* Add the clock=pit boot option to your guest’s kernel command line in the /etc/lilo.conf or /boot/grub/grub.conf file.

The following example shows the syntax for LILO:
image=/boot/vmlinuz
label=”linux”
root=/dev/hda1
initrd=/boot/initrd.img
append=”resume=/dev/hda6 splash=silent clock=pit”
read-only

(Remember to run /sbin/lilo after editing lilo.conf, so that your edits take effect.)

Here is an example of the syntax for GRUB:
title Fedora Core (2.6.9-1.667)
root (hd0,0)
kernel /vmlinuz-2.6.9-1.667 ro root=/dev/hda2 clock=pit

Adding this boot option disables the kernel’s correction for lost ticks, so be sure to also install VMware Tools and turn on time synchronization. The latter prevents the guest clock from losing time over the long term due to lost ticks.

For additional information about working with boot loaders, see your Linux distribution’s documentation.
* As an alternative, especially if you are unable to use VMware Tools, you can instead give the kernel command line option

clock=pmtmr

With this option, the kernel corrects more properly for lost ticks, but occasionally overcorrects and ends up gaining time slowly. This option is the default for most 2.6 kernels, but some distributions may patch their kernels to change the default. In SuSE SLES 9 kernels, the default is clock=tsc. The code enabled by the tsc setting severely overcorrects for lost ticks when used in a virtual machine and tends to gain time rapidly.

64-bit Systems
In the x86_64 Linux kernel, use the boot option notsc instead of clock=pit.

LILO example:
image=/boot/vmlinuz
label=”linux”
root=/dev/hda1
initrd=/boot/initrd.img
append=”resume=/dev/hda6 splash=silent notsc”
read-only

GRUB example:
title Fedora Core (2.6.9-1.667)
root (hd0,0)
kernel /vmlinuz-2.6.9-1.667 ro root=/dev/hda2 notsc
Preventing the Clock from Running Too Slowly

One approach to a slow guest clock is to reduce the guest timer interrupt rate.

* In a one-CPU virtual machine, add the following kernel command line parameters to the guest:

nosmp noapic nolapic

Kernel command line parameters are specified in the /etc/lilo.conf or /boot/grub/grub.conf file, depending on your choice of boot loader.

Here is an example for LILO:
image=/boot/vmlinuz
label=”linux”
root=/dev/hda1
initrd=/boot/initrd.img
append=”resume=/dev/hda6 splash=silent nosmp noapic nolapic”
read-only

(Remember to run /sbin/lilo after editing lilo.conf, so that your edits take effect.)

And for GRUB:

title Red Hat Linux (2.4.20-28.9)
root (hd0,0)
kernel /vmlinuz-2.4.20-28.9 ro root=/dev/hda2 nosmp noapic nolapic

You can even specify the entries to keep the clock from running too slowly and too quickly together. The entries together for LILO look like this:

image=/boot/vmlinuz label=”linux”
root=/dev/hda1 initrd=/boot/initrd.img
append=”resume=/dev/hda6 splash=silent clock=pit nosmp noapic nolapic”
read-only

And for GRUB:

title Red Hat Linux (2.4.20-28.9)
root (hd0,0)
kernel /vmlinuz-2.4.20-28.9 ro root=/dev/hda2 clock=pit nosmp noapic nolapic

For additional information about working with boot loaders, see your Linux distribution’s documentation.

* SUSE LINUX 9.0 Professional Edition, although its kernel is 2.4-based, includes a patch that raises the clock rate to 1000Hz. This patch is enabled by the kernel parameter desktop. SUSE installations pass this parameter to the kernel by default. To remove the parameter from your guest operating system, follow these steps:

1.
Edit your /etc/lilo.conf or /boot/grub/grub.conf file.
2. Delete all instances of the word desktop.
3. Exit the editor, saving your changes.
4. If you are using LILO, run /sbin/lilo.
5.
Reboot the guest.

* In standard 2.6 kernels, the timer interrupt rate is fixed at kernel compile time and cannot be changed by command line parameters. You can, however, recompile your kernel with a lower timer interrupt rate. 100Hz is adequate for most applications in a Linux guest. See the documentation for your Linux distribution for detailed instructions on how to build and run a custom kernel. Before recompiling the guest kernel, locate the following line in /usr/src/linux-2.6/include/asm-i386/param.h:

#define HZ 1000

Change the value of HZ to 100:

#define HZ 100

A different way to deal with a slow guest clock is to increase the host timer interrupt rate. Current versions of VMware products automatically increase the host’s timer interrupt rate if needed, up to the maximum permitted by the host operating system. In some cases, though, you can increase this maximum.

*
On Windows hosts, 1000Hz is an absolute maximum.

*
On most Linux hosts, VMware is able to increase the timer interrupt rate to 8192Hz by requesting additional interrupts from the /dev/rtc device. However, on a few systems this device may not be configured. On 64-bit systems running Linux 2.4 kernels, the device cannot provide interrupts; on some outdated versions of VMware products, only one virtual machine can use /dev/rtc at a time. To deal with such issues, see http://kb.vmware.com/kb/892.

* For ESX Server, 1000Hz is the default maximum, but you can increase the rate using the technique described at http://kb.vmware.com/kb/1518.

Comments »

The URI to TrackBack this entry is: http://step2k.blogsome.com/2007/12/13/clock-in-a-linux-guest-runs-more-slowly-or-quickly-than-real-time/trackback/

No comments yet.

RSS feed for comments on this post.

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>


Get free blog up and running in minutes with Blogsome
Theme designed by Alex King