Overhead in Increasing the Solaris System Clock Rate
By Jim Connors 14 January 2009
In a previous entry entitled Real-Time Java and High Resolution Timers, we discussed how Sun's Java Real-Time System requires access to timers with a resolution greater than the default 10ms to do anything really interesting. It was also stated that most modern processors have an APIC or Advanced Programmable Interrupt Controller which supports much finer-grained clock tick rates.
Unfortunately there are many instances where a system does indeed
contain an APIC, but it is not exposed by the BIOS.
Furthermore, we've found that some of the embedded, low-power
x86-based processors do not contain an APIC at all. For an
example, take a look at the AMD Geode LX 800 based fit-PC Slim.
So if you wanted to utilize higher resolution timers for this class of system, you'd have to resort to alternative methods. Solaris and OpenSolaris provide two /etc/system parameters called hires_tick and hires_hz to facilitate increasing your default system clock tick. By adding the following line to /etc/system, you'll increase the system clock tick rate from the default of 100 per second to 1,000 per second, effectively changing the clock resolution from 10ms to 1ms.
set hires_tick=1
If you want to further increase the clock resolution, you can do so via the hires_hz system tunable parameter. Although formally unsupported, it does work. In order to, for example, increase the clock tick rate to 10,000, add this to /etc/system:
set hires_tick=1 set hires_hz=10000
To achieve the desired effect above, you must include both the hires_tick assignment in addition to setting the hires_hz parameter.
These modifications do not come without side-effects, and depending upon the hardware in question and the granularity of the desired timer resolution, they could be significant. In short, it takes additional CPU cycles to field all those timer interrupts. So I thought it'd be interesting to see what effect changing the clock tick rate had on two separate systems. Here they are:
System | fit-PC Slim |
Panasonic Toughbook CF-30
(Revision F) |
CPU | AMD Geode LX 800 (500 Mhz) |
Intel Core 2 Duo L7500 1.60GHz |
OpenSolaris Version |
snv_98 | snv_101b |
The measuring tool used for this simple experiment is vmstat(1m).
Solaris aficionados will likely point out that there are much more
accurate alternatives, but I think vmstat(1m) gives a decent feel for
what's going on without having to expend a whole lot of extra
energy. In particular we'll look at the following fields
returned by issuing a 'vmstat
5', and picking one of the interim samples:
The sum of (us + sy + id) should approximate 100%. The
table below shows sample vmstat output on various clock tick
settings for our two hardware platforms.
Clock tics/sec |
100 |
1000 | 10000 | 100000 |
/etc/system settings |
none (default) |
set hires_tick=1 |
set hires_tick=1 set hires_hz=10000 |
set hires_tick=1 set hires_hz=100000 |
vmstat(5) sample fit-PC |
in: 201 us: 0 sy: 1 id: 99 |
in: 2001 us: 0 sy: 5 id: 95 |
in: 19831 us: 0 sy: 43 id: 57 |
n/a |
vmstat(5) sample CF-30 |
in: 471 us: 0 sy: 0 id: 99 |
in: 2278 us: 0 sy: 1 id: 99 |
in: 20299 us: 0 sy: 5 id: 95 |
in: 200307 us: 0 sy: 21 id: 79 |
Notes/Conclusions: