11/03/2008

Управление ядром Linux реального времени - RT-Linux tweaking

Некоторое время назад я писал о том, как собрать ядро реального времени (Complete Preemption, RT) и какая от него польза в народном хозяйстве (синхронное управление компонентами оптической установки). Для управления процессами в RT-версии ядра Linux есть замечательные утилиты из пакета schedutils.


Привязка задачи к процессору
Если у вас многоядерная или многопроцессорная машина, есть смысл некоторые задачи раскидать по процессорам принудительно. Для этих целей есть программа taskset.
# taskset -p 1 5907
Получаем в ответ:
pid 5907's current affinity mask: 1
pid 5907's new affinity mask: 2
Задача, таким образом, перекинута на второй процессор.


Изменение приоритета процессов
Чтобы задача получила приоритет реального времени, следует выполнить команду:
# chrt -p 6091
В ответ должны получить:
pid 6091's current scheduling policy: SCHED_OTHER
pid 6091's current scheduling priority: 0
Это значит, что задача теперь будет выполняться неотложно, с минимально возможными задержками (важно при точной синхронизации событий - например, открывание и закрывание затвора фотокамеры при работе с импульсным лазером).


Изменение приоритета ввода-вывода
Много задач требуют не только точного интервала исполнения (открывание\закрывание затвора), но и чтобы данные перекачивались как можно быстрее. Для этого можно отдать приоритет ввода-вывода наиболее критичной задаче. Другим задачам можно, наоборот, зарезать на время приоритет обращения к дисковой подсистеме.

Возможно выставить следующие типы приоритетов: Бездействие (Idle), Наилучшая работа (Best effort) и Реальное время (Real time).


Приоритет Idle
Программа с приоритетом idle получит диступ к диску только тогда, когда никакие другие программы к диску не обращаются в течение определённого времени.

Приоритет Best effort
Этот приоритет выбирается по умолчанию для любого процесса, который не требует иного приоритета ввода-вывода. Программы наследуют установки процессорного приоритета для приоритета ввода-вывода, можно так же передавать аргумент от 0 (высокий приоритет) до 7 (низкий приоритет). Ресурсы между приложения с одинаковым приоритетом best effort распределяются по принципу "каждой сестре по серьге".

Приоритет Real time
Задачам с приоритетом реального времени выделяется доступ к диску в первую очередь и вне зависимости от происходящего в системе. Поэтому приоритет реального времени следует использовать осторожно, чтобы не перекрыть кислород другим процессам. Как и в случае приоритета best effort, предусмотрено 8 уровней приоритета, от 0 (высокий приоритет) до 7 (низкий приоритет).

Для выбора приоритета следует указывать параметр -с и значения:
-с1 --- реальное время (real time)
-с2 --- наилучшая работа (best effort)

-с3 --- бездействие (idle)
Для указания параметра приоритета используется ключ -nM, где M - число от 0 (высокий приоритет) до 7 (низкий приоритет).

Например, чтобы задать приоритет реального времени с высшим приоритетом для ввода-вывода приложения с идентификатором
# ionice -c1 -n0 -p5812
После этого приложению уже никто не помешает монопольно использовать ввод-вывод.

9 комментариев:

  1. Тут вспоминается такая проблема: при активной работе винчестера (IDE) начинают притормаживать (а то и конкретно лагать) устройства ввода (мышь, клавиатура).
    Поэтому вопрос — ionice и в самом деле только приоритетом дисковой подсистемы управляет или всем I/O (в т.ч. устройствами ввода)?
    * Вижу, выше написан перевод man'а, в котором это так же неясно :)

    ОтветитьУдалить
  2. Вот интересно, если есть загруженный хостинг, наиболее ресурсоемкий процесс - mysqld. Что будет, если ему поставить приоритет реального времени?
    chrt -p `pidof mysqld`

    ОтветитьУдалить
  3. 2 HoverHell пишет...
    при активной работе винчестера (IDE) начинают притормаживать (а то и конкретно лагать) устройства ввода (мышь, клавиатура).
    Для этого RT режим и есть - поставил приоритет реального времени, и никто на вашу мышь вместе с иксами больше не покушается.

    Поэтому вопрос — ionice и в самом деле только приоритетом дисковой подсистемы управляет или всем I/O
    Насколько я понимаю, только I/O связанным с дисковой подсистемой.

    Вижу, выше написан перевод man'а, в котором это так же неясно :)
    А вы никогда не задумывались о том, что многие маны написаны очень дурно и по этой причине их никто не читает?

    Вот интересно, если есть загруженный хостинг, наиболее ресурсоемкий процесс - mysqld. Что будет, если ему поставить приоритет реального времени?
    Остальные процессы рискуют поседеть до того, как получат доступ к ресурсам. :-)

    ОтветитьУдалить
  4. а нет ли какой либо программы, которая сама бы равномерно загружала оба процессора? Ну или хотя бы пыталась это сделать

    ОтветитьУдалить
  5. ну вы про маны загнули батенька - тяжело конечно бывает, но это в любой документация IMHO бывает, да и на блоге у Вас тоже встречается

    ОтветитьУдалить
  6. а не подскажете какому конкретно процессу надо поставить приоритет реального времени, что бы мышь не лагала?

    ОтветитьУдалить
  7. @librarian
    а нет ли какой либо программы, которая сама бы равномерно загружала оба процессора?
    Есть. Это ядро Linux :-) И оно с этим прекрасно справляется.

    @mariuple,
    ну вы про маны загнули батенька - тяжело конечно бывает, но это в любой документация IMHO бывает
    Оно не бывает, это постоянная практика. Типа у автора всё работает, а остальные идут лесом.

    да и на блоге у Вас тоже встречается
    Ссылки в студию. Я серьёзно. Перепишу пост, если халтура.

    @Анонимный,
    а не подскажете какому конкретно процессу надо поставить приоритет реального времени, что бы мышь не лагала?
    Я не настолько телепат, чтобы PID-ы процессов по анонимным комментам угадывать. :-) Но в комменте я прозреваю убунтовца, а если я прав, то RT тут не поможет. Я не знаю, что они в Каноникле делают с Гномом, но по крайней мере Убунта 10.10 тормозит безбожно (запуск гимпа 40 секунд, запуск Kile больше минуты)...

    ОтветитьУдалить
  8. имеет ли смысл на системе с установленным ядром реального времени давать привязку задачи к процессору , если процессор одноядерный но с технологией Hyper Threading?

    ОтветитьУдалить
  9. @Анонимный комментирует...
    имеет ли смысл на системе с установленным ядром реального времени давать привязку задачи к процессору

    А он всё равно один - смысла я в этом не вижу. Этот пост был написан с прицелом (и сейчас вот как раз используется мной) для многоядерных\многопроцессорных систем.

    если процессор одноядерный но с технологией Hyper Threading?
    ГиперТреадинг, на мой скромный взгляд, это самая большая ложь и обман, который вообще можно себе позволить высказать на публике. Мне не известно ни одно реальное применение или задача, где гипертреадинг реально улучшали производительность. Речь не идёт о синтетических тестах (которые Интел как раз и пиарила). Сейчас на Core i7 что-то все про HyperThreading не вспоминают и вообще стараются о нём в приличном обществе не говорить.

    Многоядерные процессоры это, собственно, и есть HyperThreading который работает. И то не так уж много приложений, которые реально используют Dual/Quadrcore на всю катушку (сжатие видео\аудио, компиляция, виртуализация).

    ОтветитьУдалить