Процесс выполняется медленнее запланированной задачи, чем интерактивно

41

У меня есть запланированное задание, которое сильно загружает процессор и ввод-вывод и занимает около четырех часов (сборка исходного кода, если вам интересно). Задача представляет собой скрипт Powershell, который порождает различные подпроцессы для выполнения своей работы. Когда я запускаю тот же процесс в интерактивном режиме из приглашения Powershell, используя ту же учетную запись пользователя, он выполняется примерно через два с половиной часа. Задача выполняется на Windows Server 2008 R2.

Что я хочу знать, так это то, почему выполнение запланированной задачи занимает намного больше времени - более часа. Одна вещь, которую я заметил, заключается в том, что планировщик задач работает с приоритетом ниже обычного, поэтому при запуске моей задачи он наследует тот же пониженный приоритет. Однако я обновил скрипт, чтобы вернуть приоритет процесса Powershell в значение Normal, и это все равно занимает столько же времени.

У кого-нибудь есть идея, что может отличаться между этими двумя сценариями? Я исключил различия в загрузке процессора и ввода-вывода - эта задача - единственное, для чего используется система, поэтому больше ничего не работает, чтобы конкурировать за ресурсы.

Чарли
источник
Любые обновления? Мне очень любопытно посмотреть, что вы можете найти.
mfinni
Я нашел то, что я думаю, было причиной; см. мой ответ ниже.
Чарли
Начиная с Windows 10 Fall Creators, эта проблема все еще существует, и обходной путь @Jason Mathison (отредактируйте XML-файл Task Scheduler) по-прежнему является лучшим решением.
BSalita

Ответы:

36

Похоже, что здесь работает не только «обычный» приоритет процесса. Как я отмечал в этом вопросе, планировщик задач по умолчанию запускает вашу задачу с приоритетом ниже обычного. В этом вопросе о StackOverflow описывается, как исправить любую задачу, выполняемую с обычным приоритетом, но это исправление оставляет одну вещь немного другой: приоритет памяти. Приоритет памяти был новой функцией для Windows Vista и описан в этой статье Technet . Вы можете увидеть приоритет памяти, используя Process Explorer , который является обязательным инструментом для любого администратора или программиста.

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

Информацию о повышении приоритета см. В моем ответе на связанный вопрос StackOverflow о приоритете ввода-вывода; установка приоритета памяти выполняется аналогично, через NtSetInformationProcess, с PROCESS_INFORMATION_CLASSустановленным значением ProcessMemoryPriority(значение этого параметра равно 39 или 0x27). Я мог бы сделать бесплатную утилиту, которая может быть использована для установки этого, если другие нуждаются в этом и не имеют доступа к инструментам программиста.

РЕДАКТИРОВАТЬ: я пошел дальше и написал бесплатную утилиту для запроса и установки приоритета памяти задачи, доступную здесь . Загрузка содержит как исходный код, так и скомпилированный двоичный файл.

Чарли
источник
Вы можете увидеть приоритет памяти в Process Explorer, дважды щелкнув по имени исполняемого файла, открыв вкладку «Производительность», и в разделе «Физическая память» есть запись для «Приоритет памяти»
Моше
17

Проблема в том, что ваш процесс начинается с низкого приоритета ввода-вывода и низкого приоритета памяти. Самый простой способ убедиться в этом - использовать Process Explorer от sysinternals. Если вы посмотрите на свойства любого из процессов, которые были созданы из этой запланированной задачи, вы увидите, что у нее низкий приоритет ввода-вывода и приоритет памяти 2.

Вот решение этой проблемы:

  1. Создать задачу
  2. Щелкните правой кнопкой мыши на задаче и «экспортируйте» ее
  3. Отредактируйте только что экспортированный файл task.xml
  4. Вы найдете строку, аналогичную <Priority>7</Priority>
  5. Измените значение на обычный приоритет (между 4-6). Таблица потенциальных значений: свойство TaskSettings.Priority
    • Значение 4 будет иметь тот же приоритет ввода / вывода и приоритет памяти, что и интерактивный процесс. Значения 5 и 6 будут иметь более низкий приоритет памяти
  6. В планировщике задач удалите изначально созданную задачу
  7. В планировщике задач в области действий импортируйте задачу из файла XML

К сожалению, нет способа изменить начальный приоритет запланированных задач из графического интерфейса.

Джейсон Матисон
источник
Спасибо за предложение. Обычный приоритет процесса и приоритет ввода-вывода, безусловно, являются его частью, а другая часть - приоритетом памяти. Смотрите принятый ответ для получения дополнительной информации.
Чарли
После экспорта задачи в файл XML вам может потребоваться изменить кодировку символов с Unicode на ANSI. В Windows Server 2008 R2 экспорт представляет собой файл Unicode, и при попытке импортировать его обратно появляется сообщение об ошибке The format of the task is not valid. The following error was reported: (1,2)::. Сохранение файла в ANSI разрешит его для меня.
Эрик Андерсон
Большое спасибо, это действительно лучшее решение. Как упоминается в документации, вы также можете установить Приоритет еще выше (по крайней мере, до 1), чтобы получить более высокий приоритет ЦП.
Руна Аамодт
Для тех, кто думает, что вы можете изменить это в реестре, не беспокойтесь, похоже, что его нет в редактируемом виде.
Ник
1

Если вы установите его для запуска в качестве запланированной задачи от имени пользователя X, а затем войдете в систему как пользователь X, прежде чем он должен запуститься, он должен открыть окно в вашем сеансе, когда он запустится, он будет запущен в вашем сеансе.

Если вы это сделаете, это займет больше или меньше времени? Я не знаю, что это будет значить, но это может быть полезным отличием. Может ли быть доступ к сети, который есть у учетной записи пользователя при входе в систему, но не при запуске в качестве запланированной задачи, для которой требуется время ожидания и сбой? Отличается ли поведение, если вы создаете новую учетную запись пользователя и запускаете ее как запланированную задачу под этой учетной записью?

Еще одна идея: когда вы запускаете его как запланированное задание - теперь, когда вы установили приоритет в вашем скрипте, все подпроцессы выполняются как «Нормальный» или «Ниже-Нормальный»?

mfinni
источник
1
Подпроцессы определенно выполняются как Нормальные, как проверено procxp / taskman. Я думаю, что с сетью дело не в этом, потому что она не обеспечивает никакого существенного доступа к сети, но я проверю это дважды. Интересна и идея запустить задачу как интерактивную, попробую.
Чарли
Сам процесс не должен делать какой-либо доступ к сети, о котором вы знаете, чтобы это было проблемой. Прочтите этот пост от Sysinternals и посмотрите, как что-то, что на первый взгляд не связано, может вызвать зависания / медлительность. blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni
1

Возможно, запланированные задачи выполняются с более низким приоритетом по умолчанию.

Используйте, prioчтобы заставить более высокий приоритет.

mcandre
источник
Вы правы, что они работают с более низким приоритетом, но, как я уже говорил, я уже учел это. Если нет какого-либо приоритета, кроме приоритета процесса, о котором я не знаю.
Чарли
0

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

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

а также вы можете попробовать добавить больше памяти / использовать ramdrive / split работу на нескольких жестких дисках для ускорения процессов

evg345
источник
Спасибо за идеи. Машина имеет много памяти и возможностей ввода-вывода, проблема в том, что все выполняется медленнее, чем запланированные задачи, чем интерактивно. Когда запланированная задача выполняется, сеанс интерактивного входа в систему обычно не выполняется, поэтому я думаю, что это не проблема.
Чарли
0

Этот вопрос давно задан и для windows server 2008R2. У меня был тот же вопрос, но для Windows 10. В Windows 10 (проверено на 1703 и 1809) достаточно просто установить «Приоритет» на 4 через импортированный XML, чтобы дать вам тот же Базовый приоритет, Динамический приоритет, Приоритет ввода-вывода и приоритет памяти как интерактивно запущенный процесс.

aggieNick02
источник
0

Вот фрагмент powershell для установки приоритета (работает в удаленном сеансе powershell!):

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = New-ScheduledTaskSettingsSet ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -Trigger $currentTask.Triggers -Action $currentTask.Actions -Settings $settings -User "NT AUTHORITY\SYSTEM"
Хэнк Киллингер
источник