Отже, добре після факту, ось деякі відомості. Поведінка, яку ви бачите, пояснюється функцією автогрупи, яка була додана в 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)
), утворюють групу завдань. Кожна нова автогрупа є, таким чином, окремою групою завдань.
Під груповим плануванням приємне значення потоку впливає на рішення щодо планування лише відносно інших потоків тієї ж групи завдань . Це має певні дивовижні наслідки з точки зору традиційної семантики приємного значення в системах UNIX. Зокрема, якщо ввімкнено автоматичне групування (що є типовим для різних дистрибутивів), то використання nice(1)
процесу має ефект лише для планування відносно інших процесів, що виконуються в тому ж сеансі (зазвичай: те саме вікно терміналу).
І навпаки, для двох процесів, які є (наприклад) єдиними процесорами, пов'язаними з процесором, на різних сесіях (наприклад, різні вікна терміналу, кожне з яких завдань пов'язано з різними автогрупами), змінюючи приємне значення процесу на одному з сеансів не впливає на рішення планувальника щодо процесу в іншій сесії.
Якщо ви хочете не допустити, щоб автогрупування заважало традиційній nice
поведінці, як описано тут, ви можете відключити функцію
echo 0 > /proc/sys/kernel/sched_autogroup_enabled
Будьте в курсі, що це також матиме наслідком відключення переваг для інтерактивності на робочому столі, які передбачала функція автогрупи (див. Вище).
Приємне значення для автогрупи
Членство в автогрупі в процесі можна переглянути через файл /proc/[pid]/autogroup
:
$ cat /proc/1/autogroup
/autogroup-1 nice 0
Цей файл також може бути використаний для зміни пропускної здатності процесора, призначеного для автогрупи. Це робиться, записуючи номер у діапазон "приємний" у файл, щоб встановити приємне значення автогрупи. Дозволений діапазон - від +19 (низький пріоритет) до -20 (високий пріоритет).
Настройка приємного для автогрупи має те саме значення, що й значення nice процес, але стосується розподілу циклів процесора для автогрупи в цілому, виходячи з відносних значень інших автогруп. Для процесу всередині автогрупи цикли процесора, які він отримує, будуть результатом приємного значення автогрупи (порівняно з іншими автогрупами) та приємного значення процесу (порівняно з іншими процесами в тій же автогрупі).