Ницца не имеет никакого эффекта в Linux, если не используется та же оболочка

601
felamaslen

Если я вхожу в два разных корневых терминала:

nice -n 19 burnK7 & 

а также

nice -n -19 burnK7 & 

Тогда оба процесса получают около 50% доступного процессорного времени - не ожидаемого и, конечно, нежелательного.

Если я работаю в том же корневом терминале:

 nice -n 19 burnK7 & nice -n -19 burnK7 & 

Первый процесс получает около 0%, а второй получает около 100% доступного процессорного времени, как и ожидалось.

Это ошибка или особенность?

Я использую Arch Linux с версией 3.16 ядра на одноядерном компьютере, что бы это ни стоило.

2
Таким образом, расстановка приоритетов не имеет смысла, если вы не говорите о процессах, запускаемых одной и той же оболочкой, одним и тем же пользователем и т. Д.? Это звучит помешанно. felamaslen 9 лет назад 1
Может ли кто-нибудь подтвердить, что я не схожу с ума, и Linux на самом деле поддерживает общесистемные приоритеты процессов? Если да, то как мне его использовать? Или, если нет, я установлю лучшую ОС. felamaslen 9 лет назад 0

1 ответ на вопрос

5
mtk

Итак, после факта, вот некоторая информация. Поведение, которое вы видите, связано с функцией автогруппы, которая была добавлена ​​в Linux 2.6.38 (в 2010 году). Вот отредактированная версия текста, который я собираюсь добавить на sched(7)страницу руководства, которая объясняет, что вы видите.

Ядро предоставляет функцию, известную как автоматическая группировка, для повышения производительности интерактивных рабочих столов в условиях многопроцессорных нагрузок, интенсивно использующих процессор, таких как сборка ядра Linux с большим количеством параллельных процессов сборки (т. Е. make(1) -jФлаг).

Новая автогруппа создается при создании новой сессии через setsid(2); это происходит, например, когда запускается новое окно терминала. Новый процесс, созданный пользователем, fork(2)наследует членство в родительской группе. Таким образом, все процессы в сеансе являются членами одной и той же автогруппы.

Когда автогруппировка включена, все члены автогруппы помещаются в одну и ту же «группу задач» планировщика ядра. В планировщике ядра Linux используется алгоритм, который выравнивает распределение циклов ЦП по группам задач. Преимущества этого для производительности интерактивного рабочего стола могут быть описаны на следующем примере.

Предположим, что есть две автогруппы, конкурирующие за один и тот же ЦП (т. Е. Предполагается, что либо одна система ЦП, либо использование taskset(1) для ограничения всех процессов одним и тем же ЦП в системе SMP). Первая группа содержит десять процессов, связанных с процессором, из сборки ядра, запущенной сmake -j10, Другой содержит один процесс, связанный с процессором: видеоплеер. Эффект автоматической группировки состоит в том, что каждая из двух групп получит половину циклов ЦП. То есть видеоплеер будет получать 50% циклов ЦП, а не только 9% циклов, что, вероятно, приведет к ухудшению воспроизведения видео. Ситуация в системе SMP более сложная, но общий эффект тот же: планировщик распределяет циклы ЦП по группам задач таким образом, что автогруппа, содержащая большое количество процессов, связанных с ЦП, не в конечном итоге перегружает циклы ЦП за счет из других заданий в системе.

Хорошее значение и групповое планирование

При планировании процессов не в реальном времени (например, тех, которые запланированы в соответствии с SCHED_OTHERполитикой по умолчанию ), планировщик использует метод, известный как «групповое планирование», в соответствии с которым потоки планируются в «группах задач». Целевые группы формируются в различных обстоятельствах, при этом соответствующий случай - это автогруппировка.

Если автоматическая группировка включена, то все потоки, которые (неявно) помещаются в автогруппу (т. Е. В том же сеансе, который создан setsid(2)), образуют группу задач. Таким образом, каждая новая автогруппа является отдельной группой задач.

При групповом планировании хорошее значение потока влияет на планирование решений только относительно других потоков в той же группе задач . Это имеет некоторые удивительные последствия с точки зрения традиционной семантики значения nice в системах UNIX. В частности, если включена автогруппировка (которая используется по умолчанию в различных дистрибутивах), то использование nice(1)процесса имеет эффект только для планирования относительно других процессов, выполняемых в том же сеансе (обычно: в том же окне терминала).

И наоборот, для двух процессов, которые (например) являются единственными процессами, привязанными к ЦП, в разных сеансах (например, в разных оконных окнах, каждое из которых связано с разными автогруппами), изменяя значение nice процесса в одном из сеансов не влияет на решения планировщика относительно процесса в другом сеансе.

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

echo 0 > /proc/sys/kernel/sched_autogroup_enabled 

Имейте в виду, что это также приведет к отключению преимуществ интерактивности рабочего стола, которые должна была обеспечить функция автогруппы (см. Выше).

Хорошая стоимость автогруппы

Членство в автогруппе процесса можно посмотреть через файл /proc/[pid]/autogroup:

$ cat /proc/1/autogroup /autogroup-1 nice 0 

Этот файл также можно использовать для изменения пропускной способности ЦП, выделенной для автогруппы. Это делается путем записи числа в диапазоне «nice» в файл, чтобы установить значение nice для автогруппы. Допустимый диапазон: от +19 (низкий приоритет) до -20 (высокий приоритет).

Параметр nice для автогруппы имеет то же значение, что и значение nice для процесса, но применяется к распределению циклов ЦП в автогруппе в целом на основе относительных значений nice для других автогрупп. Для процесса внутри автогруппы циклы ЦП, которые он получает, будут продуктом приятного значения автогруппы (по сравнению с другими автогруппами) и приятного значения процесса (по сравнению с другими процессами в той же автогруппе).

@ Бурги достаточно справедливо. Отредактированный в том, что я думаю, может быть более удобной формой сейчас. mtk 7 лет назад 1

Похожие вопросы