- Registriert
- Dez. 2021
- Beiträge
- 620
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
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.
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
Oder über die Konsole:
Sobald man die PID kennt, kann man einfach mit
die Kerne zuweisen.
Wenn man die aktuelle Affinität herausfinden möchte, kann man einfach
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:
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
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
Wenn man unter Konfiguration -> Systemeinstellungen | Advanced gehst und dort nach Befehlspräfix sucht, kann man die Kernzuweisung für ein Spiel abspeichern.
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
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
Wenn man die aktuelle Affinität herausfinden möchte, kann man einfach
Bash:
taskset -p PID
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
(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