在Windows中,与
START /node 1 /affinity ff cmd /C "app.exe"
我可以设置应用程序的亲和力.exe(应用程序使用的内核数.exe)。
使用Windows脚本,如何更改正在运行的进程的亲和力?
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
只需将十进制值相加即可用于要使用的内核。 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
接受的答案有效,但仅适用于列表中的第一个进程。评论中的解决方案对我不起作用。
要更改所有同名进程的相关性,请使用以下命令:
Powershell "ForEach($PROCESS in GET-PROCESS processname) { $PROCESS.ProcessorAffinity=255}"
其中255
是接受答案中给出的面具。
对于其他任何寻找答案但没有找到答案的人,我找到的解决方案是使用一个名为WinAFC(或AffinityChanger)的应用程序。这是一个部分 GUI、部分命令行应用程序,允许您为某些可执行文件指定配置文件,并将轮询它们的进程列表。如果找到匹配的进程,它将根据加载的配置文件中的设置更改这些进程的相关性。
这里有一些文档:http://affinitychanger.sourceforge.net/
出于我的目的,我创建了一个如下所示的配置文件:
TestMode = 0
TimeInterval = 1
*convert.exe := PAIR0+PAIR1
此配置文件将任何转换.exe进程设置为使用前两个 CPU 内核对(CPU0、CPU1、CPU2 和 CPU3),每秒轮询一次。 TestMode
是一个切换开关,可让您查看配置文件是否正常工作,而无需实际设置相关性。
希望有人觉得这有用!
如果你真的喜欢枚举,你可以这样做。 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'