Пользователь
0,0
рейтинг
23 декабря 2010 в 02:51

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

В современных версиях 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.

Всё. Теперь при повышении загрузки процессора операциями ввода-вывода, частота автоматически поднимается до максимальной, как мне и хотелось.
braintorch @braintorch
карма
5,5
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (63)

  • –6
    Ubuntu way: лечить симптомы а не багу
    • +12
      Вылечите багу, не стесняйтесь. Она ждала вас 3 года. За это время ни у кого не получилось, но я в вас верю.
      • 0
        try 2.6.34 luke
        да, и кстати что думает ТС на тему взаимосвязи iowait и спящего режима проца в общем и целом а так же почему возросшая частота процессора затронула iowait в лучшую сторону
        • +1
          Ну, в моём конкретном случае, это больше баг железа, чем софта, поскольку Windows 7 ведёт себя примерно так же, а баг воспроизводится на всех версиях ядра. Подозреваю, что причина в кривой реализации ADMA в чипсете nForce 500 SLI с одной стороны, и в не менее кривой реализации NCQ в некоторых винтах Western Digital (в результате чего на этих моделях NCQ в ядре заблокирован) — с другой. При копировании больших объёмов данных (особенно по сети) это приводит в солидной загрузке процессора, поэтому в данной ситуации повышение частоты процессора немного помогает.

          Собственно, топик как раз и предназначен для тех, кто страдает от похожих проблем.
      • 0
        Баг — это очень печально. Благодаря ему (наелся) сейчас серьёзно рассматриваю вариант ухода на FreeBSD на десктопе.
        • +1
          Когда надоест собирать час за часом софт из портов, возвращайтесь!

          У самого стоит ArchLinux, Ubuntu, FreeBSD. Последняя только «для побаловаться», потому что система портов реально утомляет по сравнению с тем же pacman.
          • 0
            На 2ядерной машине это довольно быстро :) На 4ядерной ещё быстрее.
            Более того, я начинал 5 лет назад именно с BSD, и даже на одноядерном атлоне XP в те времена всё работало довольно неплохо. Если, конечно, OpenOffice не собирать каждый день :) Но в BSD и бинарники есть, на крайний случай.
            • 0
              Там за основными портами конечно хорошо следят, но за теми, что нужны на десктопе, часто контроль плохой, в итоге сранные баги только и делают, что лезут.
              • 0
                в итоге сранные баги только и делают, что лезут.


                Вы, вероятно опечатались в слове «сраные». А лезут точно, да, как из рога изобилия.
            • 0
              Ой, да ладно. Сам недавно обновлял кеды — с -j5 и использованием mdfs для $WRKDIR (чтобы ускорить I/O). Всё довольно печально. Машинка, кстати, Phenom II X4 945. С тех пор кеды в портах уже опять обновились, но повторять сборку мне пока что неохота.

              Хотя это был portupgrade, а не простой нативный make. Чем дальше, тем больше изъянов я у этого portupgrade нахожу.

              А на бинарники полагаться особо не стоит. Не раз напарывался на ситуацию, когда хочешь поставить пакет, а тебе говорят «ой, пакета не существует, ставьте порт». Как-то так…
              • 0
                portupgrade же это просто ruby обертка, нет? Впрочем ruby это очень тормозной язык, причем видимо, что называется by design. За простоту нужно платить
                • 0
                  Там даже не в языке проблема, а в алгоритме обхода дерева при разрешении зависимостей пакетов. Кеды зависят от кутей, которые разбиты на много мелких пакетов. Каждый мелкий пакет указывает на один и тот же тарбол с исходниками (127 метров). portupgrade при обновлении проверяет, для всех ли пакетов скачаны тарболы и считает контрольную сумму. То есть, для каждого из этих qt-пакетов считает контрольную сумму большого тарбола qt — в моём случае несколько десятков раз!!! Затем находит пакет, для которого нет тарбола, качает его, и начинает проверять дерево зависимостей с самого начала. Снова проходит по всем этим пакетам, снова считает по нескольку десятков раз контрольную сумму большого тарбола qt… В общем, казалось, что это будет длиться вечно.

                  Плюнул, сел и обновился вручную по частям. Но осадок остался.
                  • 0
                    Мдя… ощущения как от студенческой поделки, ну не ужели про кеширование они не слышали?
            • 0
              Кстати, я тоже начинал именно с BSD и именно на одноядерном атлоне. Только 4 года назад, а не 5.
  • +5
    Эм. А смысл городить огород с отдельным скриптом вместо добавления одной строки в /etc/rc.local?
    • 0
      Смысл в том, что по умолчанию, судя по всему, в ядре указана политика «performance». Если она включена, то каталог /sys/devices/cpu/cpufreq пуст. Соответственно, параметры работы «ondemand» указать не получится. Поэтому мне хотелось привязать свой костыль к убунтушному (который включает ondemand). Убунтушники сделали так, чтобы система и рабочий стол грузились, пока стоит политика «performance», а потом автоматом включался «ondemand».
      • +1
        Замечательно. Только смысл было городить отдельный скрипт? Если внимательно посмотреть на содержимое /etc/rcX.d (вместо X подставить цифру), то можно заметить, что rc.local (S99rc.local) выполняется в том же порядке, что и ваш велосипед .
        На третий день Зоркий Глаз заметил, что у сарая нет стены
        • +2
          Ага, только Зоркий Глаз ещё и заметил, что убунтушный костыль выполняется с задержкой 60 секунд. Так что скрипт городить всё равно надо, хотя бы однострочный. Хотя, кому хочется, может, конечно, и в rc.local прописать что-нибудь вроде «sleep 60 && echo 1 > /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy». Я сделал по своему, мне и так хорошо.
  • 0
    А можно уточнить, речь идет о сервере (голая консоль) или о десктопе с иксами?
    Просто на десктопе вопрос решается активацией аплета Гнома и не требует ни каких скриптов.
    • +1
      А можно чуточку подробнее? Какой аплет?)
      • +1
        «Монитор изменения частоты процессора», сам им пользуюсь.
        Единственный недостаток — приходится для каждого ядра устанавливать свой апплет.
        • 0
          core2duo e720, ubuntu 10.04 — не работает

          • 0
            Скорее всего, что-то нужно не установлено. Спросите на форуме, посвященном ubuntu, что нужно для работы.
    • +1
      Перечитайте статью, будьте добры. Речь идёт не о включении режима энергосбережения, а о настройке одного из его параметров.
      • 0
        Все равно не понял, гномовский апплет позволяет как минимизировать частоту, так и выставить среднюю и максимальную, и независимо имеет две настройки: «энергосбережение» и «производительность». Что я не правильно прочитал в статье?
        • 0
          Гномовский апплет не позволит настроить режим ondemand так, чтобы он воспринимал iowait не как idle, а как загруженность процессора.
  • +3
    >печально известного бага с iowait

    Простите мне мою безграмотность, какого бага?
  • +3
    google://12309
    • 0
      Спасибо.
  • +1
    У меня этот параметр по умолчанию включен. убунту 10.10 на работе и генту дома
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      Возможно и так. Вот только у меня на некоторых версиях ядра банальное переключение между соседними окнами занимало от 20 секунд до минуты, когда система загружена iowait. Странный iowait.
      • НЛО прилетело и опубликовало эту надпись здесь
        • 0
          А как IO подсистема связана, пардон, с переключением между окнами?
          • НЛО прилетело и опубликовало эту надпись здесь
            • 0
              Ну какое может быть обращение к файлам при переключении между двумя окнами виртуального терминала? А своп отключен, такие дела.
              • НЛО прилетело и опубликовало эту надпись здесь
                • 0
                  Да, причём заметно. Теперь я даже могу рулить плеером, при запущенной виртуальной машине, копировании по сети в фоне и работающем свопе.
                  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    поведайте зачем скрипт, плз.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    На днях посыпалась одна планка памяти, вынул ее. Теперь я тоже не по наслышке знаю, что такое баг «12309»! Ловлю перманентные тормоза с IOWait. =\
  • 0
    Что то я не понял, код /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy
    этого скрипта где можно найти?
    • 0
      Это не код, это файл по адресу /sys/devices/system/cpu/cpufreq/ondemand/io_is_busy. Директория /sys/devices/system/cpu/cpufreq/ondemand/ появляется, если включён режим управления частотой процессора «ondemand».
  • 0
    А как можно лично увидеть эту проблему с iowait? Впервые про неё слышу, нужно ведь убедиться что нужно что-то предпринимать :)
    • +2
      lurkmore.ru/12309
      там есть инструкция
      • 0
        Офигеть. Чего только на лурке нет. о_О
  • 0
    Я согласен с pentarh.
    На длительность процессов ввода-вывода влияет, преимущественно, скорость жёсткого диска.
    Длительное переключение между окнами вызвано малым объёмом оперативной памяти.
    Окно не нарисуется, пока жёсткий диск не выдаст своп.
    Увеличение частоты процессора на скорость считывания информации с диска в память ровно никак не повлияет.
    Единственный результат работы скрипта — тёплый воздух в комнате и лишняя денюшка чубайсам.
    Я такую проблему решил раз и на всегда, докупив гиг памяти и совсем отключив своп в fstab.
    • 0
      А относительно профилей энергопотребления иногда включаю powersave на ночь. 700 мгц для качалки вполне хватает, а всякие флеш-баннеры пускай отдыхают. Результат — ровный и тихий шум вместо постоянно меняющейся скорости вентилятора, спать мешает намного меньше.

      Главное утром не забыть сделать
      cpufreq-selector -g ondemand

      Можно засунуть в крон. Понятное дело, от рута или через sudo.
      • 0
        Я ночью вообще компьютер выключаю, у меня сервачок на балконе стоит для этих дел.
    • 0
      Длительное переключение между окнами вызвано малым объёмом оперативной памяти.
      Окно не нарисуется, пока жёсткий диск не выдаст своп.

      Я уже писал, что своп был отключен и так.
      • 0
        Тогда система при переключении окон сама «разгонит» процессор, если дело в нём. Непонятно, зачем его держать горячим всё время.
        • 0
          Вы вообще статью читали или так, только заголовок?
          • 0
            > есть один недостаток: «ondemand» воспринимает нагрузку на процессор, вызванную операциями ввода-вывода, как «idle». Что это значит?

            Idle (от английского «бездействие») — это значит, что операции ввода-вывода не загружают процессор. Это называется IOwait (от английского «ждать») — процессор ждёт, пока жёсткий диск спозиционирует головки, проведёт операцию чтения или записи. Сам процессор при этом ничего не делает. Скорость позиционирования головок диска не зависит от тактовой частоты процессора. Следовательно, ускорить процесс ввода-вывода разгоном процессора нельзя. Любой современный процессор (даже в полуспящем режиме) обрабатывает данные более, чем на порядок быстрее любого жёсткого диска. Даже на 2 порядка. Ваш скрипт заставляет процессор ждать данных быстрее. Но быстрее они от этого прочитаны не будут. Прироста скорости нет. Проверье же, со скриптом и без. Только читайте разные файлы одинакового размера, а не один и тот же файл — дисковые операции кэшируются, что может исказить результат при чтении одного и того же файла. Для верности можно вообше перезагрузиться.

            Также Вы совершенно напрасно думаете, что ядро не в состоянии самостоятельно переключать тактовую частоту в режиме ondemand. Если тактовая частота не поднимается самостоятельно ядром, то это одначает только одно — отсутствие нагрузки. Это Вы тоже можете проверить самостоятельно, почитав официальные руководства или заглянув в исходники ядра.

            Мне скорее кажется, что это Вы не читали статью… Или не писали. Потому что работает этот скрипт так: процессор греется, электричество тратится, скорость работы НЕ увеличивается.
            • 0
              А теперь представьте себе, что в результате бага в драйвере (или в самом чипсете) у вас неправильно работает DMA (включение ADMA в драйвере для сата-контроллера приводит к потере данных, не нашёл данных о том, что такое это ADMA — то ли альтернативное название для DMA, то ли его расширение). И из-ха неправильной работы DMA дисковая активность ложится на центральный процессор. При этом ядро регистрирует эту активность как iowait и воспринимает как idle.
              • 0
                Ссылка на багрепорт есть?

                > И из-ха неправильной работы DMA дисковая активность ложится на центральный процессор

                Такая дисковая активность — порядка 20 мегабайт в секунду. Даже в энергосберегающем режиме эта активность не загрузит процессор и на 5%. Процессор практически отдыхает. Резона поднимать тактовую частоту у ядра нет.

                Перечитайте ещё раз в моём предыдущем комментарии тезис про два порядка.
                • 0
                  Знаете, я устал с вам спорить. Вам если не нужна эта фича — не используйте, ваше счастье.

                  А ваши сомнения по поводу полезности параметра io_is_busy можете отсылать автору следующего патча: kerneltrap.org/mailarchive/git-commits-head/2010/5/18/32999

                  Уверен, он вам гораздо лучше объяснит, зачем он его написал и как он работает.
                  • 0
                    Жаль, что устали. Проверить было бы быстрее, чем спорить.

                    Апплет «системный монитор» отлично показывает iowait, только другим цветом. И без всяких патчей, и без лишнего нагрева.

                    На реальное быстродействие на абсолютном большинстве систем патч не влияет. Фича не нужна.
                    • 0
                      Я прекрасно знаю, что показывает. И прекрасно знаю, что на моей системе — влияет. И лично мне эта фича нужна. Возможно, и ещё кому-нибудь пригодится.

                      Но вы, конечно, можете убедить автора патча в том, что он дурак, потому что его написал. А потом убедить Торвальдса, что тот дурак, потому что принял патч в ядро. Тогда они его уберут и мир станет светлым и прекрасным.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.