Вы тут: Главная → Толковые вопросы и ответы → Как задать постоянное сходство процесса (affinity) ядрам процессора?
Как задать постоянное сходство процесса (affinity) ядрам процессора?
Узнал о возможности задавать соответствие процессам, на нагрузку одного или нескольких ядер процессора. А вот чтобы этот параметр закрепить за *.exe файлом, такого нигде нет (за исключением использования сторонней программы, но это не вариант). В итоге приходится постоянно при загрузке задавать соответствие этому процессу. Может есть способ через ярлык или реестр указать, сколько ядер разрешено использовать тому или иному процессу?
- Nostra спросил(а) 8 лет назад
- последняя редакция 8 лет назад
- Войдите для отправки комментариев
- Новые вверху
- Старые вверху
- Случайным образом
- Недавно активные
Лучший ответ
Windows вполне эффективно управляет сходством процесса, поэтому менять это следует только в том случае, если в этом есть насущная необходимость, т.е. вы четко понимаете, что вы делаете и что это дает.
Запуск старых игр на одном ядре процессора
Для формирования ярлыка нужно знать шестнадцатеричное число, определяющее комбинацию желаемых процессоров.
1. Определите двоичное число
В диспетчере задач щелкните правой кнопкой мыши на процессе → Задать сходство.
Появится диалог со списком ЦП. Допустим, их 8 — от ЦП0 до ЦП7.
Выбранные ЦП обозначаются двоичным числом, в котором столько цифр, сколько у вас ЦП. Выбранные ЦП обозначаются единицами, не выбранные — нулями. Самая правая цифра — ЦП0, самая левая — ЦП7.
При стандартном запуске (картинка выше) выбраны все ЦП, поэтому число состоит из восьми единиц: 11111111. Если вы хотите только ЦП1 и ЦП4, число будет 00010010.
2. Конвертируйте двоичное число в шестнадцатеричное
- Откройте калькулятор и переведите его в режим программирования.
- Нажмите BIN и вставьте скопированное число.
Соответствующее шестнадцатеричное число — HEX. В данном случае — 12.
3. Сформируйте команду для ярлыка
Используйте команду start, чтобы указать шестнадцатеричное число в качестве значения для ключа /affinity
cmd.exe /c start «Notepad ++» /affinity 12 «C:Program Files (x86)Notepad++notepad++.exe»
В Windows XP команда start не поддерживает ключ /affinity. В этом случае надо использовать утилиту psexec с ключом /a из набора Systinternals PSTools.
psexec /a 12 «C:Program Files (x86)Notepad++notepad++.exe»
4. Создайте ярлык
- Щелкните правой кнопкой мыши на рабочем столе и выберите Создать → Ярлык.
- Вставьте сформированную команду.
Дополнительная информация
- Vadim Sterkin ответил(а) 8 лет назад
- последняя редакция 8 лет назад
Подскажите, эта команда подходит для Windows XP?(у меня XP) Получилось сформировать вот такую команду: cmd.exe /c start «XR_3DA» /affinity 3 «D:GamesS.T.A.L.K.E.RbinXR_3DA.exe» (команда ->2 ядра->путь) В ярлыке получилось: %windir%system32cmd.exe /c start «XR_3DA» /affinity 3 «D:GamesS.T.A.L.K.E.RbinXR_3DA.exe» Но ярлык не работает, подскажите, пожалуйста, что не так?
Не все ядра CPU отображаются. Что делать если видно только 2 ядра
- Vadim Sterkin
- 8 лет назад
Я добавил решение для Windows XP. Рекомендую не пользоваться устаревшими неподдерживаемыми системами и всегда указывать ОС, задавая вопрос.
Спасибо, получилось, но как-то интересно: при запуске ярлыка psexec /a 3 (или «-a 1,2») «D:GamesS.T.A.L.K.E.RbinXR_3DA.exe» (%windir%system32psexec.exe /a 3 «D:GamesS.T.A.L.K.E.RbinXR_3DA.exe» -nointro) загружает второе ядро, только при 100% загрузке первого. А если запустить приложение родным ярлыком и установить affinity из диспетчера, то нагрузка распределяется на 1ядро на ~70%-80%, а на 2ядро на ~20%-30% — странно. Каким же образом система задаёт параметр affinity, так, что он более адекватно распределяет нагрузку и где этот параметр временно меняется до завершения приложения. Может у, Вас, есть какие-нибудь идеи, по этому поводу?
- Vadim Sterkin
- 8 лет назад
Не интересовался. Курите MSDN или Windows Internals Руссиновича.
- Войдите для отправки комментариев
Источник: www.outsidethebox.ms
Настройка 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, а команда для запуска процесса с привязкой к четырем ядрам будет выглядеть так:
И еще, если требуется уточнить количество ядер процессора, то это можно сделать с помощью переменной окружения, командой:
Источник: windowsnotes.ru
Жизнь — это движение! А тестирование — это жизнь 🙂
Если у пользователей слабые машины с 1-2 ядрами процессора, десктопное приложение может тормозить. Поэтому в регресии стоит на мощной машинке выдать ему одно ядро и посмотреть, что он не тормозит как сволочь
Как сделать
- Диспетчер задач → Подробности.
- Найти нужный процесс.
- Правой кнопкой → Задать сходство (в Windows 7 пункт называется «Задать соответствие»).
- Снять галки, поставить только один ЦП.
- 4 железных процессора;
- 8 виртуальных (по 2 на каждом).
Из этого следует, что если мы эмулируем одноядерную машину с 2 виртуальными ядрами, то нужно включать ЦП0 и ЦП1.
Если включить, например, ЦП0 и ЦП2, то будут использованы два разных «железных» ядра и производительность будет сильно выше.
Posted by Ольга Назина (Киселева) at 12:18
5 комментариев:
нет нужного мне exe файла в «подробностях» Ответить Удалить
потому что он не включен Ответить Удалить
но я не знаю как запустить, мне нужно ограничить до запуска Ответить Удалить
Можно запустить приложение на нескольких логических процессорах с помощью параметра affinity. Указываем маску в шестнадцатеричном формате, например требуется использовать процессоры 1, 3, 5, 7, соответственно, это будет 10101010 или 0xAA, передаем в виде /affinity 0xAA.
т.е.
c:windowssystem32cmd.exe /C start /affinity 0xAA software.exe
где software.exe — ваше приложение
если вместо 0xAA — передавать цифру — приложение будет запущено на соответствующем цифре логическом ядре. Удалить
Источник: okiseleva.blogspot.com