В современных версиях 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.Всё. Теперь при повышении загрузки процессора операциями ввода-вывода, частота автоматически поднимается до максимальной, как мне и хотелось.