Разница между хорошим значением и приоритетом в верхнем выводе

11

top , по умолчанию, перечисляет оба столбца. Мне любопытно, в чем разница. Я проверил справочные страницы и не могу понять:

Приоритет:

   h: PR  --  Priority
      The priority of the task.

Хорошее значение:

   i: NI  --  Nice value
      The nice value of the task.  A negative nice value means higher  priority,
      whereas  a  positive  nice value means lower priority.  Zero in this field
      simply means priority will not be adjusted in determining  a  task’s  dis-
      patchability.

Я понимаю, что значение Nice связано с очередью планировщика ЦП ядра; тогда что означает Приоритет ? Возможно, что-то касается ввода / вывода?

Бельмин Фернандес
источник

Ответы:

8

Хорошее значение - это «глобальный» механизм, тогда как приоритет имеет значение для переключателя задач прямо сейчас .

Игнасио Васкес-Абрамс
источник
Что вы подразумеваете под переключателем задач?
Бельмин Фернандес
1
Переключатель задач (правильно называемый «планировщик») представляет собой небольшой код в ядре, который решает, какая задача будет выполняться дальше.
Игнасио Васкес-Абрамс
25

Разница в том, что в настоящий момент PR является реальным приоритетом процесса внутри ядра, а NI - просто подсказка ядру, какой приоритет должен иметь процесс.

В большинстве случаев значение PR можно рассчитать по следующей формуле: PR = 20 + NI . Таким образом, процесс с милостью 3 имеет приоритет 23 (20 + 3), а процесс с милостью -7 имеет приоритет 13 (20 - 7). Вы можете проверить первое, выполнив команду nice -n 3 top. Это покажет, что топ- процесс имеет NI 3 и PR 23 . Но для работы nice -n -7 topв большинстве систем Linux вам нужно иметь привилегии root, потому что на самом деле чем меньше значение PR, тем выше фактический приоритет. Таким образом, процесс с PR 13 имеет более высокий приоритет, чем процессы с стандартным приоритетом PR 20, Вот почему вам нужно быть пользователем root. Но минимальное значение добротности, разрешенное для процесса без полномочий root, можно настроить в /etc/security/limits.conf .

Теоретически ядро ​​может изменить значение PR (но не NI ) само по себе. Например, он может уменьшить приоритет процесса, если он потребляет слишком много ресурсов ЦП, или он может повысить приоритет процесса, если этот процесс не имел возможности долго работать из-за других процессов с более высоким приоритетом. В этих случаях значение PR будет изменено ядром, и NI останется неизменным, поэтому формула "PR = 20 + NI" будет неправильной. Таким образом, значение NI можно интерпретировать как подсказку для ядра о том, какой приоритет должен иметь процесс, но ядро ​​может выбирать реальный приоритет ( значение PR ) самостоятельно в зависимости от ситуации. Но обычно формула«PR = 20 + NI» правильно.

Точные правила того, как ядро ​​меняет приоритет, не ясны. Инструкция setpriority (функция, которая изменяет значение nice) гласит:

Эффект изменения значения nice может варьироваться в зависимости от действующего алгоритма планирования процесса.

Руководство Pthread говорит следующее:

Динамический приоритет основан на значении nice (устанавливается параметрами nice (2), setpriority (2) или sched_setattr (2)) и увеличивается каждый раз, когда квант готов к запуску потока, но запрещен для запуска планировщиком.

Кажется, что значение PR соответствует динамическому приоритету.

Диапазон значений NI составляет -20..19 . Таким образом, значение PR может иметь значения от 0 (20 - 20) до 39 (20 + 19). Но это верно только для процессов с политикой планирования по умолчанию ( SHED_OTHER ). Также могут быть процессы с так называемыми политиками планирования в реальном времени . Это политики SCHED_RR и SCHED_FIFO . Такие процессы имеют значение PR меньше 0. Вы можете проверить это, выполнив chrt -r 1 topкоманду (должен быть пользователем root). Сверху процесс будет иметь PR -2 . Вы даже можете запустить chrt -r 90 topв этом случае верхУ процесса будет PR-91 .

Кажется, что для процессов SCHED_RR значение PR можно рассчитать по формуле:

PR = - 1 - sched_rr_priority .

Таким образом, SCHED_RR процесс имеет по меньшей мере PR -1 а это означает , что любой SCHED_RR процесс имеет более высокий приоритет , чем любой SCHED_OTHER . Это соответствует руководству pthread:

SCHED_FIFO можно использовать только со статическими приоритетами выше 0, что означает, что, когда потоки SCHED_FIFO становятся работоспособными, они всегда будут немедленно вытеснять любой текущий запущенный поток SCHED_OTHER, SCHED_BATCH или SCHED_IDLE.

SCHED_RR - это простое улучшение SCHED_FIFO. Все описанное выше для SCHED_FIFO также относится к SCHED_RR,

Приоритет процессов реального времени называется статическим приоритетом, который не может быть изменен ядром. Таким образом , положительные PR значения могут рассматриваться в качестве динамического приоритета для не в реальном времени ( SCHED_OTHER , SCHED_BATCH ) процессов и отрицательного PR ценность в качестве статического приоритета для процессов в реальном времени ( SCHED_RR , SCHED_FIFO ).

Я тоже пытался бежать nice -n 10 chrt -r 50 topchrt -r 50 nice -n 10 top). Значение NI было 10, но PR все еще было -51 . Таким образом, кажется, что значение NI не влияет на приоритет процессов SCHED_RR . Это соответствует руководству по установке приоритетов :

Любые процессы или потоки, использующие SCHED_FIFO или SCHED_RR, не должны подвергаться воздействию вызова setpriority (). Это не считается ошибкой. Процесс, который впоследствии возвращается к SCHED_OTHER, не должен подвергаться влиянию своего приоритета таким вызовом setpriority ().

Одна забавная записка. Если вы запустите chrt -r 99 top, вы увидите значение RT вместо числа в колонке PR .

  PID USER PR NI VIRT RES SHR S% CPU% MEM TIME + КОМАНДА
28489 root RT 0 2852 1200 896 R 0 0.1 0: 00.01 top

Я не думаю, что это означает, что процесс сейчас особенный. Я думаю, это означает, что top не печатает -100, потому что для печати потребуется 4 символа.

Вы также можете использовать htop вместо top во всех примерах, что может быть более удобным. ps -lтоже можно использовать, но базовая точка, которая разделяет приоритеты в реальном времени и не в реальном времени, не 0, а 60, поэтому nice -n -20 ps -lбудет напечатано

FS UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 R 0 28983 28804 0 60 -20 - 1176 - оч. / 6 00:00:00 пс.
Антон
источник
Как ни странно, если я запускаю 5 бесконечных циклов (int main {while (1);}) на 2-ядерном гиперпоточном i3, их приоритеты остаются постоянными. Это в тестировании Debian SID.
Vorac
1
@ BelminFernandez Я думаю, будет справедливо сделать этот ответ "принятым".
z0lupka
1

Короткий ответ

PR является приоритетным уровнем. Чем ниже PR, тем выше будет приоритет процесса.

PR рассчитывается следующим образом:

  • для нормальных процессов: PR = 20 - NI (NI хорошо и колеблется от -20 до 19)
  • для процессов реального времени: PR = - 1 - real_time_priority (real_time_priority варьируется от 1 до 99)

Длинный ответ

Существует два типа процессов: обычные и в реальном времени. Для обычных (и только для них) метод nice применяется следующим образом:

Ницца

Шкала «добротности» варьируется от -20 до 19, тогда как -20 это самый высокий приоритет и 19 самый низкий приоритет. Уровень приоритета рассчитывается следующим образом:

PR = 20 + NI

Где NI - хороший уровень, а PR - уровень приоритета. Итак, как мы видим, -20 фактически отображается на 0, а 19 - на 39.

По умолчанию значение «хороший» для программы равно 0 бит, и пользователь root может запускать программы с указанным значением «хороший» с помощью следующей команды:

nice -n <nice_value> ./myProgram 

В реальном времени

Мы могли бы пойти еще дальше. Хороший приоритет фактически используется для пользовательских программ. В то время как общий приоритет UNIX / LINUX имеет диапазон 140 значений, значение nice позволяет процессу отображать последнюю часть диапазона (от 100 до 139). Это уравнение оставляет значения от 0 до 99 недоступными, что будет соответствовать отрицательному уровню PR (от -100 до -1). Чтобы иметь доступ к этим значениям, процесс должен быть указан как «в реальном времени».

В среде LINUX существует 5 политик планирования, которые можно отобразить с помощью следующей команды:

chrt -m 

Который покажет следующий список:

1. SCHED_OTHER   the standard round-robin time-sharing policy
2. SCHED_BATCH   for "batch" style execution of processes
3. SCHED_IDLE    for running very low priority background jobs.
4. SCHED_FIFO    a first-in, first-out policy
5. SCHED_RR      a round-robin policy

Процессы планирования можно разделить на 2 группы: обычные политики планирования (от 1 до 3) и политики планирования в реальном времени (4 и 5). Процессы реального времени всегда будут иметь приоритет над обычными процессами. Процесс реального времени может быть вызван с помощью следующей команды (например, как объявить политику SCHED_RR):

chrt --rr <priority between 1-99> ./myProgram

Для получения значения PR для процесса в реальном времени применяется следующее уравнение:

PR = -1 - rt_prior

Где rt_prior соответствует приоритету между 1 и 99. По этой причине процесс, который будет иметь более высокий приоритет по сравнению с другими процессами, будет вызываться с номером 99.

Важно отметить, что для процессов реального времени значение nice не используется.

Чтобы увидеть текущую «правильность» и значение PR процесса, можно выполнить следующую команду:

top

Хорошо отметить, что процессы со значением PR -51, например, соответствуют значению в реальном времени. Есть также некоторые процессы, значение PR которых обозначено как «rt». Это значение фактически соответствует значению PR -100.

(PS: я бы опубликовал картинку, показывающую лучший результат, но у меня нет репутации, чтобы сделать это)

Агустин Баррачина
источник