Jeder nur ein Kreuz – CPUs Prozessen zuteilen

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>

 

 

 

8 Responses to Jeder nur ein Kreuz – CPUs Prozessen zuteilen

  1. ben

    Hallo,

    danke fuer das Blog.
    In diesem Fall habe ich mal einen Gedankenanstoss beizutragen: Ich finde das Problem laesst sich wesentlich eleganter mit cgroups loesen, da man mittels dieser Technik dann einfach das System durch die “normalen” Programme nur bis 95% auslasten lassen kann. Den Rest kann man dann fuer ssh-login und fuer das Aufraeumen verwenden. So muss man nicht eine komplette CPU “ueberlassen”.
    weitere Details: http://en.wikipedia.org/wiki/Cgroups

  2. Hi.

    Das Problem, dass ein Prozess bei 100% CPU das System unbenutzbar macht hatte ich noch nie, weder mit nem Singlecore noch mit nem Multicore.

    Benutzt ihr irgendwelche Kernel mit kaputten schedulern?

    Und normal sollte dann auch nice reichen.

  3. Mhh schön.
    aber da stellt sich mir eine frage kann man das Permanent zuweisen? den wen ich bestimme java anwendungen starte ziehen die shcon die 400 % also kurz: desktop alles auf core4 und der rest auf 1-3?^^

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>