GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux – Festlegen der laufenden Prozessaffinität mit Taskset schlägt fehl?

Ich versuche, einen Prozess auf eine bestimmte Anzahl von CPU-Kernen zu beschränken. Laut der Taskset-Manpage und dieser Dokumentation sollte Folgendes funktionieren:

[[email protected] ~]$ taskset -pc 0 <PID>
pid 24395's current affinity list: 0-3
pid 24395's new affinity list: 0

Einfach gesagt – das geht nicht. Prozess unter Last setzen und top beobachten , es liegt bei etwa 350% CPU-Auslastung (wie ohne Taskset). Das Maximum sollte bei 100 % liegen.

Ich kann die Affinität über taskset -c 0 <cmd to start process> richtig einstellen zur Spawn-Zeit des Prozesses. Verwenden von cpulimit -p <PID> -l 99 funktioniert auch irgendwie. In beiden Fällen führt das Aussetzen des Prozesses unter die gleiche Last dazu, dass er bei 100 % CPU-Auslastung ausgelastet wird.

Was läuft hier falsch?

Akzeptierte Antwort:

Aktualisierung:Neuere Versionen von Taskset haben einen -a /--all-tasks Option, die „alle Tasks (Threads) für eine bestimmte PID verarbeitet“ und das Verhalten lösen sollte, das ich unten zeige.

Ich habe ein Python-Skript geschrieben, das einfach einige Threads hochfährt und CPU-Zyklen verbrennt. Die Idee ist, Taskset dagegen zu testen, da es ziemlich einfach ist.

#!/usr/bin/env python

import threading

def cycle_burner():
    while True:
        meh = 84908230489 % 323422

for i in range(3):
    thread = threading.Thread(target=cycle_burner)
    print "Starting a thread"
    thread.start()

Allein das Ausführen des Python-Skripts verbraucht etwa 150 % der CPU-Auslastung.

[~/cbench]$ ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread

Das Starten meines Python-Skripts mit Taskset funktioniert wie erwartet. Oben zu sehen zeigt den Python-Prozess, der auf 100 % Nutzung festgelegt ist.

[~/cbench]$ taskset -c 0 ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread

Interessanterweise wird der Prozess auf 100 % begrenzt, wenn das Python-Skript gestartet und dann sofort taskset verwendet wird, um die Affinität des gerade gestarteten Prozesses festzulegen. Beachten Sie in der Ausgabe, dass der Linux-Scheduler die Ausführung der Bash-Befehle abgeschlossen hat, bevor er die Python-Threads erstellt hat. Also wurde der Python-Prozess gestartet, dann wurde er so eingestellt, dass er auf CPU 0 läuft, dann hat er seine Threads erzeugt, die die richtige Affinität geerbt haben.

[~/cbench]$ ./burn_cycles.py &; taskset -pc 0 `pgrep python`
[1] 8561
pid 8561's current affinity list: 0-3
pid 8561's new affinity list: 0
Starting a thread
[~/cbench]$ Starting a thread
Starting a thread

Dieses Ergebnis steht im Gegensatz zu dieser Methode, die genau die gleiche ist, aber es den Python-Threads ermöglicht, zu spawnen, bevor die Affinität des Python-Prozesses festgelegt wird. Dies repliziert die oben beschriebenen „Taskset tut nichts“-Ergebnisse.

[~/cbench]$ ./burn_cycles.py &
[1] 8996
[~/cbench]$ Starting a thread
Starting a thread
Starting a thread
[~/cbench]$ taskset -pc 0 `pgrep python`
pid 8996's current affinity list: 0-3
pid 8996's new affinity list: 0

Was läuft hier falsch?

Anscheinend erben Threads, die erzeugt werden, bevor die Affinität des übergeordneten Prozesses geändert wird, nicht die Affinität ihres übergeordneten Prozesses. Wenn jemand einen Link zu einer Dokumentation einfügen könnte, die dies erklärt, wäre das hilfreich.

Verwandt:Hinzufügen von Text zum Dateinamen vor der Erweiterung?
Linux
  1. Linux – Wie stellt man die Prozessoraffinität eines Prozesses unter Linux ein?

  2. Wie kann man einen laufenden Prozess unter Linux neu starten (oder zurücksetzen)?

  3. Wie beendet man einen Prozess, der auf einem bestimmten Port in Linux läuft?

  4. Signalbehandlung mit mehreren Threads in Linux

  5. Wie kann ich die Prozessoraffinität eines Prozesses unter Linux einstellen?

Wait-Befehl in Linux anhand von Beispielen erklärt

Linux-Prozessverwaltung mit htop verbessert

Einrichten eines Linux-Clusters mit Keepalived:Basiskonfiguration

3 Tipps zur Verbesserung der Linux-Prozessleistung mit Priorität und Affinität

So beenden Sie den laufenden Linux-Prozess auf einem bestimmten Port

Einrichten eines NFS-Servers mit Turnkey Linux