是否有可以更改的设置(或可以添加的注册表项)来设置服务的处理器亲和性?我想要设置亲和性,并在重新启动后保留此设置(因此启动服务后手动更改亲和性对我来说不起作用)。
答案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”,依此类推。