Linux folgt (noch) nicht dem POSIX.1-Standard, der besagt, dass ein renice
On-Prozess "alle System-Scope-Threads im Prozess" betrifft, da laut pthreads (7) doc "Threads keinen gemeinsamen Nice-Wert haben".
Manchmal kann es jedoch praktisch sein, renice
"alles" zu tun, was sich auf einen bestimmten Prozess bezieht (ein Beispiel wären untergeordnete Apache-Prozesse und alle ihre Threads). So,
- Wie kann ich
renice
alle Threads, die zu einem bestimmten Prozess gehören? - Wie kann ich
renice
alle untergeordneten Prozesse, die zu einem bestimmten Prozess gehören, ausführen?
Ich suche eine ziemlich einfache Lösung.
Ich weiß, dass Prozessgruppen manchmal hilfreich sein können, aber sie stimmen nicht immer mit meinen Vorstellungen überein: Sie können eine breitere oder andere Gruppe von Prozessen umfassen.
Die Verwendung einer von cgroup
verwalteten systemd
Software kann ebenfalls hilfreich sein, aber selbst wenn ich daran interessiert bin, etwas darüber zu erfahren, suche ich meistens nach einer "Standard" -Lösung.
BEARBEITEN: man (7) pthreads
sagt auch, dass "alle Threads in einem Prozess in derselben Thread-Gruppe platziert werden; alle Mitglieder einer Thread-Gruppe haben dieselbe PID". Ist es also überhaupt möglich, renice
etwas zu tun, das keine eigene PID hat?
man (7) pthreads
sagt über die aktuelle (NPTL-) Implementierung: "Alle Threads in einem Prozess werden in dieselbe Thread-Gruppe gestellt; alle Mitglieder einer Thread-Gruppe haben dieselbe PID" und "Threads haben keinen gemeinsamen Wert". Wie können Sie dann einen Thread, der keine eigene PID hat, umbenennen, wenn Sie dazurenice
eine PID verwenden?24995 (process ID) old priority 0, new priority -10
. 24995 erscheint nicht inps
, es ist also kein Prozess. Vielleicht funktioniert es tatsächlich, Threads zu erneuern?Guter Wert oder CPU-Anteile?
Bitte beachten Sie, dass nette Werte heutzutage möglicherweise "systemweit" nicht mehr so relevant sind, da die Aufgaben automatisch gruppiert werden, insbesondere wenn systemd verwendet wird . Bitte lesen Sie diese Antwort für weitere Details.
Unterschied zwischen Threads und Prozessen
Wichtige Frage zu Linux, da die Dokumentation Zweifel aufkommen lässt (zum Beispiel über Threads ohne eigene PID).
Hinweis: Diese Antwort erklärt Linux-Threads genau.
Kurz gesagt: Der Kernel verarbeitet nur "ausführbare Entitäten", dh solche, die ausgeführt und geplant werden können . Kerneltechnisch werden diese Entitäten Prozesse genannt. Ein Thread ist nur eine Art Prozess, der (mindestens) Speicherplatz und Signalhandler mit einem anderen teilt.
Jeder dieser Prozesse hat eine systemweit eindeutige Kennung: die PID (Process ID). Bei sogenannten Threads wird es manchmal als TID (Thread ID) bezeichnet, aber aus der Sicht von Sysadmin (und Kernel!) Sind TID und PID dasselbe (sie haben denselben Namespace).
Als Ergebnis Sie können
renice
jeden „Faden“ einzeln , weil sie ihre eigene PID 1 .Ermitteln aller PIDs zu
renice
rekursivWir müssen die PIDs aller Prozesse ("normal" oder "thread") abrufen, die vom zu prüfenden Prozess abstammen (untergeordnete Prozesse oder in der Thread-Gruppe). Dies sollte rekursiv sein (unter Berücksichtigung der Kinder von Kindern).
Die Antwort von Anton Leontiev gibt den Hinweis, dies zu tun: Alle Ordnernamen in
/proc/$PID/task/
sind die PID von Threads, die einechildren
Datei enthalten, in der potenzielle untergeordnete Prozesse aufgelistet sind.Da es jedoch keine Rekursivität gibt, finden Sie hier ein schnelles und unsauberes Shell-Skript, um diese zu finden:
Wenn der Prozess PID 1234 derjenige ist, den Sie rekursiv verwenden möchten, können Sie jetzt Folgendes tun:
1 Beachten Sie, dass aus Gründen der POSIX-Konformität beim Aufrufen
getpid(2)
innerhalb eines Threads nicht die systemweit eindeutige ID (PID) dieser ausführbaren Entität, sondern die PID des Hauptprozesses innerhalb der "Thread-Gruppe" angegeben wird. Sie müsstengettid(2)
stattdessen anrufen . Weitere Informationen finden Sie in dieser Antwort .quelle
Wir sollten die Prozess-PID und die Thread-ID nicht verwechseln, wenn TID oder der ps-Befehl LPW geschrieben wurde. Der
s
Befehl verfügt über Optionen zum Anzeigen von Threads und untertop
oderhtop
Sie wechseln zwischen Threads und verarbeiten nach demH
Buchstaben. Wie @Totor zuvor mit NPTL, der aktuellen Implementierung mit Kernel> 2.6, mitteilte, haben alle Threads die gleiche pid, aber eine unterschiedliche tid. Sie zeigen alle Threads eines Prozesses durch:Diese tid sind die Namen der Verzeichnisse unter
/proc/<pid>/task
, und selbst wenn renice (1) sagt, dass sein Standardargument eine pid ist, wenn es auf eine pid angewendet wird, wird nur der Hauptthread renice (dies ist ein Fehler in der Linux-Implementierung, wie in setpriority (2) geschrieben) ) ), es kann auch auf ein Tid angewendet werden und es ändert den Thread. Deshalb ist die Antwort von @Anton gültig.Meistens ist es jedoch einfacher, das gewünschte Ergebnis zu erzielen. Alle diese Threads haben dieselbe pgid, die die pid des Gruppenleiters ist. Sie können durch pgid durch Ausgabe von renice:
Wenn Sie einen anderen Prozess, der von demselben Gruppenleiter abhängt, nicht erneut ausführen möchten, müssen Sie das Rezept von @ Anton verwenden:
oder:
Möglicherweise möchten Sie auch wissen, welche anderen Prozesse derselben Gruppe zu dem Prozess gehören, den Sie erneut ausführen möchten. Dies sind die Prozesse, die dieselbe pgid für die Freigabe haben. Sie können ps (1) verwenden ,
ps
erlaubt es nicht, Prozesse nach Gruppenleiter auszuwählen, aber Sie können a bittenps
, dies zu tun. Die Prozesse mit pgid1908
werden durch den Befehl angegeben:oder wenn Sie es vorziehen awk zu sed:
quelle
$ renice -n 18 -g 8524 renice: failed to get priority for 8524 (process group ID): No such process $ ps --no-header axo pid,pgid|awk '{if ($2=="8524") print $1;}'
Während Totors Methode funktioniert / immer noch funktioniert:$ /bin/ls /proc/8524/task | /usr/bin/xargs renice 19 2739 (process ID) old priority 19, new priority 19 2740 (process ID) old priority 19, new priority 19 ...
Ich habe mit / proc, htop, pstree usw. bestätigt, dass ich die richtige Top-Version habe. Level PID. Vielleicht hat sich im letzten Jahr etwas geändert./proc/8524/task
aberrenice -g
schlagen fehl. Wenn Sie sich einen Prozessbaum ansehen, befindet sich ein Zweig in derselben Prozessgruppe und nicht nur ein Thread-Prozess. Versuchen Sie erneut, das Ergebnis von zu überprüfenps -Ljf
.Ich würde empfehlen, das Argument -g (Prozessgruppen) anstelle von -p (Prozess-IDs) zu verwenden, wenn Sie renice verwenden. Es macht dasselbe ohne das Bash-Foo.
dh
quelle
Hier ist ein Skript von mir:
quelle