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