Leserartikel Programm an CPU-Kern(e) binden

Kaito Kariheddo

Redakteur
Teammitglied
Registriert
Dez. 2021
Beiträge
457
Hallo zusammen,

hier ein kleines Tutorial an alle, die gern ein Programm an einen bestimmten Kern der CPU binden möchten, Beispielsweise um mehr Leistung bei älteren Spielen zu erlangen, höhere Kompatibilität sicherzustellen oder einfach um in Benchmarks den Einfluss von CPU-Kernen zu messen.
Linux bringt von Haus aus eine Möglichkeit mit, das über die Konsole zu lösen.
Die Rede ist von taskset, dieses sollte als Teil des util-linux Paketes auf jeden System vorhanden sein.

Die Funktionsweise ist wie folgt (und lässt sich auch in der Anleitung nachlesen, hier aber nochmal auf den Punkt gebracht):

Ein Programm mit vorab festgelegter CPU Affinität starten
Bash:
taskset --cpu-list 0-3 PROGRAMM
PROGRAMM kann dann alles mögliche sein, beispielsweise Lutris. Apropos Lutris!

Wenn man unter Konfiguration -> Systemeinstellungen | Advanced gehst und dort nach Befehlspräfix sucht, kann man die Kernzuweisung für ein Spiel abspeichern.
1678980748967.png

Lutris stellt dann den Befehl einfach vor den Startbefehl des Spiels, genauso wie man es oben manuell getan hätte.

Kernzugehörigkeit eines laufenden Prozesses ändern
Zunächst einmal muss die PID des laufenden Prozesses ermittelt werden.
Dies geht ganz einfach über den Systemmonitor der eigenen Wahl, btop als Beispiel
1678980939483.png

Oder über die Konsole:
Bash:
pstree -p | grep "NAME" | head -1

Sobald man die PID kennt, kann man einfach mit
Bash:
taskset -p --cpu-list 0-3 PID
die Kerne zuweisen.

Wenn man die aktuelle Affinität herausfinden möchte, kann man einfach
Bash:
taskset -p PID
ausführen.

Optionen und Anmerkungen
--cpu-list kann auch konkrete Kerne haben, zum Beispiel --cpu-list 0-2,6 für die Kerne 0,1,2 und 6
--cpu-list 0-7:2 nimmt alle Kerne aus der Menge 0-7 mit der Schrittweite 2. also hier den Kern 0,2,4,6. Dies würde bei einem alten AMD Zen Kernen einem CCX entsprechen und nur die physischen Kerne, also kein SMT
--all-tasks oder -a weißt wieder alle Kerne dem Prozess zu

Statt die Kerne konkret anzugeben, kann man auch einen Hexcode verwenden. Dabei wird die Belegung von jeweils 4 Kernen mit 0-F bezeichnet. (2^4=16=F in Hexa)
Jeder Kern entspricht dabei einer Zweierpotenz.
Kern 0 = 2^0 = 1
Kern 1 = 2^1 = 2
Kern 2 = 2^2 = 4
Kern 3 = 2^3 = 8
Wenn man also einen Prozess den Kernen 0 und 1 zuweisen möchte, gibt man an:
Bash:
taskset -p 3 PID
Da Kern 0 = 1 und Kern 1 = 2 -> 1+2 = 3

(Dazu einfach mal nach CPU Affinity Mask Calculator googeln)

Das wars auch schon, viel Spaß beim Prozesse verteilen.
Feedback ist in den Kommentaren gern gesehen.

Grüße, Kaito
 
  • Gefällt mir
Reaktionen: Baal Netbeck, Iapetos, Ranayna und 3 andere
oh wie umständlich.
Ich mach das immer mit Process Lasso. Ist der bessere Taskmanager und die eingestellten CPU Einstellungen werden sogar gespeichert.
Das oben genannte kann man damit in weniger als 15 sek erledigen. z.B 2 klicks und SMT ist für ein Programm abgeschaltet.
 
@wern001 nutze ebenfalls Process Lasso + ParkControl kannst du dazu eventuell eine Anleitung wie der @TE schreiben?

Danke an @TE für die Mühe, ist das eher für erfahrene Nutzer gerichtet? Da ich recht alte Systeme (Ivy Bridge) nutze sind solche Möglichkeiten Gold Wert :)
 
anleitung? ein rechtslick auf einen Task danach auf immer und dann links klick auf "deaktiviere SMT" sollte eigentlich jeder hinbekommen.
 
Zurück
Oben