How to change the clock source in the system

Solution Verified - Updated -

Environment

  • Red Hat Enterprise Linux 9
  • Red Hat Enterprise Linux 8
  • Red Hat Enterprise Linux 7
  • Red Hat Enterprise Linux 6
  • Red Hat Enterprise Linux 5
  • Red Hat Enterprise Linux 4

Issue

  • How to check what clock source is currently in use by the system
  • How to override system's configuration specifying a particular clock source
  • How to modify the system time
  • How to configure high precision time

Resolution

Red Hat Enterprise Linux 4

  • Checking the current clock source:

    One can easily perform this task through searching in /var/log/dmesg file for "time":

    # grep "time" /var/log/dmesg
    ...
    Using HPET for base-timer
    Using HPET for gettimeofday
    Using hpet for high-res timesource
    ...
    
  • Verifying documentation on time source kernel parameters:

    In order to check what time source may be used with RHEL4 kernel, one should read the kernel documentation file /usr/share/doc/kernel-doc-2.6.9/Documentation/kernel-parameters.txt:

            clock=          [BUGS=IA-32, HW] gettimeofday timesource override.
                            Forces specified timesource (if available) to be used
                            when calculating gettimeofday(). If specified timesource
                            is not available, it defaults to PIT.
                            Format: { pit | tsc | cyclone | pmtmr }
    
            hpet=           [IA-32,HPET] option to disable HPET and use PIT.
                            Format: disable
    
            notsc           [BUGS=IA-32] Disable Time Stamp Counter
    
  • Overriding the clock source configuration:

    adding clock= to the kernel stanza:

    title Red Hat Enterprise Linux AS (2.6.9-89.ELsmp)
            root (hd0,0)
            kernel /vmlinuz-2.6.9-89.ELsmp ro root=LABEL=/ rhgb quiet clock=pmtmr
            initrd /initrd-2.6.9-89.ELsmp.img
    

Red Hat Enterprise Linux 5

  • Checking the current clock source:

    Unfortunately, as the original snapshot of RHEL5 kernel was done at a time in which the actual linux-2.6 clocksource code was just being introduced for i386 and x86_64, it is not accurate to list the content of files into /sys/devices/system/clocksource/* directories in order to determine the current and the available system clock sources. Instead, to determine the clock source accurately, one should proceed the same as in RHEL4 way: searching in /var/log/dmesg file:

    # grep "time" /var/log/dmesg
    ...
    time.c: Using 3.579545 MHz WALL PM GTOD PIT/TSC timer.
    time.c: Detected 3200.238 MHz processor.
    ...
    
  • Verifying clock source available kernel parameters:

    In order to check what time source may be used with RHEL5 kernel, one should read the kernel documentation file /usr/share/doc/kernel-doc-2.6.18/Documentation/kernel-parameters.txt:

            clock=          [BUGS=IA-32, HW] gettimeofday clocksource override.
                            [Deprecated]
                            Forces specified clocksource (if available) to be used
                            when calculating gettimeofday(). If specified
                            clocksource is not available, it defaults to PIT.
                            Format: { pit | tsc | cyclone | acpi_pm | tsccount | notsccount }
    
            clocksource=    [GENERIC_TIME] Override the default clocksource
                            Override the default clocksource and use the clocksource
                            with the name specified.
    
            hpet=           [IA-32,HPET] option to disable HPET and use PIT.
                            Format: disable
    
            notsc           [BUGS=IA-32] Disable Time Stamp Counter
    
  • Overriding the clock source configuration:

    adding clocksource= to the kernel stanza:

    title Red Hat Enterprise Linux (2.6.18-128.el5)
            root (hd0,0)
            kernel /vmlinuz-2.6.18-128.el5 ro root=LABEL=/ rhgb quiet clocksource=acpi_pm
            initrd /initrd-2.6.18-128.el5.img
    

Red Hat Enterprise Linux 6, 7, 8 and 9

  • Checking the current clock source:

    listing the /sys/devices/system/clocksource/*/current_clocksource file content:

    # cat /sys/devices/system/clocksource/clocksource0/current_clocksource
    hpet
    
  • Verifying available clock sources:

    listing the /sys/devices/system/clocksource/*/available_clocksource file content:

    # cat /sys/devices/system/clocksource/clocksource0/available_clocksource
    hpet acpi_pm
    

    Documentation file RHEL 6:-/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

    Documentation file RHEL 8/9:-/usr/share/doc/kernel-doc-<kernel-version>/Documentation/admin-guide/kernel-parameters.txt


    clocksource= [GENERIC_TIME] Override the default clocksource Format: Override the default clocksource and use the clocksource with the name specified. Some clocksource names to choose from, depending on the platform: [all] jiffies (this is the base, fallback clocksource) [ACPI] acpi_pm [ARM] imx_timer1,OSTS,netx_timer,mpu_timer2, pxa_timer,timer3,32k_counter,timer0_1 [AVR32] avr32 [X86-32] pit,hpet,tsc,vmi-timer; scx200_hrt on Geode; cyclone on IBM x440 [MIPS] MIPS [PARISC] cr16 [S390] tod [SH] SuperH [SPARC64] tick [X86-64] hpet,tsc hpet= [X86-32,HPET] option to control HPET usage Format: { enable (default) | disable | force | verbose } disable: disable HPET and use PIT instead force: allow force enabled of undocumented chips (ICH4, VIA, nVidia) verbose: show contents of HPET registers during setup notsc [BUGS=X86-32] Disable Time Stamp Counter
  • Overriding the clock source configuration:

    Dynamically and temporarily (not persistent to reboots):

    # echo "acpi_pm" > /sys/devices/system/clocksource/clocksource0/current_clocksource
    

    Permanently, adding clocksource= to the kernel stanza:

    title Red Hat Enterprise Linux Server (2.6.32-71.18.2.el6.x86_64)
            root (hd0,0)
            kernel /vmlinuz-2.6.32-71.18.2.el6.x86_64 ro root=LABEL=/ crashkernel=auto clocksource=acpi_pm
            initrd /initramfs-2.6.32-71.18.2.el6.x86_64.img
    

An overview on hardware clock and system timer circuits:

When it comes to talk about a system's clock, the hardware sits at the very bottom. Every typical system has several devices, usually implemented by clock chips, that provide timing features and can serve as clocks. So, which hardware is available depends on the particular architecture. The clock circuits are used both to keep track of the current time of the day and to make precise time measurements. The timer circuits are programmed by the kernel, so they issue interrupts at a fixed, and predefined, frequency. For instance, IA-32 and AMD64 systems have at least one programmable interrupt timer (PIT) as a classical timer circuit, which is usually implemented by an 8254 CMOS chip. Let's briefly describe the clock and timer circuits that are usually found with any nearly modern system of those architectures:

Real Time Clock (RTC)
The RTC is independent of the system's CPU and any other chips. As it is energized by a small battery, it continues to tick even when the system is switched off. The RTC is capable of issuing interrupts at frequencies ranging between 2 Hz and 8,192 Hz. Linux uses the RTC only to derive the time and date at boot time.
Programmable Interrupt Timer (PIT)
The PIT is a time-measuring device that can be compared to the alarm clock of a microwave oven: it makes the user aware that the cooking time interval has elapsed. Instead of ringing a bell, the PIT issues a special interrupt called timer interrupt, which notifies the kernel that one more time interval has elapsed. As the time goes by, the PIT goes on issuing interrupts forever at some fixed (architecture-specific) frequency established by the kernel.
Time Stamp Counter (TSC)
All 80x86 microprocessors include a CLK input pin, which receives the clock signal of an external oscillator. Starting with the Pentium, 80x86 microprocessors sport a counter that is increased at each clock signal, and is accessible through the TSC register which can be read by means of the rdtsc assembly instruction. When using this register the kernel has to take into consideration the frequency of the clock signal: if, for instance, the clock ticks at 1 GHz, the TSC is increased once every nanosecond. Linux may take advantage of this register to get much more accurate time measurements.
CPU Local Timer
The Local APIC (Advanced Programmable Interrupt Controller) present in recent 80x86 microprocessors provide yet another time measuring device, and it is a device, similar to the PIT, which can issue one-shot or periodic interrupts. There are, however, a few differences:
  • The APIC's timer counter is 32 bit long, while the PIT's timer counter is 16 bit long;
  • The local APIC timer sends interrupts only to its processor, while the PIT raises a global interrupt, which may be handled by any CPU in the system;
  • The APIC's timer is based on the bus clock signal, and it can be programmed in such way to decrease the timer counter every 1, 2, 4, 8, 16, 32, 64, or 128 bus clock signals. Conversely, the PIT, which makes use of its own clock signals, can be programmed in a more flexible way.
High Precision Event Timer (HPET)
The HPET is a timer chip that in some future time is expected to completely replace the PIT. It provides a number of hardware timers that can be exploited by the kernel. Basically the chip includes up to eight 32 bit or 64 bit independent counters. Each counter is driven by its own clock signal, whose frequency must be at least 10 MHz; therefore the counter is increased at least once in 100 nanoseconds. Any counter is associated with at most 32 timers, each of which composed by a comparator and a match register. The HPET registers allow the kernel to read and write the values of the counters and of the match registers, to program one-shot interrupts, and to enable or disable periodic interrupts on the timers that support them.
ACPI Power Management Timer (ACPI PMT)
The ACPI PMT is another clock device included in almost all ACPI-based motherboards. Its clock signal has a fixed frequency of roughly 3.58 MHz. The device is a simple counter increased at each clock tick. May introduce issues with sub-millisecond resolution. On modern hardware should be used as a clock source of last resort only.

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Comments