How to set governors for Intel to work as old good ondemand?
I used to work on my laptop on ondemand
governor, which was switching CPU frequency depending on CPU usage. It worked quite nice for years and had three very important advantages:
- low hardware temperatures
- quiet fan
- high performance when needed
Now I've upgraded both my laptop (to Lenovo B5400, Intel Pentium 3550M) and system (Ubuntu 14.10) and I've found that:
- only
performance
andpowersave
governors are available;ondemand
is no longer available and supported - something has been changed in setting files, because current governor and min/max speeds are restored to defaults every time I boot up
In consequence my system:
- still turns governor back to
performance
, which is wrong, I believe - whatever governor is, cpufreq-info tells me that "frequency should be within 2.30 MHz and 2.30 GHz" although available frequencies starts from 800MHz
I've tried to edit /etc/init.d/cpufrequtils
defining the following setting:
ENABLE="true"
GOVERNOR="powersave"
MAX_SPEED="2300000"
MIN_SPEED="800000"
I've also tried to edit scaling_min_freq
file in /sys/devices/system/cpu/cpu0/cpufreq
and set it to 800000.
And, guess what, after restarting system I'm again in performance
mode with frequency "scaled between" 2.30GHz and 2.30GHz.
Could you, please, explain me:
a) where exactly in Ubuntu 14.10 are a master settings of min/max CPU frequencies?
b) how to define frequencies and governors to achieve the same result as old good ondemand
? (I would like to work on the lowest frequency possible and go up only on heavy load)
c) and how to avoid resetting what I defined, of course.
I'd be grateful for explanations.
Solution 1:
For compatible processors, by default Ubuntu now uses the intel_pstate CPU frequency governor, whereas it used to use the acpi_cpufreq CPU frequncy governor.
The intel_pstate drive does not have ondemand
mode, but its powersave
mode should be the equivalent of the acpi_cpufreq ondemand
mode. Your system should default to powersave
mode about 1 minute after boot, and via the /etc/init.d/ondemand
script. In the recent past, that script was not properly dealing with the intel_pstate case, but it should have been fixed for all use cases by now. Reference.
To answer your actual questions:
A.) The master min and max frequencies are stored as percentage numbers.cat /sys/devices/system/cpu/intel_pstate/min_perf_pct
cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
The interpretation of those numbers is a function of the turbo enabled or disabled flag, and in my opinion there is an inconsistency in the definitions.cat /sys/devices/system/cpu/intel_pstate/no_turbo
Example from my i7-2600K: min freq 1.6GHz; max non-turbo 3.4GHz; max turbo 3.8GHz.
Therefore as percentages:
Turbo off: max = 100%, min = 47.1%
Turbo on: max = 100%, min = 42.1%
$ cat /sys/devices/system/cpu/intel_pstate/no_turbo
0
$ cat /sys/devices/system/cpu/intel_pstate/min_perf_pct
42
$ cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
100
and
$ cat /sys/devices/system/cpu/intel_pstate/no_turbo
1
$ cat /sys/devices/system/cpu/intel_pstate/max_perf_pct
100
$ cat /sys/devices/system/cpu/intel_pstate/min_perf_pct
42
B.) The intel-pstate powersave
mode should be the equivalent of the acpi-cpufreq ondemand
mode.
C.) There is something wrong, resulting in your grief. There have been other reports similar to yours. Myself, I do not know the root issue, but there have also been reports of incompatibilities with cpufrequtils. I do not know if they are true or not, as I don't use any such things. I only use the most primitive level of controls with the intel-pstate driver.
Solution 2:
I have set it in .bashrc
as an alias (and as root
), because I experienced similar problems.
The aliases look like this:
alias performance="echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"
alias powersave="echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"
alias ondemand="echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor"
You can then write powersave
to enable power-saving option on the BASH
console.
When I want to use a specific scaling governor, i put it in /etc/rc.local
:
#!/bin/sh -e
# rc.local
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
for i in `ls -d /sys/devices/system/cpu/cpu*|grep -v cpufreq|grep -v cpuidle`; do echo ondemand > $i/cpufreq/scaling_governor; done
exit 0
You probably have more than one processor, so edit it accordingly. I'm too lazy to write a short script, but I'll do that if you ask me to do so :)
EDIT: I added the script to /etc/rc.local