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