【问题标题】:Change affinity of process with windows script使用 Windows 脚本更改进程的亲和性
【发布时间】:2013-10-04 17:23:17
【问题描述】:

在 Windows 中,使用

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

我可以设置app.exe的亲和度(app.exe使用的核数)。

使用 windows 脚本,如何更改正在运行的进程的亲和力?

【问题讨论】:

    标签: windows batch-file affinity


    【解决方案1】:

    PowerShell 可以为你完成这项任务

    获得亲和力:

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

    设置亲和力:

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

    示例:(8 核处理器)

    • 核心# = 价值 = BitMask
    • 核心 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

    【讨论】:

    • 第一个命令运行良好。但第二次我收到此消息:“在此对象上找不到属性'ProcessorAffinity'。验证该属性是否存在并且可以设置。在 line:1 char:32 + $Process = Get-Process chrome;$Process .ProcessorAffinity=1 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : PropertyAssignmentException "
    • 如果有多个同名进程(例如java),如何使用?它是设置所有java进程的亲和性,还是随机选择一个(或最低的pid等)
    • @DanielWiddis 使用 Get-Process java | ... 将更改所有 java 进程的关联性。如果您只需要特定的 java 实例,则必须知道并使用进程 ID。例如Get-Process -ID 8500 否则,您将不得不实现自己的过滤。
    • 提醒任何通过 Google 阅读本文的人,如果您不想使用 PowerShell,或者需要使用 cmd /start "" /Affinity value 方法从命令提示符调用,那么核心亲和力实际上是 十六进制。例如,要在 16 核 CPU 上使用 13-16 核启动进程,十进制值为61440,十六进制值为0xF000。使用 61440 将启动使用内核 6,10 和 12 的进程 :-) rapidtables.com/convert/number/binary-to-hex.html 对于快速转换很有用。
    【解决方案2】:

    接受的答案有效,但仅适用于列表中的第一个进程。 cmets 中的解决方案对我不起作用。

    要更改具有相同名称的所有进程的亲和性,请使用:

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

    255 是接受答案中给出的掩码。

    【讨论】:

    • 需要像 $PROCESS.ProcessorAffinity=255 这样的 $PROCESS 之后的句号
    • 是的,我改了。
    • 这太冗长了;只需使用Get-Process $processName | % { $_.ProcessorAffinity = $value; };
    • 还是太冗长:使用Get-Process $pn| %{ $_.ProcessorAffinity = $v} /s
    • 还是太冗长——使用(ps $p).ProcessorAffinity=$v /s
    【解决方案3】:

    如果你真的喜欢枚举,你可以这样做。 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'
    

    【讨论】:

      【解决方案4】:

      对于其他正在寻找答案但没有找到答案的人,我找到的解决方案是使用名为 WinAFC(或 AffinityChanger)的应用程序。这是一个部分 GUI、部分命令行应用程序,允许您为某些可执行文件指定配置文件,并将轮询它们的进程列表。如果找到匹配的进程,它将根据加载的配置文件中的设置更改这些进程的亲和性。

      这里有一些文档:http://affinitychanger.sourceforge.net/

      出于我的目的,我创建了一个如下所示的个人资料:

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

      此配置文件将任何 convert.exe 进程设置为使用前两个 CPU 核心对(CPU0、CPU1、CPU2 和 CPU3),每秒轮询一次。 TestMode 是一个切换开关,让您无需实际设置关联即可查看您的个人资料是否正常工作。

      希望有人觉得这很有用!

      【讨论】:

      • 我觉得这个程序有点不完整。我知道它很旧,所以想知道您是否仍然成功使用它?它看起来很棒,但它选择了一些程序而不是其他程序。
      • 我已经很久没有这样做了。我知道当时它对我有用。从那以后我就不需要使用这个程序了;这是短期的事情。
      【解决方案5】:
      wmic process where name="some.exe" call setpriority ProcessIDLevel
      

      我认为these are the priority levels 。您也可以使用 PID 代替进程名称。

      【讨论】:

      • 通过亲和力,我可以设置要使用的处理器或内核的具体数量。有了优先级,我只能设置一个优先级?
      • 您想在某个处理器上禁用/启用进程吗?我认为没有提供这种功能的 wmi 类,但我会检查。其他选项是使用 windows 附带的 .net 工具编译您自己的工具。
      • 无法使用批处理命令。即使 jscript/vbscript 在这里也无济于事。我认为 .net 是可能的(可以嵌入到批处理文件中),但不知道需要多长时间会带我去的。
      猜你喜欢
      • 1970-01-01
      • 2015-03-13
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      相关资源
      最近更新 更多