Что эквивалентно ionice none: prio 0?

Вопрос или проблема

В руководстве по ionice указано:

Обратите внимание, что до ядра 2.6.26 процесс, который не запрашивал приоритет ввода-вывода, формально использует “none” в качестве класса планирования, но планировщик ввода-вывода будет рассматривать такие процессы так, как если бы они находились в классе с наилучшим усилием. Приоритет в классе с наилучшим усилием будет динамически определяться на основе уровня nice процессора: io_priority = (cpu_nice + 20) / 5.

Для ядер после 2.6.26 с планировщиком ввода-вывода CFQ процесс, который не запрашивал приоритет ввода-вывода, наследует класс планирования CPU. Приоритет ввода-вывода определяется из уровня nice процессора (так же, как и до ядра 2.6.26).

Я работаю на версии 2.6.26 и выше, но это оставляет некоторые открытые вопросы (предполагаю CFQ):

  1. Каково соответствие наследования для запланированного класса? Является ли TS SCHED_OTHER = Best Effort (io класс 2)?

  2. При использовании команды ionice -p для получения значения возвращается none: prio 0. Однако формула, упомянутая в man ionice, предполагает, что тот же процесс (cpu nice ноль) будет best-effort: prio 4, так как (0 + 20) / 5 = 4.

Поэтому на данный момент я предполагаю, что none: prio 0 = best-effort: prio 4, но надеюсь, что кто-то сможет процитировать исходный код ядра, чтобы доказать, что это авторитетно верно.

1)
Из документации sched-design-CFS.txt:

CFS означает “Совершенно справедливый планировщик” и является новым “настольным” планировщиком процессов, реализованным Инго Молнаром и объединенным в Linux 2.6.23. Это замена предыдущему коду интерактивности планировщика vanilla SCHED_OTHER.

Похоже, вы путаете планировщик O(1) с планировщиком ввода-вывода CFQ.

Итак, существуют политики SCHED_{NORMAL, BATCH, IDLE}. IDLE не имеет никаких приоритетов. А также классы планировщика idle, best-effort и realtime.

2) К сожалению, вы не показываете, какие команды вы вводили. Например, измените io-планирование init на класс best-effort.

# ionice -p 1
none: prio 0
# ionice -c2 20 -p 1
# ionice -p 1
best-effort: prio 4

Ответ или решение

Для понимания эквивалента none: prio 0 в контексте управления приоритетами ввода-вывода (I/O) в Linux, важно учесть несколько ключевых аспектов, касающихся механизма планирования I/O и характеристик процессов в операционной системе.

Контекст работы с ionice

Команда ionice используется для задания и изменения класса и приоритета I/O для процессов. Параметры none и prio 0 означают, что процесс не имеет явного запроса на управление приоритетом ввода-вывода. Важно отметить, что поведение системы I/O зависит от версии ядра Linux.

Версии ядра и поведение классов

Согласно документации:

  • Для версий ядра до 2.6.26 процесс, который не запрашивал приоритет I/O, обрабатывался как none, но фактически планировщик I/O считал такие процессы как относящиеся к классу "best effort". Приоритет внутри этого класса динамически определялся как io_priority = (cpu_nice + 20) / 5.

  • С версии ядра 2.6.26 и выше с усовершенствованным CFQ (Completely Fair Queuing) планировщиком I/O, процесс, не указывающий приоритет I/O, унаследует класс планирования CPU.

Ответ на вопросы

1. Наследование классов планирования

В вашем вопросе затрагивается вопрос о соответствии классов планирования. Класс SCHED_OTHER (также известный как SCHED_NORMAL) соответствует классу "best effort" с I/O классом 2. Это значит, что, когда процесс работает с SCHED_OTHER, он может считаться "хорошо справляющимся" с нагрузкой при I/O.

2. Анализ значения none: prio 0

Получив значение none: prio 0 с помощью команды ionice -p, вы столкнулись с противоречием, так как согласно формуле, процесс с cpu nice равным нулю должен показывать best-effort: prio 4. Это может быть связано с тем, что в случае явного указанного класса I/O (то есть при использовании команды ionice -c2 20 -p [PID]), процессу назначается класс "best-effort" с соответствующим приоритетом.

Следовательно, можно утверждать, что none: prio 0 соответствует классу "best effort", но на данный момент не учитывает приоритет, который был бы определен по формуле на основе cpu nice. Другими словами, на уровне пользовательского интерфейса (ionice) процесс не запрашивает явного приоритета, а фактически остается вне ограничений, наложенных на классы.

Заключение

Итак, ваше предположение, что none: prio 0 эквивалентен best-effort: prio 4, можно интерпретировать как точное и информированное, но в контексте явного запроса к системе это не совсем точно. Согласно содержанию кода ядра и документации, процесс с none: prio 0 не имеет сформированного приоритета, даже если он может быть интерпретирован как "best effort" на основе уровня cpu nice.

Таким образом, вам стоит учитывать, что none: prio 0 подразумевает отсутствие явного управления, в то время как best-effort: prio 4 – это активная попытка управления приоритетами, что считается более предпочтительным в случаях высокой нагрузки I/O.

Оцените материал
Добавить комментарий

Капча загружается...