Процес працює повільніше, як заплановане завдання, ніж це відбувається в інтерактивному режимі


41

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

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

Хтось має уявлення, що може бути різним між двома сценаріями? Я виключав відмінності в завантаженні процесора та IO - це завдання - єдине, для чого система використовується, тому більше нічого не працює, що могло б конкурувати за ресурси.


Будь які оновлення? Мені дуже цікаво побачити, що ви можете знайти.
mfinni

Я знайшов причину, на яку я думаю дивіться мою відповідь нижче.
Чарлі

Як і у Windows 10 Fall Creators, ця проблема все ще існує, і вирішення @Jason Mathison (редагування планувальників завдань .xml-файлу) все ще є найкращим рішенням.
BSalita

Відповіді:


36

Здається, тут є більше, ніж просто "регулярний" пріоритет процесу. Як я зазначив у запитанні, планувальник завдань за замовчуванням виконує вашу задачу нижче, ніж звичайний пріоритет. Це запитання в StackOverflow описує, як виправити будь-яку задачу для запуску з нормальним пріоритетом, але виправлення все ще залишає одне дещо інше: пріоритет пам’яті. Пріоритет пам’яті був новою функцією для Windows Vista і описаний у цій статті Technet . Ви можете бачити пріоритет пам’яті за допомогою Process Explorer , який є необхідним інструментом для будь-якого адміністратора чи програміста.

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

Для отримання інформації про підвищення пріоритету дивіться мою відповідь на відповідне питання StackOverflow про пріоритет IO; встановлення пріоритету пам’яті виконується аналогічно через NtSetInformationProcess, при цьому PROCESS_INFORMATION_CLASSвстановлено значення ProcessMemoryPriority(значення цього значення становить 39 або 0x27). Я можу зробити безкоштовну утиліту, яку можна встановити для цього, якщо інші потребують цього і не мають доступу до інструментів програміста.

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


Ви можете побачити пріоритет пам’яті в Process Explorer, двічі клацнувши ім'я виконавчого файлу, відкривши вкладку «Продуктивність», а в розділі «Фізична пам’ять» - запис для «Пріоритет пам’яті»
Моше

17

Проблема полягає в тому, що ваш процес починається з низького пріоритету вводу / виводу та низького пріоритету пам'яті. Найпростіший спосіб перевірити це за допомогою провідника процесів від sysinternals. Якщо ви подивитеся на властивості будь-якого з процесів, що були породжені цим запланованим завданням, ви побачите, що він має пріоритет вводу / виводу низький та пріоритет пам’яті 2.

Ось вирішення цього питання:

  1. Створіть завдання
  2. Клацніть правою кнопкою миші на задачі та "експортуйте" її
  3. Відредагуйте щойно експортований файл task.xml
  4. Ви знайдете рядок, подібний до <Priority>7</Priority>
  5. Змініть значення на звичайний пріоритет (між 4-6). Таблиця потенційних значень: властивість TaskSettings.Priority
    • Значення 4 матиме той самий пріоритет вводу / виводу та пам'яті, як і інтерактивний процес. Значення 5 і 6 матимуть нижчий пріоритет пам’яті
  6. У планувальнику завдань видаліть спочатку створене завдання
  7. У планувальнику завдань, в області дій, імпортуйте завдання з файлу XML

На жаль, немає можливості змінити початковий пріоритет запланованих завдань із графічного інтерфейсу.


Дякую за пропозицію. Черговий пріоритет процесу та пріоритет IO, безумовно, є його частиною, а інша частина - пріоритетом пам'яті. Див. Прийняту відповідь для отримання додаткової інформації.
Чарлі

Після експорту завдання в 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), щоб отримати більший пріоритет CPU.
Руна Аамодта

Для тих, хто думає, що ви зможете налаштувати це в реєстрі, не турбуйтеся, схоже, що там немає приємного редагування.
Нік

1

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

Якщо ви це зробите, чи потрібен більший чи коротший проміжок часу? Я не знаю, що це буде означати, але це може бути корисним диференціатором. Чи може бути якийсь мережевий доступ, який має обліковий запис користувача під час входу в систему, але не під час запуску як запланованого завдання, який потребує затримки та помилки? Чи відрізняється поведінка, якщо ви створюєте новий обліковий запис користувача і чи він запускається як заплановане завдання під цим обліковим записом?

Інша ідея: виконуючи це як заплановане завдання - тепер, коли ви зафіксували пріоритет у своєму скрипті, чи всі підпроцеси виконуються як нормальні, або нижче-нормальні?


1
Підпроцеси, безумовно, працюють як звичайні, як перевірено процесом / taskman. Я думаю, що в мережі справа не в тому, що вона не робить жодного істотного доступу до мережі, але я ще раз перевірю це. Ідея щодо виконання завдання як інтерактивного теж цікава, я спробую.
Чарлі

Сам процес не повинен робити жодного доступу до мережі, який ви знаєте, щоб це було проблемою. Прочитайте цей пост від Sysinternals і побачите, як щось, здавалося б, не пов'язане може спричинити зависання / повільність. blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni

1

Можливо, заплановані завдання за замовчуванням виконуються з нижчим пріоритетом.

Використовуйте prioдля примушування до більшого пріоритету.


Ти маєш рацію, що вони працюють із нижчим пріоритетом, але, як я вже згадував, я це вже врахував. Якщо немає іншого пріоритету, крім пріоритету процесу, про який я не знаю.
Чарлі

0

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

по-друге - ви повинні розуміти, що на передньому плані сеанс займає деякі ресурси, в основному IO жорсткого диска та пам'яті, тому заплановане завдання стає менше. для чіткого еталону ви повинні вийти з системи під час запуску сценарію

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


Дякую за ідеї. Машина має багато пам’яті та ємності вводу-виводу, проблема полягає лише в тому, що все працює повільніше, ніж заплановані завдання, ніж у інтерактивному режимі. Коли заплановане завдання виконується, зазвичай немає сеансу інтерактивного входу, тому я думаю, що це теж не проблема.
Чарлі

0

Це питання виникло дуже давно, і для Windows Server 2008R2. У мене було те саме питання, але для Windows 10. Для Windows 10 (перевірено 1703 та 1809) достатньо лише встановити "Пріоритет" на 4 за допомогою імпортних xml, щоб надати вам той же базовий пріоритет, динамічний пріоритет, пріоритет вводу / виводу , а також пріоритет пам'яті як інтерактивно розпочатий процес.


0

Ось фрагмент повноважень для встановлення пріоритету (працює у віддаленому сеансі оболонки 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.