ProcessorAffinity

2. Dezember 2015

Rechenintensive Aufgaben können hin und wieder viel Last auf einem System verursachen. Eine Anwendung, an der ich mitwirke, arbeitet beispielsweise mit vielen Threads und wird sogar mehrfach gestartet. Vor allem dieses mehrfache Ausführen des Prozesses führt schnell zur Überlastung des Servers.

Eine 100% Auslastung ist aber nicht gewünscht. Der Server soll weiterhin Kapazitäten für sich, betriebliche Anforderungen und andere Anwendungen zur Verfügung haben.

Die Idee einer zentralen Steuerung und dynamischen Anpassung der Anzahl der Threads über mehre Prozesse hinweg verwarf ich schnell. Mir wurde auch öfters der Spruch “Die Verwaltung von Threads kann das Betriebssystem viel besser.” um die Ohren gehauen. Ja aber wie sorge ich dafür dass es auf meinem Server nicht so aussieht:

100% Last

Eigentlich ganz einfach so:

taskmgr 

Indem man beispielsweise die Häkchen für CPU0 und CPU1 entfernt:

75% Last

Nun werden 6 von 8 (75%) meiner CPUs unter Last gesetzt. Also mein System reagiert noch und die Anwendung rechnet auch. Nun das Ganze im Code:

   1: using System.Diagnostics;

   2: ...

   3:  

   4: Process process = Process.GetCurrentProcess();

   5: //CPU 7 6 5 4 3 2 1 0

   6: //Use 1 1 1 1 1 1 0 0

   7: // = 252

   8: process.ProcessorAffinity = (IntPtr)252;

Im Test hatte ich einen Rechner mit 24 Kernen und habe dort mal einen Durchlauf auf 22 Kernen und  mit 20 Threads gemacht, sie benötigte 3h 30min. Bei zwei parallelen laufenden Anwendungen ergab die Messung 7h 5min ± 2 min.

Also das Betriebssystem macht seine Aufgabe sehr gut:

  • Nur die zugewiesenen CPUs werden “belastet”.
  • Ein Prozess nutzt die maximal erlaubten Ressourcen (CPUs).
  • Kommen weitere Prozesse dazu werden diese Ressourcen untereinander aufgeteilt.
  • Beendet sich ein Prozess (Rechnung fertig) werden die nun freien Ressourcen automatisch von den verbleibenden Prozessen genutzt.
  • Über die Priorität des Prozesses können wichtige Rechnungen, auf Kosten der anderen, beschleunigt werden.

Alles mit nur einer Zeile Code ….