По умолчанию в Windows запущенное приложение может выполняться на любом из ядер CPU. Распределением процессов между ядрами управляет операционная система. Однако вы можете вручную привязать определенные процессы к ядрам процессора с помощью Processor Affinity. В этой статье мы покажем, как вручную привязать программу/процесса к определенным ядрам.
Чаще всего ручная привязка процессу к ядрам нужна, когда:
- Вы хотите ограничить использование ресурсов CPU для определенного приложения;
- Некоторые legacy приложения могут некорректно работать в многоядерной архитектуре;
- Вы хотите повысить производительность ресурсоемкого приложения, выделив программе отдельные ядра CPU. Благодаря этому можно гарантировать доступность ядер для вашего процесса и уменьшить задержки, связанные с выбором и переключением между процессами.
Задать ядра CPU для приложения с помощью Task Manager
Вы можете вручную привязать процесс к определенным ядрам с помощью Task Manager.
- Запустите
Taskmgr.exe
и перейдите на вкладку Details; - Найдите нужный процесс, щелкните по нему правой клавишей и выберите Set Affinity;
- В открывшемся окне появится список ядер процессора. По умолчанию процесс может выполняться на любом из ядер CPU;
- Вы можете оставить включенными только те ядра, на которых должен выполняться ваш процесс.
В утилите Process Explorer вы можете также назначить ядра CPU для любого процесса. Щелкните по любому процессу и выберите Set Affinity.
Настройка Processor Affinity с помощью PowerShell
Вы можете управлять привязками процессам к ядрам с помощью PowerShell. Например, чтобы отобрать привязку процесса pwsh.exe к CPU, выполите такую команду PowerShell:
Get-Process pwsh | fl ProcessorAffinity
ProcessorAffinity : 63
Что означает число 63? Значение ProcessorAffinity это битовая маска, где каждому биту соответствует номер ядра процессора.
Получить количество ядер CPU на компьютере можно из переменной окружения:
$env:NUMBER_OF_PROCESSORS
В текущем компьютере доступно 6 ядер (если процессор поддерживает HyperThreading, то каждое ядро процессора будет считаться двумя логическими ядрам).
В нашем случае битовая маска для ProcessorAffinity получилась так:
CPU | Decimal | (2*decimal-1) | Hex |
CPU0 | 1 (20) | 1 | 1 |
CPU1 | 2 (21) | 3 | 2 |
CPU2 | 4 (22) | 7 | 4 |
CPU3 | 8 (23) | 15 | 8 |
CPU4 | 16 (24) | 31 | 10 |
CPU5 | 32 (2)5 | 63 | 20 |
CPU6 | 64 (2)6 | 127 | 40 |
CPU7 | 128 (2)7 | 255 | 80 |
1+2+4+8+16+32=63
Это означает, что для процесса доступны все 6 ядра.
Если вы хотите разрешить процессу использовать только 0 и 3 ядра, значение ProcessorAffinity нужно задать 9 (1+8)
Чтобы задать привязку ядер для процесса с помощью PowerShell, выполните команду:
$process = Get-Process pwsh
$process.ProcessorAffinity = 9
Если вы указали некорректно значение, команда вернет ошибку:
SetValueInvocationException: Exception setting "ProcessorAffinity": "The parameter is incorrect."
Проверьте текущие настройки процесса в Task Manager:
Если вам нужно сразу запустить процесс с привязкой к определенным ядрам, используйте такую команду:
Invoke-Command -ScriptBlock {cmd /c start /affinity 1 pwsh.exe}
Ярлык для запуска программы на одном ядре CPU
Для корректной работы некоторых устаревших приложений нужно, чтобы оно работато на первом ядре CPU.
Для запуска программы на CPU0 нужно выполнить такую команду:
cmd.exe /C start /affinity 1 myapp.exe
В данном примере в параметре affinity мы указали 1. Это значение ProcessorAffinity, которое указывает что программа будет всегда выполняться на первом ядре.
Выполните команду и проверьте, что процесс выполняется на CPU0.
В командной строке значение affinity задается в шестнадцатеричном режиме. Проще всего посчитать значение с помощью калькулятора в режиме Programmer.
Например:
1 (CPU0) + 2 (CPU1) +8 (CPU3) + 20 (CPU5) = 2B
Команда для запуска программы с привязкой к 4 ядрам:
cmd.exe /C start /affinity 2b pwsh.exe
Проверьте, что процесс привязан к указанным четырем ядрам.
Вы можете сразу увеличить приоритет процесса с помощью параметра /High:
cmd.exe /C start /high /affinity 1 myapp.exe
/low | /normal | /high | /realtime | /abovenormal | /belownormal
Если вам нужно постоянно запускать программу на одном ядре, можете создать на рабочем столе ярлык с параметрами:
cmd.exe /c start "Acrobat DC" /affinity 1 "C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe"
Если вы хотите изменить иконку ярлыка, нажмите кнопку Change Icon и укажте полный путь к исполняемому exe файлу целевого приложения. Выберите из ресурсов иконку, которая вам нравится.
Теперь, пользователю достаточно дважды щелкнуть по ярлыку, чтобы запустить приложение на одном ядре.
Некоторые приложениях Microsoft позволяют задать CPU Affinyty в настройках: