У меня есть запланированная задача, которая очень нагружает процессор и ввод-вывод и запускается около четырех часов (сборка исходного кода, если вам интересно). Задача - это сценарий Powershell, который запускает различные подпроцессы для выполнения своей работы. Когда я запускаю тот же процесс в интерактивном режиме из командной строки Powershell с той же учетной записью пользователя, он выполняется примерно через два с половиной часа. Задача выполняется на Windows Server 2008 R2.
Я хочу знать, почему выполнение запланированной задачи занимает гораздо больше времени - больше, чем на час. Я заметил одну вещь: планировщик задач работает с приоритетом ниже нормального, поэтому при запуске моей задачи он наследует тот же пониженный приоритет. Тем не менее, я обновил сценарий, чтобы вернуть приоритет процесса Powershell обратно в значение «Нормальный», и это по-прежнему занимает столько же времени.
У кого-нибудь есть идея, что может отличаться между двумя сценариями? Я исключил различия в загрузке процессора и ввода-вывода - эта задача - единственное, для чего используется система, поэтому больше ничего не работает, что могло бы конкурировать за ресурсы.
Похоже, здесь действует нечто большее, чем просто «обычный» приоритет процесса. Как я уже отмечал в вопросе, планировщик задач по умолчанию запускает вашу задачу с более низким приоритетом, чем обычно. Этот вопрос о StackOverflow описывает, как исправить любую задачу, чтобы она выполнялась с приоритетом Normal, но исправление по-прежнему оставляет немного другое: приоритет памяти. Приоритет памяти был новой функцией в Windows Vista и описан в эта статья Technet. Вы можете увидеть приоритет памяти, используя Обозреватель процессов, который является обязательным инструментом для любого администратора или программиста.
В любом случае, даже с исправлением приоритета запланированной задачи, приоритет памяти вашей задачи установлен на 4, что на одну ступень ниже обычного значения 5. Когда я вручную увеличил приоритет памяти моей задачи до 5, производительность была на наравне с интерактивным запуском процесса.
Для получения информации о повышении приоритета см. мой ответ на связанный вопрос StackOverflow о приоритете ввода-вывода; установка приоритета памяти выполняется аналогично, через NtSetInformationProcess, с PROCESS_INFORMATION_CLASS
установлен в ProcessMemoryPriority
(значение 39 или 0x27). Я мог бы сделать бесплатную утилиту, которую можно было бы использовать для установки этого, если это нужно другим и у них нет доступа к инструментам программиста.
РЕДАКТИРОВАТЬ: Я пошел дальше и написал бесплатную утилиту для запроса и установки приоритета памяти задачи, доступна здесь. Загрузка содержит как исходный код, так и скомпилированный двоичный файл.
Проблема в том, что ваш процесс запускается с низким приоритетом ввода-вывода и низким приоритетом памяти. Самый простой способ проверить это - воспользоваться проводником процессов от sysinternals. Если вы посмотрите на свойства любого из процессов, порожденных этой запланированной задачей, вы увидите, что у него низкий приоритет ввода-вывода и приоритет памяти 2.
Вот решение этой проблемы:
<Priority>7</Priority>
К сожалению, нет возможности изменить начальный приоритет запланированных задач из графического интерфейса.
Если вы настроите его на запуск как запланированную задачу от имени пользователя X, а затем войдете в систему как пользователь X до того, как он должен запуститься, он должен открыть окно в вашем сеансе, когда он будет запущен, он будет работать в вашем сеансе.
Если вы сделаете это, займет ли это больше или меньше времени? Я не знаю, что это будет значить, но это может быть полезным отличием. Может ли быть какой-то доступ к сети, который есть у учетной записи пользователя при входе в систему, но не при запуске в качестве запланированной задачи, который требует тайм-аута и сбоя? Отличается ли поведение, если вы создаете новую учетную запись пользователя и запускаете ее как запланированную задачу под этой учетной записью?
Еще одна идея: при запуске как запланированной задачи - теперь, когда вы установили приоритет в своем сценарии, все ли подпроцессы выполняются как нормальные или ниже нормальные?
Возможно, запланированные задачи по умолчанию выполняются с более низким приоритетом.
Использовать prio
чтобы заставить более высокий приоритет.
Вот фрагмент кода PowerShell для установки приоритета (работает в удаленном сеансе PowerShell!):
$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = $currentTask.Settings ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -Settings $settings
сначала - вы можете использовать приоритет выше обычного (например, высокий)
во-вторых, вы должны понимать, что сеанс переднего плана требует некоторых ресурсов, в основном ввода-вывода жесткого диска и памяти, поэтому запланированная задача становится меньше. для четкого теста вам нужно выйти из системы во время работы сценария PowerShell
а также вы можете попробовать добавить больше памяти / использовать ramdrive / разделить работу на нескольких жестких дисках, чтобы ускорить процессы
Этот вопрос был задан некоторое время назад и для Windows Server 2008R2. У меня был тот же вопрос, но для Windows 10. В Windows 10 (проверено на 1703 и 1809) достаточно просто установить «Приоритет» на 4 через импортированный xml, чтобы дать вам тот же базовый приоритет, динамический приоритет, приоритет ввода-вывода. и приоритет памяти как интерактивно запускаемый процесс.