web-dev-qa-db-ja.com

サービスのプロセッサアフィニティを設定し、再起動後もこのアフィニティを維持することは可能ですか?

サービスのプロセッサアフィニティを設定するために変更できる設定(または追加できるregキー)はありますか?アフィニティを設定し、再起動後もこの設定を保持したいので(サービスの開始後にアフィニティを手動で変更しても機能しません)。

7
EGr

IISなどの一部のサービスは、レジストリからビットマスクを読み取り、起動時に独自のCPUアフィニティを設定する機能を使用して構築されていますが、すべてのサービスの機能ではありません。

イベントで発生するように設定されたタスクを作成すると、システムイベントログに「MyService service is started」というイベントが発生します。次に、タスクは次の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

ビットマスクは、10進値1が「最初のCPUのみ」を意味し、10進値2(バイナリ10)は「2番目のCPUのみ」を意味し、10進値3(バイナリ11)は「CPU 1と2」を意味しますなどなど。

8
Ryan Ries