process affinity что это
Что за зверь CPU Affinity и с чем его едят при майнинге
При майнинге на процессоре продвинутые майнеры используют возможность тонкой настройки параметров вычислений путем установки параметра CPU Affinity. Это дает потенциальную возможность выиграть дополнительные 1-2 процента в хешрейте.
Некоторые не знают значение данного параметра и для чего он служит. Между тем, правильная установка CPU Affinity на майнинг ригах с достаточно мощными процессорами способна обеспечить небольшое увеличение хешрейта при майнинге на процессоре при сохранении необходимой для основного майнера и системы вычислительной мощности CPU.
Рассмотрим подробнее, что такое параметр CPU Affinity, как он влияет на распределение ресурсов процессора и производительность майнинга.
Что такое CPU Affinity и как этот параметр влияет на режим работы процессора?
CPU Affinity – это программная привязка (закрепление) к ядрам процессора определенных вычислительных процессов. Такая привязка отдает ресурс назначенного пользователем физического ядра процессора нужному сервису/программе (например, майнеру), минуя автоматические (неэффективные) алгоритмы, использующиеся операционной системой. Ручная установка параметра AFFINITY прекращает прыгание исполняемой программы по ядрам процессора, которое бесполезно расходует машинное время и кэш CPU.
Закрепление ядра CPU позволяет увеличить время работы процессора по выполнению задач выбранной программы, в том числе майнера и тем самым увеличить хешрейт.
При включенной по умолчанию технологии Hyper Threading (HT) число доступных ядер удваивается за счет виртуализации. В этом случае нужно задействовать только физические ядра (нужно включать affinity для нечетного номера соответствующего виртуального потока).
Как на практике настроить параметр CPU Affinity для предоставления ресурсов процессора выбранным приложениям?
При настройке параметра CPU Affinity нужно выделать ресурсоемким приложениям физические, а не виртуальные ядра процессора. Например, при использовании процессора с двумя физическими и 4 виртуальными ядрами (0,1,2,3) нужно задействовать либо ядра 0, 2, либо 1 и 3
Для этого в батнике майнера для параметра cpuaffinity указывается маска с числовым значением, задающим номера ядер процессора, которые будут использоваться при проведении вычислений.
Эта опция будет полезна на практике только на достаточно производительных процессорах, у которых есть свободные мощности. На CPU с одним ядром и парой виртуальных потоков включение опции CPU Affinity ничего хорошего не даст.
Не стоит выделать майнеру все имеющиеся физические ядра при одновременном майнинге на видеокартах и выполнении других приложений на компьютере, так как это может привести к подвисаниям или уменьшению хешрейта на GPU.
В bat-файле майнера под Windows задействование 5 физических ядер из общего количества 6 реальных и 12 виртуальных будет выглядеть так:
Операционные системы Windows и Linux иногда по-разному нумеруют реальные и виртуальные ядра, поэтому для одинаковых процессоров значения CPU-affinity в этих системах могут быть разными.
Для удобства пользователя далее приведены значения аргумента cpu-affinity для Linux и Windows для вставки в батник xmrig в зависимости от количества использующихся физических ядер.
Таблица значений CPU affinity в соответствии с задействованными физическими ядрами процессора для Windows:
Физические ядра CPU
Intel I3-8100
Чтобы посчитать значение аффинити для Windows для своей конфигурации задействования ядер, нужно использовать написать в бинарном виде включенные/выключенные ядра/потоки (единица означает включение ядра) с последующей конвертацией в шестнадцатиричный формат.
Вычисление значения cpu-affinity на примере процессора Intel Core i7-8700K (6/12 ядер/потоков)
Чтобы найти значение affinity для процессора Intel Core i7-8700K:
Полученное число 555 записываем в формате 0x555 и проставляем в батник майнера в качестве аргумента параметра cpu-affinity.
Если задействуется 5 ядер из 6, то берем значение cpu-affinity для 0,2,4,6,8-х ядер, равное 155.
Пример батника для xmrig с использованием параметра cpu-affinity для задействованных 5 ядер:
Значения cpu-affinity для Linux
В Linux ядра/потоки считаются по другому, ниже приводятся значения CPU affinity для Linux.
Таблица значений CPU affinity в соответствии с задействованными физическими ядрами процессора для Linux:
Физические ядра CPU (Cores)
Значение cpu-affinity для майнера xmrig
Закрепление ядер за процессом штатными средствами Windows
В Windows закрепить ядра процессора за программой/сервисом можно с помощью диспетчера задач (ctrl+alt+del, задать сходство):
В открывшемся окне выбирают задействованные ядра (нужно выбирать одно физическое из пары реальное-виртуальное ядро):
Что на практике дает включение опции CPU Affinity при майнинге?
Активация функции CPU Affinity при майнинге на процессоре дает прирост хешрейта до 3-4% на алгоритмах типа RandomX. На других algo прирост может быть более существенным.
Хешрейт без включенной опции CPU Affinity на 4 потоках процессора Intel I7-7700 при майнинге Safex на алгоритме RandomSFX составляет примерно 2500 h/s (Windows 8.1):
С включенным режимом CPU Affinity выдает хешрейт около 2620 h/s (на 4 процента больше):
Вадим Стеркин
Узнал о возможности задавать соответствие процессам, на нагрузку одного или нескольких ядер процессора. А вот чтобы этот параметр закрепить за *.exe файлом, такого нигде нет (за исключением использования сторонней программы, но это не вариант). В итоге приходится постоянно при загрузке задавать соответствие этому процессу. Может есть способ через ярлык или реестр указать, сколько ядер разрешено использовать тому или иному процессу?
Windows вполне эффективно управляет сходством процесса, поэтому менять это следует только в том случае, если в этом есть насущная необходимость, т.е. вы четко понимаете, что вы делаете и что это дает.
Для формирования ярлыка нужно знать шестнадцатеричное число, определяющее комбинацию желаемых процессоров.
1. Определите двоичное число
В диспетчере задач щелкните правой кнопкой мыши на процессе → Задать сходство.
Появится диалог со списком ЦП. Допустим, их 8 — от ЦП0 до ЦП7.
Выбранные ЦП обозначаются двоичным числом, в котором столько цифр, сколько у вас ЦП. Выбранные ЦП обозначаются единицами, не выбранные — нулями. Самая правая цифра — ЦП0, самая левая — ЦП7.
При стандартном запуске (картинка выше) выбраны все ЦП, поэтому число состоит из восьми единиц: 11111111. Если вы хотите только ЦП1 и ЦП4, число будет 00010010.
2. Конвертируйте двоичное число в шестнадцатеричное
Соответствующее шестнадцатеричное число — HEX. В данном случае — 12.
3. Сформируйте команду для ярлыка
Используйте команду start, чтобы указать шестнадцатеричное число в качестве значения для ключа /affinity
В Windows XP команда start не поддерживает ключ /affinity. В этом случае надо использовать утилиту psexec с ключом /a из набора Systinternals PSTools.
Process. Processor Affinity Свойство
Определение
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Получает или задает процессоры, на которых может быть запланировано выполнение потоков данного процесса.
Значение свойства
Битовая маска, представляющая процессоры, на которых могут выполняться потоки связанного процесса. По умолчанию маска зависит от числа процессоров в компьютере. Значение по умолчанию — 2 n – 1, где n — число процессоров.
Исключения
Не удается задать или получить сведения о ProcessorAffinity от связанного ресурса процесса.
-или- Идентификатор процесса или дескриптор процесса равен нулю. (Процесс не был запущен.)
Вы пытаетесь получить доступ к свойству ProcessorAffinity процесса, выполняющегося на удаленном компьютере. Это свойство доступно только для процессов, запущенных на локальном компьютере.
-или- Процесс завершен.
Комментарии
Значение, возвращаемое этим свойством, представляет самое последнее обновленное сходство процесса. Чтобы получить наиболее актуальное соответствие, необходимо Refresh() сначала вызвать метод.
в Windows 2000 и более поздних версиях поток процесса может переходить с процессора на процессор, при этом каждый процесс миграции перезагружает кэш процессора. При высоких нагрузках на систему указание того, какой процессор должен запустить конкретный поток, может повысить производительность, уменьшая количество раз, когда кэш процессора перезагружается. Связь между процессором и потоком называется сходством процессоров.
Каждый процессор представляется в виде бита. Бит 0 — первый процессор, бит 1 — второй процессор и т. д. Если установить бит равным значению 1, соответствующий процессор будет выбран для назначения потоков. Если ProcessorAffinity значение равно нулю, то алгоритмы планирования операционной системы устанавливают сходство потока. Если ProcessorAffinity значение равно любому ненулевому значению, оно интерпретируется как битовая маска, указывающая, какие процессоры могут быть выбраны для выбора.
В следующей таблице приведены ProcessorAffinity значения для системы из восьми процессоров.
Настройка Processor Affinity с помощью PowerShell
По умолчанию запущенное в Windows приложение может выполняться на любом из ядер процессора, а распределением процессорных мощностей занимается операционная система. Обычно она неплохо справляется с этой задачей, но иногда все же требуется ручная настройка. Для этой цели в Windows есть функционал Processor Affinity, который позволяет осуществлять привязку вычислительных процессов к ядрам процессора.
При помощи этого функционала можно указать сходство (affinity) процесса с определенными ядрами процессора, тем самым привязав процесс к этим ядрам. Если вы установили для процесса привязку к определенным ядрам, то он будет выполняться только на этих ядрах.
В какой ситуации может потребоваться настройка Processor Affinity:
• Для ограничения потребления ресурсов конкретным приложением. Самый простой и эффективный, хотя и достаточно грубый способ ограничить для приложения потребляемую процессорную мощность.
• Для обеспечения совместимости. К примеру требуется запустить устаревшее приложение, которое работает некорректно в многопроцессорной системе.
• Для повышения производительности. В случае с ресурсоемкими приложениями (напр. рендеринг видео) иногда рекомендуют выделить программе отдельные ядра процессора. Это гарантирует, что ядра будут всегда доступны для выполнения задачи и не будет задержек, связанных с выбором и переключением между ядрами.
Проще всего осуществить привязку с помощью диспетчера задач (Task Manager). Для этого надо на вкладке Details (Подробности) найти нужный процесс, кликнуть на нем правой клавишей мыши и в контекстном меню выбрать пункт Set Affinity (Задать сходство).
В открывшемся окне буду показаны все имеющиеся ядра процессора. Те, которые процесс может использовать, отмечены галочкой. Для изменения просто убираем галочку с ненужных ядер и жмем ОК.
Можно осуществлять привязку и с помощью PowerShell. Для примера запустим Блокнот (notepad) и выведем его текущее значение командой:
Get-Process notepad | fl ProcessorAffinity
А теперь давайте разберемся, откуда взялась цифра 15. Дело в том, что ProcessorAffinity представляет из себя битовую маску (bitmask), где каждому биту соответствует ядро процессора. Если для ядра отмечено сходство (affinity), то бит выставляется в 1, если нет — то в 0. В нашем случае отмечены все ядра, поэтому маска выглядит так:
CPU3 | CPU2 | CPU1 | CPU0 |
1 | 1 | 1 | 1 |
Примечание. При использовании технологии HyperThreading каждое физическое ядро определяется операционной системой как два отдельных процессора (два логических ядра).
Теперь переведем двоичные значения в десятичные и получим:
CPU | BitMask | Dec |
CPU0 | 0001 | 1 (2 0 ) |
CPU1 | 0010 | 2 (2 1 ) |
CPU2 | 0100 | 4 (2 2 ) |
CPU3 | 1000 | 8 (2 3 ) |
Складываем полученные десятичные значения и получаем:
1 + 2 + 4 +8 = 15
Таким образом число 15 означает, что используются все 4 ядра процессора. Если мы хотим это изменить и привязать процесс к определенным ядрам, то складываем только те значения, которые соответствуют этим ядрам. Например, требуется привязать процесс к первым трем ядрам, соответственно значение будет складываться так:
1 + 2 + 4 = 7
Значение получено, теперь осуществим привязку. Для этого выполним следующие команды:
$process = Get-Process notepad
$process.ProcessorAffinity = 7
Проверим результат и в графической оснастке. Как видите, нашему процессу сопоставлены три ядра процессора, как и было задумано 🙂
Таким образом можно осуществить привязку уже запущенного процесса, а можно ли запустить процесс сразу с привязкой к определенным ядрам? Можно, с помощью утилиты командной строки start с ключом /affinity. Например, для запуска блокнота с привязкой к первому ядру достаточно выполнить команду:
start /affinity 1 notepad
Эта команда отлично работает в командной консоли, но если вы попытаетесь выполнить ее при помощи PowerShell, то получите ошибку. Дело в том, что в PowerShell команда start является алиасом для командлета Start-Command, для которого указанные параметры являются недопустимыми.
Поэтому, если все же требуется запуск именно из PowerShell, то команду придется немного видоизменить. Например так:
Указывать значение маски в данном случае надо не в десятичном, а в шестнадцатеричном виде. К примеру десятичное значение 15 в шестнадцатеричном виде будет равно F, а команда для запуска процесса с привязкой к четырем ядрам будет выглядеть так:
И еще, если требуется уточнить количество ядер процессора, то это можно сделать с помощью переменной окружения, командой:
Process. Processor Affinity Property
Definition
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Gets or sets the processors on which the threads in this process can be scheduled to run.
Property Value
Exceptions
ProcessorAffinity information could not be set or retrieved from the associated process resource.
The process identifier or process handle is zero. (The process has not been started.)
You are attempting to access the ProcessorAffinity property for a process that is running on a remote computer. This property is available only for processes that are running on the local computer.
The process Id was not available.
The process has exited.
Remarks
The value returned by this property represents the most recently refreshed affinity of the process. To get the most up to date affinity, you need to call Refresh() method first.
In Windows 2000 and later, a thread in a process can migrate from processor to processor, with each migration reloading the processor cache. Under heavy system loads, specifying which processor should run a specific thread can improve performance by reducing the number of times the processor cache is reloaded. The association between a processor and a thread is called the processor affinity.
Each processor is represented as a bit. Bit 0 is processor one, bit 1 is processor two, and so forth. If you set a bit to the value 1, the corresponding processor is selected for thread assignment. When you set the ProcessorAffinity value to zero, the operating system’s scheduling algorithms set the thread’s affinity. When the ProcessorAffinity value is set to any nonzero value, the value is interpreted as a bitmask that specifies those processors eligible for selection.
The following table shows a selection of ProcessorAffinity values for an eight-processor system.