nice не має ефекту в Linux, якщо не використовується одна і та ж оболонка


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
Тож пріоритетність є безглуздим, якщо ви не говорите про процеси, розпочаті тим самим оболонкою, тим самим користувачем тощо? Це звучить бонкери.
Фела Маслен

Відповіді:


8

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


1
@Burgi Ярмарок досить. Змінено на те, що, на мою думку, зараз може бути більш корисною формою.
mtk

Дуже корисна відповідь, але як хтось змінює приємне значення автогруп? "Цей файл також може бути використаний для зміни пропускної здатності процесора, виділеного для автогрупи". Після знаходження PID (в даному випадку 30218) я хочу змінити значення автогрупи nice, я набрав cat /proc/30218/autogroupйого /autogroup-187 nice 0і повернув, а потім повернув echo "/autogroup-187 nice 10" | sudo tee /proc/30218/autogroupневірну помилку аргументу.
Falk

@Falk: простоecho 10 > /proc/30218/autogroup
mtk

Я спробую це, ти врятував мій бідний ноутбук, дякую.
Falk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.