В современных версиях Ubuntu по умолчанию включена политика управления частотой процессора «ondemand». Эта штука весьма полезна в плане энергосбережения, поскольку устанавливает частоту процессора на минимально возможную, когда нагрузка на процессор невелика.
Однако, недавно я заметил, что у неё есть один недостаток: «ondemand» воспринимает нагрузку на процессор, вызванную операциями ввода-вывода, как «idle». Что это значит? Это значит, что при загрузке процессора операциями ввода-вывода частота процессора зачастую остаётся на пониженном уровне, что создаёт проблемы, если ваша система страдает от печально известного линуксового бага с iowait.
Бороться с таким поведением «ondemand» можно двумя способами.
Первый вариант — отключить энергосберегающий режим процессора. Например, исправив скрипт, который его включает. Он скрывается под вполне логичным именем «ondemand» и располагается в
на
, то процессор будет постоянно работать на максимальной частоте.
Второй вариант — включить для «ondemand» режим, в котором он не будет игнорировать iowait. Это управляется параметром в
После этого скрипт сохраняется в файл
Всё. Теперь при повышении загрузки процессора операциями ввода-вывода, частота автоматически поднимается до максимальной, как мне и хотелось.
Однако, недавно я заметил, что у неё есть один недостаток: «ondemand» воспринимает нагрузку на процессор, вызванную операциями ввода-вывода, как «idle». Что это значит? Это значит, что при загрузке процессора операциями ввода-вывода частота процессора зачастую остаётся на пониженном уровне, что создаёт проблемы, если ваша система страдает от печально известного линуксового бага с iowait.
Бороться с таким поведением «ondemand» можно двумя способами.
Первый вариант — отключить энергосберегающий режим процессора. Например, исправив скрипт, который его включает. Он скрывается под вполне логичным именем «ondemand» и располагается в
/etc/init.d
. Если исправить в этом файле строкуecho -n ondemand > $CPUFREQ
на
echo -n performance > $CPUFREQ
, то процессор будет постоянно работать на максимальной частоте.
Второй вариант — включить для «ondemand» режим, в котором он не будет игнорировать iowait. Это управляется параметром в
/sys/devices/system/cpu/cpufreq/ondemand/io_is_busy
. Для этого я написал маленький init-скрипт: #! /bin/sh
### BEGIN INIT INFO
# Provides: io-is-busy
# Required-Start: $ondemand
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: makes "ondemand" frequency governor to respect iowait load
### END INIT INFO
case "$1" in
start)
start-stop-daemon --start --background --exec /etc/init.d/io-is-busy -- background
;;
background)
sleep 65 # waiting till ondemand finish its' work
echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
echo 0 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy
;;
*)
echo "Usage: $0 start|stop" >&2
exit 3
;;
esac
После этого скрипт сохраняется в файл
/etc/init.d/io-is-busy
, делается исполняемым и прописывается в системе командой sudo update-rc.d io-is-busy defaults 99 99
.Всё. Теперь при повышении загрузки процессора операциями ввода-вывода, частота автоматически поднимается до максимальной, как мне и хотелось.