Da sind sie nun – fast überall. Die SMP Systeme (Multicore Systeme). Und zu ihnen gesellen sich auch immer mehr Programme, die mehrere CPUs nutzen können … also Multithreaded sind. Und ein altbekanntes Problem.

Lang her

Wenn “damals” ein Prozess ein wenig “überschwenglich” war und durch ein Problem (z.B.) die ganze Leistung des Systems an sich gezogen hat, dann waren das so 100% und die Kiste war tot. Je nach dem.

nicht sooo lang her

Dann kamen die Multicore Systeme und unser Prozess konnte nicht mehr das ganze System lamlegen – Juhuuu. Man konnte sich also wenigstens noch anmelden und den Prozess killen.

Heute

Tja, heute sind wir wieder bei damals. Die Multicoresysteme werden von Multithreaded Prozessen an die Wand gefahren. Toll. Ein Prozess mit 400% CPU usage ;-)

Kann man da was tun?

Aber sicher doch. So viel man sich freut, dass das ein oder andere Programm nun mehrere Cores nutzt, so wenig brauchen viele der Programme das. Oder sagen wir mal so: Die meisten kommen auch mit 3 von 4 CPUs aus. Was mache ich also wenn ich einen Prozess habe, der so manches Mal die Kiste herunterzieht? Ich weise ihm einfach nur noch 3 der 4 CPUs zu und kann somit noch mit einer meine Anmeldung vollziehen.

Unser Freund zur Umsetzung dieses gewieften Planes heißt “taskset” (man taskset).

Grundsätzlich benötigt man lediglich 2 Informationen:

  • Anzahl CPUs im System
  • Anzahl CPUs die man zuweisen möchte
  • ProzessID (PID) (bei einem vorhanden Prozess, ansonsten kann ein Prozess auch mit taskset gestartet werden)

CPUs

Die CPUs werden mit Hilfe einer Bitmask definiert.

CPU1 -> 0x00000001
CPU2 -> 0x00000002
CPU3 -> 0x00000004
CPU4 -> 0x00000008
...

Möchte man eine CPU zuweisen (CPU MASK), so wird einfach die 2 für die CPU2 genommen.

xCPUs

Möchte man mehrere CPUs zuweisen, so werden diese einfach addiert (HEX!). Alle 4 CPUs wären somit “f”. CPU2 und CPU3 wäre “6” und so weiter …

Nägel mit Köpfen

Um die CPU “Affinity” eines vorhandenen Prozesses zu setzen, nutzt man folgenden Befehl:

taskset -p <CPU MASK> <PID>

Bei Programmaufruf:

taskset <CPU MASK> <CMD>