É possível definir a afinidade do processador de um serviço e persistir essa afinidade entre as reinicializações?

7

Existe uma configuração que pode ser alterada (ou uma chave reg que pode ser adicionada) para definir a afinidade do processador de um serviço? Eu gostaria de definir a afinidade e manter essa configuração em reinicializações (portanto, alterar manualmente a afinidade após iniciar o serviço não funcionará para mim).

    
por EGr 27.01.2015 / 16:46

1 resposta

8

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.

    
por 27.01.2015 / 19:17