Назад | Перейти на главную страницу

Можно ли установить привязку службы к процессору и сохранить ее при перезагрузках?

Есть ли параметр, который можно изменить (или добавить регистрационный ключ), чтобы установить привязку к процессору службы? Я бы хотел установить привязку и сохранить эту настройку при перезагрузках (поэтому изменение привязки вручную после запуска службы для меня не сработает).

Некоторые службы, такие как IIS, созданы с возможностью считывать битовую маску из реестра и использовать ее для установки собственной привязки к процессору при запуске, но это не является особенностью каждой службы.

Я бы, вероятно, создал задачу, которая запускается по событию, и событием будет «Служба MyService запущена» ... в журнале системных событий. Затем задача запустит этот код 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)

РЕДАКТИРОВАТЬ: Ха-ха, извини, это намного сложнее, чем должно быть. Powershell уже имеет эту встроенную возможность, просто выполнив:

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

Битовая маска означает, что десятичное значение 1 означает «только первый ЦП», десятичное значение 2 (двоичное 10) означает «только второй ЦП», десятичное значение 3 (двоичное 11) означает «ЦП 1 и 2», и так далее и тому подобное.