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

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

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

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

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

решение1

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

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

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

EDIT: Я пошел дальше и написал бесплатную утилиту для запроса и установки приоритета памяти задачи,доступна здесь. Загрузка содержит как исходный код, так и скомпилированный двоичный файл.

решение2

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

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

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

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

решение3

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

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = $currentTask.Settings ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -TaskPath $currentTask.TaskPath -Settings $settings

решение4

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

Используйте prioдля принудительного повышения приоритета.

Связанный контент