2009-03-09 7 views
9

Ich habe ein Quad-Core-System mit Drittanbieter-Anwendung, die gelegentlich mehrere Prozesse (immer die gleiche ausführbare aber mehrere Instanzen davon) spinnt und dauert 100% der CPU-Zeit. Ich habe auch ein paar Web-Dienste auf der gleichen Box (IIS und Drittanbieter).Wie wird die Prozessoraffinität für eine ausführbare Datei in Windows XP festgelegt?

Das Problem mit allen Kernen, die beschäftigt sind, ist, dass es diesen Drittanbieter-Webserver zu Timeout macht (IIS funktioniert gut, nur langsamer als üblich). Ich habe keine Kontrolle über den Webserver von Drittanbietern, es ist ein Teil des größeren Produkts und muss betriebsbereit sein. Also habe ich versucht, mit Prozessor-Affinität (über SysInternals Process Explorer) zu spielen und diese lästigen Prozesse auf 3 von 4 Cores zu beschränken und den vierten Core dem Webserver der dritten Partei zu widmen, und es scheint ziemlich gut zu funktionieren.

Das Problem ist, dass es Affinität nur auf den laufenden Prozess und nicht auf ausführbare Ebene setzt, also nachdem diese Prozesse beenden und später als neue Prozesse respawnen ist es wieder alle gleich - sie nehmen alle 4 Kerne. Also, ich habe über dieses ImageCfg.exe-Dienstprogramm von Microsoft gegooglet, aber ich kann es nicht auf der Microsoft-Website zum Download finden und ich sehe, dass einige Leute es ausprobiert haben und jetzt beschweren, dass es nicht wirklich funktioniert.

Gibt es eine Möglichkeit, die Affinität zur ausführbaren Datei beizubehalten?

+1

Ihr erster Anruf sollte der Herausgeber der betreffenden Software sein. Bitten Sie sie, den Thread-Verbrauch zu begrenzen. – NotMe

+0

Allerdings ist das Problem immer noch interessant, weil die Software diese Funktion möglicherweise nicht hat. Und es gibt sicherlich andere Software, die nicht ... es wäre ärgerlich, den Verkäufer jedes Mal anrufen zu müssen. – ine

Antwort

5

Eine Funktion von Process Lasso besteht darin, die Affinität eines Prozesses festzulegen, wenn dieser Prozess gestartet wird.

3

Verwenden Sie SetProcessAffinityMask(). Und Vorsicht, Processor Affinity is inherited!

Sie müssen ImageFileExecutionOptions verwenden, insbesondere the "Debugger" option und Ihre eigene kleine ausführbare Datei zu schreiben, die SetProcessAffinityMask() auf sich selbst aufruft, und laicht dann einen neuen Prozess, der die, die Sie Affinität einstellen wollen, ist für . Setze das als Debugger und du bist fertig.

+1

Lesen Sie wirklich die Dokumentation zu diesem. Sie können sich damit leicht in den Fuß schießen; viele gotchas. –

5

Sie können sich den /AFFINITY Parameter zu start ansehen.

Von der Hilfe:

AFFINITY The new application will have the specified processor 
      affinity mask, expressed as a hexadecimal number. 

Als Prozessor-Affinität unter Windows ist eine Bitmaske Sie einige Experimente benötigen, aber ich würde davon ausgehen, 1 der erste Kern ist daher 7 die ersten drei Kerne und mehr F alle sein vier. Oder 8 für nur die vierte.

Sie können dann geplante Tasks oder Verknüpfungen durch einen Aufruf von start mit den entsprechenden Parametern ersetzen.

+1

Windows XP verfügt nicht über die Option '/ affinity'. –

3

Sie können die Einzelprozess-Affinitätsanwendungs-Shim verwenden, um einen Prozessor auf der ausführbaren Ebene zu erzwingen, wodurch der Prozess auf einen Kern gezwungen wird.

Dieser Artikel, http://msdn.microsoft.com/en-us/library/bb173458.aspx, hat einen Absatz, um die Scheibe nach unten zu ermöglichen.

+0

Der Artikel ist umgezogen zu http://msdn.microsoft.com/en-us/library/ee417693.aspx –

0

Sie könnten versuchen, die Priorität des Prozesses so festzulegen, dass, selbst wenn es sich dazu entschließt, 100% der CPU zu verwenden, etwas mit höherer Priorität übernehmen kann, wenn dies erforderlich ist.

Doing this automatically (anstatt im Taskmanager spielen zu müssen) habe ich vor einiger Zeit gefragt.

+0

Die Frage ist über Prozessoraffinität, nicht Prozesspriorität. –

3

Das ImageCfg.exe-Dienstprogramm funktioniert. Ich habe es gerade benutzt, um ein Unternehmen heute zu lösen.Es ist erhältlich bei http://www.robpol86.com/pages/imagecfg.php

Imagecfg -a 0x3 xxx.exe

begrenzt die Exe zu CPU0 und CPU1, zum Beispiel.

+0

Ich weiß nicht warum, aber in meinem Fall hat es nicht funktioniert. – bychkov

6

http://waynes-world-it.blogspot.com/2009/06/processor-affinity-on-windows-server.html

Power

Verwenden Power den Prozessor Affinität für einen oder mehrere laufende Prozesse zu setzen. Es gibt ein Beispielskript, das die Prozessormaske von calc.exe auf die ersten 4 Prozessoren setzt. Ich mag diese Methode, weil das Skript einfach ist, einfach zu planen ist, auf x86 und x64 läuft, mehrere Prozesse mit demselben Namen unterstützt und zumindest teilweise, weil es zeigt, wie einfach die Verwaltung mit PowerShell ist.

Beachten Sie, dass wenn Sie factorial einer großen Zahl mit calc.exe (n!) Verwenden, Sie 100% CPU generieren werden, die zum Testen nützlich sein können. Die Maske ist unten 0xf = 1111 - eine Maske, so dass die Verwendung von nur die ersten vier Prozessoren:

$calcSet = Get-Process -ProcessName "calc" 
foreach ($calc in $calcSet) {$calc.ProcessorAffinity=0xF} 
1

Offensichtlich dieses Thema ist veraltet, aber im Kommentar ohnehin nur für den Fall des Hinzufügen jemand googelt zu diesem Thema (wie ich)

Sie könnten versuchen, die Priorität des Prozesses einstellen, so dass selbst wenn es 100% der CPU zu verwenden entscheidet, etwas, das eine höhere Priorität ist, kann übernehmen, wenn es so tun muss.

Dies automatisch zu tun (anstatt in der Task Manager zu spielen) ist etwas, was ich vor einer Weile gefragt habe.

Der Startbefehl kann zum Festlegen der Startpriorität eines Prozesses verwendet werden.

Eg. start "my path\my process" /LOW für niedrige Priorität.

erlaubte Priorität Schalter LOW, NORMAL, HIGH, REALTIME, ABOVENORMAL, BELOWNORMAL

kann von einer Batch-Datei zum Beispiel genannt werden.

+0

Die Frage betrifft die Prozessoraffinität, nicht die Prozesspriorität. –