本文目录
背景
昨天转帖了“降低PowerShell进程的运行级别”,焖哥在QQ群中提了个问题,如何通过PowerShell设置进程在指定CPU下运行,今天主要解决这一问题。经查阅资料发现,Windows下的进程似乎不能提前设置运行该进程的CPU,只能在进程启动后去设置。貌似也在理,就像一个孩子还没生下来,就去给他打康泰公司的疫苗,也有点不太现实。
解决方案
通过用户界面
- 打开任务管理器(Task Manager)(任务栏鼠标右键)。
- 选中你想设置的进程比如PowerShell.exe,鼠标右键转到详细定义(Go to details)。
- 鼠标右键选择设置相似性(Set Affinity)
通过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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
实际当中用得到这个吗?我很费解啊
我暂时也没想到生成环境中什么场景需要设置这个,但是微软开放这个属性允许设置,应当还是有点道理的,比如一些涉及cpu的测试。
渲染渲染,有渲染工作的同学就知道能开放设置CPU占有率有好重要了。
实际上应该有这么个命令 Set-Process ,用来设置进程的优先级,用哪个核心 。但是目前还没有。另外 start-process 也应该支持这些个参数!