Warum kann ich Renice nicht verwenden, um den Wert eines Prozesses zu erhöhen?

25

Von man renice:

Andere Benutzer als der Superuser dürfen nur die Priorität ihrer eigenen Prozesse ändern und ihren "netten Wert" (aus Sicherheitsgründen) nur monoton im Bereich von 0 bis PRIO_MAX (20) erhöhen. [...]

So kann ich renicemeine eigenen Prozesse aufwärts (mit niedrigerer Priorität) aber niemals abwärts steuern:

$ 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

Warum ist das? Ich kann verstehen, warum normale Benutzer keine netten Werte unter 0 einstellen können, aber warum kann ich die Priorität nicht erneut auf 9 erhöhen, da ich sie auf 10 verringern kann? Welchen "Sicherheitsgrund" gibt es dafür? Ich habe das Recht, einen Prozess mit einem netten Wert von 9 zu starten. Warum kann ich ihn dann nicht auf 9 ändern?


EDIT: Ich sollte lernen, nach unten zu scrollen. Es stellte sich heraus, dass dies als Fehler in aufgeführt ist 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.

Das ist noch verwirrender. Wenn sie dieses Verhalten als Fehler betrachten, warum nicht ändern? Der reniceBefehl ist in 4.0BSD erschienen, was meiner Meinung nach aus dem Jahr 1980 stammt. Dies sollte sehr einfach zu beheben sein, so dass sie einerseits beschlossen haben, ihn zu verlassen, und andererseits ihn als Fehler auflisten.

terdon
quelle
Da einige Prioritäten über 0 möglicherweise von einem Systemprozess oder einem Sicherheitsmodul erzwungen werden und vom Benutzer niemals herabgesetzt werden sollten (und es keine ausreichende Kontrolle gibt, um die minimale Genauigkeit eines bestimmten Benutzerprozesses außer dem festen Wert 0 zu definieren) ? Keine Antwort, da ich nicht sicher bin, aber eine Vermutung.
Lgeorget

Antworten:

19

Seit Linux 2.6.12 hängt das vom Wert von RLIMIT_NICE limit ( ulimit -e) ab. Dies kann Werte von 0 bis 40 annehmen. Diese Grenze ist die Grenze der Priorität des Prozesses (je größer diese Zahl, desto höher die Priorität, die ein Benutzer für einen Prozess festlegen kann).

Sie werden feststellen, dass der Standardwert unter Ubuntu 10.04 20 und unter Debian Jessie 0 ist.

Ein Wert von nfür dieses Limit bedeutet, dass ein Prozess ohne die CAP_NICE-Fähigkeit eine Prozesspriorität nur auf bis zu erhöhen kann n, was bedeutet , dass die Feinheit auf eine Feinheit von verringert wird 20 - n. Bei einem Wert von 0 bedeutet dies, dass kein nicht privilegierter Benutzer die Nizza unter 20 senken kann, sodass kein nicht privilegierter Benutzer die Nizza senken kann.

Bei einem Wert von 20 können nicht privilegierte Benutzer den Wert auf 0 zurücksetzen.

Es ist Sache des Administrators, zu entscheiden, ob er den Benutzern erlaubt, ihre Prozesspriorität zu senken, und auf welche Ebene, indem er das harte Limit dafür festlegt.

Informationen dazu, warum ein Administrator möglicherweise nicht möchte, dass Benutzer ihre Prozesspriorität verringern, finden Sie in der Antwort von Flup .

Stéphane Chazelas
quelle
1
Ah! So ist es konfigurierbar! OK, das macht mehr Sinn, danke.
Terdon
"Werte von 0 bis 40. [...] Sie werden bemerken, dass der Standardwert unter Ubuntu 10.04 und 0 in Debian jessie zum Beispiel 20 ist." -> Interessante, harte / weiche ulimits für mich sind in der Tat 0 auf Debian Jessie. Ich kann bis zu 20 erhöhen, aber darüber hinaus erhalte ich "bash: ulimit: Scheduling-Priorität: kann Limit nicht ändern: Ungültiges Argument", negative Werte werden ebenfalls nicht akzeptiert.
Thomanski
20

Es ist aus politischen Gründen, wie ich es nennen würde . Die Idee ist, dass normale Benutzer die Aktionen privilegierter Benutzer nicht überschreiben können.

Angenommen, Sie sind ein Benutzer auf einem riesigen gemeinsam genutzten Server. Sie führen ungeheure CPU-Hogging-Prozesse zum Nachteil der anderen Benutzer aus. Der Sysadmin ist ein reniceTeil Ihrer Prozesse, weil er Sie nicht sehr mag. Das Betriebssystem kann sich nicht erinnern, wer das getan hat renice, aber es weiß, dass normale Benutzer die Aktion nicht rückgängig machen können. Auf diese Weise hat der Sysadmin die Kontrolle über die Prozessprioritäten der normalen Benutzer.

Flup
quelle
1
Ich kann das verstehen, aber es scheint immer noch seltsam. Tatsächlich habe ich gerade gemerkt, dass es sogar als Fehler in aufgeführt ist man renice.
terdon
3
Ich denke, der Grund für den Fehler ist, dass "Nicht-Superuser die Planungsprioritäten ihrer eigenen Prozesse nicht erhöhen können, selbst wenn sie die Prioritäten überhaupt herabgesetzt haben ". Das heißt, es ist ein Nebeneffekt dieser Durchsetzung, dass ein Unfall renicenur von einem privilegierten Benutzer rückgängig gemacht werden kann.
Flup
7
Weil sich das System nicht erinnert, wer die Priorität eingestellt hat. Wenn Sie den netten Pegel angehoben und dann absenken wollten, wäre dies im Idealfall zulässig ... aber das System verhängt ein pauschales Verbot, gerade weil es nicht aufzeichnet, wer was vernascht hat, sodass Sie einen nicht rückgängig machen können renicedas roottat.
Flup
1
@IwillnotexistIdonotexist denken an Systeme mit vielen Benutzern. Der Systemadministrator möchte möglicherweise die Priorität Ihrer Prozesse auf 5 und die meiner auf 10 erhöhen. Dies liegt immer noch im Bereich normaler Benutzer, aber ich kann es nicht ändern und die CPU-Zeit stehlen, die Sie verdienen. Das ist sowieso die Idee, wie Flup erklärte. Wie StephaneChazelas erklärte , ist dies jedoch konfigurierbar, sodass der Systemadministrator entscheiden kann, was er bevorzugt.
Terdon
1
Die Antwort auf das „Warum?“ Lautet mit größter Wahrscheinlichkeit: „Niemand brauchte es, um den Code zu schreiben und zu reparieren.“ Als Unix ursprünglich geschrieben wurde, war es möglicherweise kostspielig, nachzuverfolgen, wer die Priorität eines Prozesses festlegte Speichernutzung und Arbeit zur Aktualisierung, aber auf modernen Computern ist dies vernachlässigbar, und es fehlt nur die Motivation, den Code zu schreiben, um dies für Websites
nachzuverfolgen
-1

Seltsam ? es funktioniert bei mir weiter

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

Beispiel

$ 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. Bearbeitung

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

Konfigurationsänderungen

/etc/security/limits.conf

@audio          -       rtprio          100
@audio          -       nice            -10

Und ich bin Mitglied der Audio-Gruppe, dies sollte die Latenz bei der Aufnahme mit Jack / Ardor und Buffer Xruns reduzieren.

Renice

$ renice --version
renice from util-linux-ng 2.17.2
X Tian
quelle
In welcher Distribution bist du? es funktioniert nicht unter AIX 6.2
Kiwy
Bitte posten Sie auch die Ausgabe von cat /etc/lsb*und renice --version.
terdon
renice --version renice from util-linux-ng 2.17.2aber immer noch unter AIX ist es nicht möglich
Kiwy