PowerShell 设置运行进程的CPU

PowerShell设置进程在指定CPU下运行 4


背景

昨天转帖了“降低PowerShell进程的运行级别”,焖哥在QQ群中提了个问题,如何通过PowerShell设置进程在指定CPU下运行,今天主要解决这一问题。经查阅资料发现,Windows下的进程似乎不能提前设置运行该进程的CPU,只能在进程启动后去设置。貌似也在理,就像一个孩子还没生下来,就去给他打康泰公司的疫苗,也有点不太现实。

解决方案

通过用户界面

  1. 打开任务管理器(Task Manager)(任务栏鼠标右键)。
  2. 选中你想设置的进程比如PowerShell.exe,鼠标右键转到详细定义(Go to details)。
  3. 鼠标右键选择设置相似性(Set Affinity)
PowerShell 设置运行进程的CPU

PowerShell 设置运行进程的CPU

通过PowerShell

通过PowerShell中Get-Process获取的每个进程对象有一个属性叫做:ProcessorAffinity(正是上图中设置的CPU)

PS> $pro = Get-Process -Id $pid
PS> $pro

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    440      27    66980      48788   619     7.14  23332 powershell

PS> $pro.ProcessorAffinity
15

对的,这里的15不是个偶然,我机器上正好是4核的。2的4次方-1=15。怎样获取机器的cpu核数,讲过很多遍了,再温习一下。

PS> $cpuCount=(Get-WmiObject -Class win32_processor | 
measure -Sum NumberOfLogicalProcessors).Sum
PS> $cpuCount
4

ProcessorAffinity的值是一个整数,把它换算成2进制字符串,与CPU的的对应关系就会一目了然,让我们一起再秀下PowerShell的数组,数学计算,类型转换,字符串函数等知识吧:

PS> 1..( [math]::Pow( 2, $cpuCount ) - 1) |
	foreach {'{0} <- {1}' -f [convert]::ToString($_,2).PadLeft($cpuCount,'0'),$_ }

0001 <- 1
0010 <- 2
0011 <- 3
0100 <- 4
0101 <- 5
0110 <- 6
0111 <- 7
1000 <- 8
1001 <- 9
1010 <- 10
1011 <- 11
1100 <- 12
1101 <- 13
1110 <- 14
1111 <- 15

最后设置为ProcessorAffinity的值为6,分配其中两个cpu

$pro.ProcessorAffinity=6
本文链接: https://www.pstips.net/setting-process-running-under-specific-cpu.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

4 条评论 “PowerShell设置进程在指定CPU下运行