Ist es möglich, die Prozessoraffinität eines Dienstes festzulegen und diese Affinität über Neustarts hinweg beizubehalten?

7

Gibt es eine Einstellung, die geändert werden kann (oder einen Registrierungsschlüssel, der hinzugefügt werden kann), um die Prozessoraffinität eines Dienstes festzulegen? Ich möchte die Affinität festlegen und diese Einstellung über Neustarts hinweg beibehalten (daher funktioniert das manuelle Ändern der Affinität nach dem Starten des Dienstes für mich nicht).

EGr
quelle
Versuchen Sie dieses Tool: prnwatch.com/prio
magicandre1981

Antworten:

8

Einige Dienste, wie z. B. IIS, sind mit der Fähigkeit ausgestattet, eine Bitmaske aus der Registrierung zu lesen und diese zu verwenden, um beim Start ihre eigene CPU-Affinität festzulegen. Dies ist jedoch nicht eine Funktion jedes Dienstes.

Ich würde wahrscheinlich eine Aufgabe erstellen, die für ein Ereignis ausgelöst wird, und das Ereignis wäre "MyService-Dienst wird gestartet" ... im Systemereignisprotokoll. Die Aufgabe würde dann diesen Powershell-Code ausführen:

# TODO: Add error checking
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
public class Affinity
{
    [DllImport("kernel32.dll")]
    static extern bool SetProcessAffinityMask(IntPtr Handle, UIntPtr AffinityMask);

    public static void SetAffinity(IntPtr Handle, UIntPtr AffinityMask)
    {
        SetProcessAffinityMask(Handle, AffinityMask);
    }
}    
'@

$Process = Get-Process MyService
If (-Not($Process))
{
    Return
}

# This is a bitmask.
$AffinityMask = New-Object UIntPtr 1

# TODO: Foreach loop to set affinity for each instance of the process
[Affinity]::SetAffinity($Process.Handle, $AffinityMask)

EDIT: Hahah, es tut mir leid, das ist viel komplizierter als es sein muss. Powershell hat diese Fähigkeit bereits eingebaut, indem es einfach Folgendes tut:

$Process = Get-Process MyService
$Process.ProcessorAffinity = 1

Eine Bitmaske bedeutet, dass ein Dezimalwert 1 "nur die erste CPU" bedeutet, ein Dezimalwert von 2 (binär 10) "nur die zweite CPU" bedeutet, ein Dezimalwert von 3 (binär 11) "CPUs 1 und 2" bedeutet. und so weiter und so fort.

Ryan Ries
quelle