Alguns serviços, como o IIS, são criados com a capacidade de ler um bitmask do registro e usá-lo para definir sua própria afinidade de CPU quando iniciam, mas isso não é um recurso de todos os serviços.
Eu provavelmente criaria uma tarefa definida para disparar em um evento, e o evento seria "O serviço do MyService é iniciado" ... no log de eventos do sistema. A tarefa então executaria este código do Powershell:
# 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, me desculpe, é muito mais complicado do que precisa ser. O Powershell já possui essa habilidade embutida simplesmente:
$Process = Get-Process MyService
$Process.ProcessorAffinity = 1
Um bitmask significa que um valor decimal 1 significa "apenas a primeira CPU", um valor decimal de 2 (binário 10) significa "a segunda CPU apenas", um valor decimal de 3 (binário 11) significa "CPUs 1 e 2 "e assim por diante e assim por diante.