Как установить привязку процессора к исполняемому файлу в Windows XP? - PullRequest
9 голосов
/ 10 марта 2009

У меня есть четырехъядерная система со сторонним приложением, которая время от времени запускает несколько процессов (всегда один и тот же исполняемый файл, но несколько его экземпляров) и отнимает 100% процессорного времени. У меня также есть несколько веб-сервисов, работающих на одном компьютере (IIS и сторонние).

Проблема с занятостью всех ядер заключается в том, что он заставляет сторонний веб-сервер отключаться (хотя IIS работает нормально, но медленнее, чем обычно). У меня нет контроля над сторонним веб-сервером, он является частью более крупного продукта и должен быть в рабочем состоянии. Итак, я попытался поиграть с привязкой к процессору (через SysInternals Process Explorer) и ограничить эти надоедливые процессы 3 ядрами из 4 и выделить 4-е ядро ​​стороннему веб-серверу, и это, похоже, работает довольно хорошо.

Проблема в том, что он устанавливает сродство только на запущенный процесс, а не на исполняемый уровень, поэтому после завершения этих процессов и последующего респауна как новых процессов все снова становится одинаковым - они берут все 4 ядра. Итак, я погуглил об этой утилите ImageCfg.exe от Microsoft, но не могу найти ее на веб-сайте Microsoft для загрузки, и я вижу, что некоторые люди пробовали ее, и теперь жалуются, что она не работает.

Есть ли способ прикрепить привязку к исполняемому файлу?

Ответы [ 8 ]

6 голосов
/ 23 января 2010

http://waynes -world-it.blogspot.com / 2009/06 / процессор сродством-на-Windows-server.html

PowerShell

Используйте PowerShell, чтобы установить привязку процессора к одному или нескольким запущенным процессам. Ниже приведен пример сценария, устанавливающий маску процессора calc.exe для первых 4 процессоров. Мне нравится этот метод, потому что сценарий прост, его легко планировать, он работает на x86 и x64, поддерживает несколько процессов с одним и тем же именем и, по крайней мере, частично, потому что он показывает, насколько просто администрирование с PowerShell.

Обратите внимание, что если вы используете factorial большого числа с calc.exe (n!), Вы сгенерируете 100% CPU, что может быть полезно для тестирования. Маска ниже 0xf = 1111 - маска, позволяющая использовать только первые четыре процессора:

$calcSet = Get-Process -ProcessName "calc"
foreach ($calc in $calcSet) {$calc.ProcessorAffinity=0xF}
5 голосов
/ 10 марта 2009

Возможно, вы захотите посмотреть на параметр /AFFINITY до start.

Из справки:

AFFINITY    The new application will have the specified processor
            affinity mask, expressed as a hexadecimal number.

Поскольку сродство процессоров в Windows является битовой маской, вам, возможно, потребуются некоторые эксперименты, но я бы предположил, что 1 - первое ядро, поэтому 7 - первые три ядра, а F - все четыре. Или 8 только для четвертого.

Затем можно заменить запланированные задачи или ярлыки вызовом start с соответствующими параметрами.

5 голосов
/ 10 марта 2009

Одной из функций Process Lasso является установка соответствия процесса при каждом запуске этого процесса.

3 голосов
/ 13 июня 2009

Утилита ImageCfg.exe работает. Я только использовал это, чтобы решить проблему компании сегодня. Это доступно от http://www.robpol86.com/pages/imagecfg.php

Imagecfg -a 0x3 xxx.exe

ограничивает .exe для CPU0 и CPU1, например.

3 голосов
/ 10 марта 2009

Вы можете использовать оболочку приложения affine для одного процесса, чтобы принудительно запустить один процессор на уровне исполняемого файла, что приведет к принудительному запуску процесса на одном ядре.

В этой статье http://msdn.microsoft.com/en-us/library/bb173458.aspx, есть параграф о включении прокладки внизу.

3 голосов
/ 10 марта 2009

Использовать SetProcessAffinityMask () . И будьте осторожны, Сродство процессора унаследовано!

Вам нужно будет использовать ImageFileExecutionOptions, в частности

параметр «Отладчик» , и написать свой собственный маленький исполняемый файл, который вызывает SetProcessAffinityMask (), а затем запустить новый процесс, который вы хочу установить близость к. Установите это как отладчик, и все готово.

1 голос
/ 14 сентября 2012

Очевидно, что эта ветка устарела, но я все равно добавляю комментарий на тот случай, если кто-нибудь погуглит на эту тему (как я)

Вы можете попробовать установить приоритет процесса так, чтобы даже если он решает использовать 100% ЦП, то, что может иметь более высокий приоритет взять на себя, когда это необходимо сделать.

Делать это автоматически (вместо того, чтобы играть в задании менеджер) - это то, о чем я недавно спрашивал.

Команда запуска может использоваться для установки приоритета запуска процесса.

Например. start "my path\my process" /LOW для низкого приоритета.

Разрешенные приоритеты LOW, NORMAL, HIGH, REALTIME, ABOVENORMAL, BELOWNORMAL

Может быть вызван, например, из пакетного файла.

0 голосов
/ 10 марта 2009

Вы можете попытаться установить приоритет процесса, чтобы, даже если он решит использовать 100% ЦП, что-то с более высоким приоритетом может занять место, когда это необходимо.

Выполнение этого автоматически (вместо того, чтобы играть в диспетчере задач) - это то, о чем я недавно спрашивал.

...