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


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.