Вопрос или проблема
В руководстве по 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):
-
Каково соответствие наследования для запланированного класса? Является ли TS SCHED_OTHER = Best Effort (io класс 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.