3

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

nice -n 19 burnK7 &

а также

nice -n -19 burnK7 &

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

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

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

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

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

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

1 ответ1

6

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .