I am looking for a mechanism to dynamically disable cores in Linux in order to minimize power consumption.
Unfortunately, disabling cores using the following simple approach actually increases power, based on readings from a Watts Up? Pro measuring total system power:
echo 0 > /sys/devices/system/cpu/cpu7/online
My experience seems to be confirmed by others (although this bug has been marked "CLOSED PATCH_ALREADY_AVAILABLE"): https://bugzilla.kernel.org/show_bug.cgi?id=5471
Since the machine is unloaded, I want all but one of the cores (or perhaps two "cores", since the CPU is hyper-threaded) to be in the deepest possible sleep state. This does not seem to be happening on its own, based on the output of acpitool:
Processor ID : 7 Bus mastering control : no Power management : yes Throttling control : no Limit interface : no Active C-state : C0 C-states (incl. C0) : 3 Usage of state C1 : 899 (99.3 %) Usage of state C2 : 6 (0.7 %)
BTW, one point of confusion for me is that acpitool and /proc/acpi seem to disagree about the available C-states, or perhaps they use different naming schemes.
$ cat /proc/acpi/processor/CPU7/power active state: C0 max_cstate: C8 maximum allowed latency: 2000000000 usec states: C1: type[C1] promotion[--] demotion[--] latency usage duration C2: type[C2] promotion[--] demotion[--] latency usage duration C3: type[C3] promotion[--] demotion[--] latency usage duration
This seems to indicate that there are 4 C-states (C0-C3), but acpitool only reports 3 C-states.
Really this boils down to two questions:
- Is there a (safe) way to force individual cores into a specific sleep state (C-state), and force them to remain there until I explicitly wake them up?
- Alternatively, how can I improve the ability of the OS to automatically put cores into deeper sleep states more consistently?
Note that the latency of waking up from deeper sleep states is not a concern. FWIW, I am running Ubuntu 10.04.3 (kernel 2.6.32-38) on an Intel i7 920.