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