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

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

Если я войду в двадругойкорневые терминалы:

nice -n 19 burnK7 &

и

nice -n -19 burnK7 &

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

Если я побегу втакой жекорневой терминал:

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

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

Это ошибка или фича?

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

решение1

Итак, после факта, вот некоторая информация. Поведение, которое вы видите, вызвано функцией автогруппировки, которая была добавлена ​​в 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 потока влияет на решения по планированию.только относительно других потоков в той же группе задач. Это имеет некоторые неожиданные последствия с точки зрения традиционной семантики значения 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 других автогрупп. Для процесса внутри автогруппы циклы ЦП, которые он получает, будут произведением значения nice автогруппы (по сравнению с другими автогруппами) и значения nice процесса (по сравнению с другими процессами в той же автогруппе).

Связанный контент