是否可以设置服务的处理器亲和性,并在重启后保持此亲和性?

是否可以设置服务的处理器亲和性,并在重启后保持此亲和性?

是否有可以更改的设置(或可以添加的注册表项)来设置服务的处理器亲和性?我想要设置亲和性,并在重新启动后保留此设置(因此启动服务后手动更改亲和性对我来说不起作用)。

答案1

某些服务(例如 IIS)具有从注册表读取位掩码并在启动时使用该位掩码设置自己的 CPU 亲和性的功能,但这并不是每个服务都具备的功能。

我可能会创建一个任务,将其设置为在某个事件上触发,事件将是“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 表示“仅第一个 CPU”,十进制值 2(二进制 10)表示“仅第二个 CPU”,十进制值 3(二进制 11)表示“CPU 1 和 2”,依此类推。

相关内容