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.