Чому я не можу використовувати renice для збільшення приємного значення процесу?


25

Від man renice:

Користувачі, крім суперкористувача, можуть лише змінювати пріоритет процесів, якими вони володіють, і можуть лише монотонно збільшувати своє `` приємне значення '' (з міркувань безпеки) в межах від 0 до PRIO_MAX (20) [...]

Отже, я можу reniceвласні процеси вгору (надавати їм нижчий пріоритет), але ніколи вниз:

$ renice 10 22316
22316 (process ID) old priority 0, new priority 10
$ renice 9 22316
renice: failed to set priority for 22316 (process ID): Permission denied

Чому це? Я можу зрозуміти, чому звичайні користувачі не можуть встановлювати приємні значення нижче 0, але чому, оскільки я можу зменшити пріоритет до 10, я не можу знову збільшити його до 9? Яка «причина безпеки» для цього? Я маю право запустити процес з хорошим значенням 9, то чому я не можу відновити його до 9?


EDIT: Я повинен навчитися прокручувати вниз. Виявляється, це вказано як помилка в man renice:

BUGS
     Non super-users can not increase scheduling priorities of their own
     processes, even if they were the ones that decreased the priorities 
     in the first place.

Це ще більше заплутано. Якщо вони вважають цю поведінку помилкою, чому б не змінити її? reniceКоманда з'явилася в 4.0BSD , який я думаю, з 1980 р Це повинно бути дуже легко виправити , так з одного боку , вони , схоже, вирішили залишити його , а з іншого вони перераховують це як помилку.


Оскільки деякі пріоритети, що перевищують 0, можуть бути виконані системним процесом або модулем захисту і ніколи не повинні бути зменшені користувачем (і немає достатнього штрафу управління, щоб визначити мінімальну приємність даного користувальницького процесу, крім фіксованого значення 0) ? Не відповідь, як я не впевнений, але здогад.
lgeorget

Відповіді:


19

Оскільки linux 2.6.12, це залежить від значення обмеження RLIMIT_NICE ( ulimit -e). Котрий може приймати значення від 0 до 40. Цей ліміт більше обмеження пріоритету процесу (чим більше це число, тим вище пріоритет, який користувач може встановити для процесу).

Ви помітите, що, наприклад, значення ubuntu 10,04 за замовчуванням - 20, а в Debian jessie - 0.

Значення nдля цього обмеження означає, що процес без можливості CAP_NICE може збільшувати лише пріоритет процесу до n, що означає зменшення приємності до приємності 20 - n. Отже, для значення 0 це означає, що жоден непривілейований користувач не може знизити приємність нижче 20, тому жоден непривілейований користувач не може знизити приємність.

При значенні 20 непривілейовані користувачі можуть зменшити приємність назад до 0.

Адміністратор повинен вирішити, чи дозволять вони знижувати пріоритет свого процесу та до якого рівня, встановлюючи жорсткий межа для цього.

Про те, чому адміністратор може не хотіти, щоб користувачі знижували пріоритет свого процесу, дивіться відповідь Flup .


1
Ах! Так це налаштовується! Добре, це має більше сенсу, дякую.
тердон

"значення від 0 до 40. [...] Ви помітите, що за замовчуванням це значення 20 на ubuntu 10.04 і 0, наприклад, в jessie Debian." -> Цікаві, жорсткі / м'які уліми для мене дійсно 0 на debian jessie. Я можу підняти до 20, але крім цього я отримую "bash: ulimit: пріоритет планування: не можу змінити ліміт: Недійсний аргумент", негативні значення також не приймаються.
thomanski

20

Це тому, що я б назвав причинами політики . Ідея полягає в тому, що звичайні користувачі не можуть змінювати дії привілейованих користувачів.

Скажімо, ви користувач на величезному спільному сервері. Ви ведете жахливі процеси процесування процесора на шкоду іншим користувачам. Система має reniceдеякі ваші процеси, тому що він вам не дуже подобається. ОС не пам’ятає, хто це зробив renice, але він знає, що звичайні користувачі не можуть змінити дію. Таким чином, sysadmin має контроль над звичайними пріоритетами процесів користувачів.


1
Я можу це зрозуміти, але це все ще здається дивним. Насправді я просто зрозумів, що він навіть вказаний як помилка man renice.
тердон

3
Я думаю, що помилка полягає в тому, що "Не суперкористувачі не можуть збільшити пріоритети планування своїх власних процесів, навіть якщо б вони були тими, хто в першу чергу зменшив пріоритети ". тобто є побічним ефектом цього правозастосування, що випадковий випадок reniceнеможливо змінити, за винятком привілейованого користувача.
Flup

7
Тому що система не пам’ятає, хто встановив пріоритет. В ідеалі, якби ви підняли хороший рівень, а потім хотіли його знизити, це було б дозволено ... але система накладає заборонену дію саме тому, що вона не веде облік того, хто що виголосив, так що ви не можете скасувати reniceщо rootзробив.
Flup

1
@IwillnotexistIdonotexist думає про системи з багатьма користувачами. Sysadmin може захотіти підвищити пріоритет ваших процесів до 5 і знизити рівень моїх до 10. Це все ще в межах нормальних користувачів, але я не зможу його змінити і вкрасти час, який ви заслужили на процесор. Така ідея все одно, як пояснив Flup. Однак, як пояснив StephaneChazelas , це налаштовується, тому саме сисадмін повинен вибрати те, що їм більше подобається.
тердон

1
Відповідь на "чому?" Просто, швидше за все, "тому, що нікому не потрібен був достатній для написання коду, щоб виправити його". Коли Unix був написаний спочатку, відстеження, хто визначає пріоритет процесу, може бути дорогим з точки зору використання пам’яті та робота над її оновленням, але на сучасних машинах це мізерно, просто залишаючи відсутність мотивації для написання коду для відстеження цього для сайтів, які хочуть зберегти оригінальну політику «користувач не може змінити sysadmin».
alanc

-1

Дивно? це працює на мене

Linux clafujiu 2.6.32-57-generic #119-Ubuntu \
 SMP Wed Feb 19 01:04:55 UTC 2014 i686 GNU/Linux

приклад

$ renice 8 --pid 21122
21122: old priority 9, new priority 8
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122   8
21146   0
21155   0
21209   0
christian@clafujiu:~/tmp$ renice 15 --pid 21122
21122: old priority 8, new priority 15
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122  15
21146   0
21155   0
21211   0
christian@clafujiu:~/tmp$ renice 10 --pid 21122
21122: old priority 15, new priority 10
christian@clafujiu:~/tmp$ ps eo "%p %n"
  PID  NI
 4190   0
 8594   0
14684   0
21122  10
21146   0
21155   0
21213   0

2-е редагування

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.4 LTS"

Налаштування змін

/etc/security/limits.conf

@audio          -       rtprio          100
@audio          -       nice            -10

І я є членом аудіогрупи, це полягало в тому, щоб зменшити затримку з джек / бідністю та буферними крюнами під час запису.

renice

$ renice --version
renice from util-linux-ng 2.17.2

На якому дистрибутиві ви? це не на AIX 6.2
Kiwy

Будь ласка, опублікуйте вихід cat /etc/lsb*та renice --versionтакож.
тердон

renice --version renice from util-linux-ng 2.17.2але все-таки на AIX це неможливо
Kiwy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.