Pull to refresh

Политика управления частотой процессора «ondemand» и iowait в Ubuntu

Reading time 2 min
Views 32K
В современных версиях Ubuntu по умолчанию включена политика управления частотой процессора «ondemand». Эта штука весьма полезна в плане энергосбережения, поскольку устанавливает частоту процессора на минимально возможную, когда нагрузка на процессор невелика.

Однако, недавно я заметил, что у неё есть один недостаток: «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.

Всё. Теперь при повышении загрузки процессора операциями ввода-вывода, частота автоматически поднимается до максимальной, как мне и хотелось.
Tags:
Hubs:
+31
Comments 63
Comments Comments 63

Articles