Kleine und große Linux AHAs
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>
| Artikel drucken | Dieser Beitrag wurde von Ronny am 2. Oktober 2011 um 08:22 veröffentlicht und unter Hints, Monitoring, Systemmanagement, tuning, ubuntuusers.de abgelegt. Du kannst allen Antworten zu diesem Beitrag durch RSS 2.0 folgen. Du kannst direkt zum Ende gehen und einen Kommentar hinterlassen. Pings ist momentan nicht möglich. |








vor 7 Monaten
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
vor 7 Monaten
Kauft ein Sixcore und hofft das die Applikation nur für Quadcore programmiert ist
. (Achtung Ironie.)
vor 7 Monaten
Edit:
Achso, ich kenne den Effekt dagegen von einer ausgelasteten Festplatte. nur hilft es da nix, wenn man an nice oder so herumschraubt.
vor 6 Monaten
Hast du dir mal ionice angeschaut?
z.B.: ionice -c3 $PROG
Dann bekommt der Prozess nur noch resourcen, wenn gerade kein anderer Prozess I/O braucht.
vor 7 Monaten
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.
vor 7 Monaten
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?^^
vor 7 Monaten
“Jeder nur ein Kreuz” = Leben des Brain?
vor 7 Monaten
Aber sicher