web-dev-qa-db-ja.com

Windowsスクリプトでプロセスの親和性を変更する

Windowsでは、

 START /node 1 /affinity ff cmd /C "app.exe"

App.exeのアフィニティ(app.exeが使用するコアの数)を設定できます。

Windowsスクリプトで、実行中のプロセスのアフィニティを変更するにはどうすればよいですか?

12
JuanPablo

PowerShellがこのタスクを実行できます

アフィニティを取得:

PowerShell "Get-Process app | Select-Object ProcessorAffinity"

アフィニティを設定:

PowerShell "$Process = Get-Process app; $Process.ProcessorAffinity=255"

例:(8コアプロセッサ)

  • コア#==ビットマスク
  • コア1 = 1 = 00000001
  • コア2 = 2 = 00000010
  • コア3 = 4 = 00000100
  • コア4 = 8 = 00001000
  • コア5 = 16 = 00010000
  • コア6 = 32 = 00100000
  • コア7 = 64 = 01000000
  • コア8 = 128 = 10000000

使用するコアの10進数値を加算するだけです。 255 =すべての8コア。

  • すべてのコア= 255 = 11111111

出力例:

C:\>PowerShell "Get-Process notepad++ | Select-Object ProcessorAffinity"

                                                              ProcessorAffinity
                                                              -----------------
                                                                            255



C:\>PowerShell "$Process = Get-Process notepad++; $Process.ProcessorAffinity=13"

C:\>PowerShell "Get-Process notepad++ | Select-Object ProcessorAffinity"

                                                              ProcessorAffinity
                                                              -----------------
                                                                             13



C:\>PowerShell "$Process = Get-Process notepad++; $Process.ProcessorAffinity=255"

C:\>

出典:

プロセスのアフィニティを変更する方法についての詳細な投稿は次のとおりです:http://www.energizedtech.com/2010/07/powershell-setting-processor-a.html

13
David Ruhmann

受け入れられた回答は機能しますが、リストの最初のプロセスに対してのみです。コメントでのその解決策は私にはうまくいきません。

同じ名前のすべてのプロセスのアフィニティを変更するには、これを使用します。

Powershell "ForEach($PROCESS in GET-PROCESS processname) { $PROCESS.ProcessorAffinity=255}"

どこ 255は、受け入れられた回答で指定されたマスクです。

3
skjerns

これに対する答えを探していて何も見つからない人にとって、私が見つけた解決策は WinAFC (またはAffinityChanger)というアプリを使用することでした。これは部分的なGUIであり、特定の実行可能ファイルのプロファイルを指定できる部分的なコマンドラインアプリであり、それらのプロセスリストをポーリングします。一致するプロセスが見つかると、ロードされたプロファイルの設定に従って、それらのプロセスのアフィニティが変更されます。

ここにいくつかのドキュメントがあります: http://affinitychanger.sourceforge.net/

私の目的のために、次のようなプロファイルを作成しました。

TestMode = 0
TimeInterval = 1
*\convert.exe := PAIR0+PAIR1

このプロファイルは、最初の2つのCPUコアペア(CPU0、CPU1、CPU2、およびCPU3)を使用するようにconvert.exeプロセスを設定し、毎秒ポーリングします。 TestModeは、実際にアフィニティを設定せずにプロファイルが機能しているかどうかを確認できるトグルです。

誰かがこれが便利だと思ってください!

2
Jake
wmic process where name="some.exe" call setpriority ProcessIDLevel

これらは優先レベルです と思います。プロセス名の代わりにPIDを使用することもできます。

1
npocmaka

列挙型が本当に好きなら、この方法で行うことができます。 ProcessorAffinityはIntPtrなので、少し余分な型キャストが必要です。

[flags()] Enum Cores {
  Core1 = 0x0001
  Core2 = 0x0002
  Core3 = 0x0004
  Core4 = 0x0008
  Core5 = 0x0010
  Core6 = 0x0020
  Core7 = 0x0040
  Core8 = 0x0080
}

$a = get-process notepad

[cores][int]$a.Processoraffinity
Core1, Core2, Core3, Core4

$a.ProcessorAffinity = [int][cores]'core1,core2,core3,core4'
0
js2010