Proces przebiega wolniej jako zaplanowane zadanie niż interaktywnie


41

Mam zaplanowane zadanie, które jest bardzo obciążające procesor i operacje wejścia / wyjścia i zajmuje około czterech godzin (budowanie kodu źródłowego, jeśli jesteś ciekawy). Zadanie to skrypt Powershell, który odradza różne podprocesy, aby wykonać swoją pracę. Kiedy uruchamiam ten sam proces interaktywnie z wiersza polecenia Powershell, jak to samo konto użytkownika, działa on w ciągu około dwóch i pół godziny. Zadanie działa w systemie Windows Server 2008 R2.

Chcę wiedzieć, dlaczego tak długo trwa uruchomienie zaplanowanego zadania - ponad godzinę dłużej. Zauważyłem jedną rzecz: harmonogram zadań działa z priorytetem poniżej normalności, więc kiedy moje zadanie się rozpoczyna, dziedziczy ten sam niższy priorytet. Jednak zaktualizowałem skrypt, aby ustawić priorytet procesu PowerShell z powrotem na Normalny, i nadal zajmuje to tyle samo czasu.

Czy ktoś ma pojęcie, co może różnić się między tymi dwoma scenariuszami? Wykluczyłem różnice w obciążeniu procesora i we / wy - to zadanie jest jedyną rzeczą, z której korzysta system, więc nie ma nic innego, co mogłoby konkurować o zasoby.


Jakieś aktualizacje? Jestem bardzo ciekawy, co można znaleźć.
mfinni

Znalazłem przyczynę; zobacz moją odpowiedź poniżej.
Charlie

Począwszy od systemu Windows 10 Fall Creators problem ten nadal występuje, a obejście @Jason Mathison (edycja pliku .xml Harmonogram zadań) jest nadal najlepszym rozwiązaniem.
BSalita,

Odpowiedzi:


36

Wygląda na to, że w tym przypadku istnieje coś więcej niż „zwykły” priorytet procesu. Jak zauważyłem w pytaniu, harmonogram zadań domyślnie uruchamia twoje zadanie z niższym niż normalnie priorytetem. To pytanie na StackOverflow opisuje, jak naprawić dowolne zadanie uruchamiane z normalnym priorytetem, ale poprawka nadal pozostawia jedną rzecz nieco inną: priorytet pamięci. Priorytet pamięci był nową funkcją systemu Windows Vista i został opisany w tym artykule Technet . Priorytet pamięci można sprawdzić za pomocą Process Explorera , który jest niezbędnym narzędziem dla każdego administratora lub programisty.

W każdym razie, nawet z zaplanowaną poprawą priorytetu zadania, priorytet pamięci dla twojego zadania jest ustawiony na 4, co jest o jeden stopień poniżej normalnego ustawienia 5. Gdy ręcznie podniosłem priorytet pamięci dla mojego zadania do 5, wydajność była włączona na równi z interaktywnym uruchomieniem procesu.

Aby uzyskać informacje na temat zwiększania priorytetu, zobacz moją odpowiedź na powiązane pytanie StackOverflow dotyczące priorytetu We / Wy ; ustawianie priorytetu pamięci odbywa się podobnie, poprzez NtSetInformationProcess, z PROCESS_INFORMATION_CLASSustawieniem na ProcessMemoryPriority(wartość to 39 lub 0x27). Mogę stworzyć darmowe narzędzie, którego można użyć do ustawienia tego, jeśli inni tego potrzebują i nie mają dostępu do narzędzi programistycznych.

EDYCJA: Napisałem bezpłatne narzędzie do wysyłania zapytań i ustawiania priorytetu pamięci zadania, dostępne tutaj . Pobieranie zawiera zarówno kod źródłowy, jak i skompilowany plik binarny.


Priorytet pamięci można zobaczyć w Eksploratorze procesów, klikając dwukrotnie nazwę pliku wykonywalnego, otwierając zakładkę „Wydajność”, a pod „Pamięcią fizyczną” wpis „Priorytet pamięci”
Moshe

17

Problem polega na tym, że proces zaczyna się od niskiego priorytetu we / wy i niskiego priorytetu pamięci. Najłatwiej to sprawdzić za pomocą eksploratora procesów z sysinternals. Jeśli spojrzysz na właściwości dowolnego procesu, który został spawnowany z tego zaplanowanego zadania, zobaczysz, że ma on niski priorytet we / wy i priorytet pamięci 2.

Oto rozwiązanie tego problemu:

  1. Utwórz zadanie
  2. Kliknij zadanie prawym przyciskiem myszy i „wyeksportuj”
  3. Zmodyfikuj właśnie wyeksportowany plik task.xml
  4. Znajdziesz linię podobną do <Priority>7</Priority>
  5. Zmień wartość na normalny priorytet (między 4-6). Tabela potencjalnych wartości: właściwość TaskSettings.Priority
    • Wartość 4 będzie miała taki sam priorytet I / O i priorytet pamięci jak proces interaktywny. Wartości 5 i 6 będą miały niższy priorytet pamięci
  6. W harmonogramie zadań usuń utworzone wcześniej zadanie
  7. W harmonogramie zadań w obszarze działań zaimportuj zadanie z pliku XML

Niestety nie ma możliwości zmodyfikowania początkowego priorytetu zaplanowanych zadań z GUI.


Dzieki za sugestie. Priorytet regularnego procesu i priorytet IO są zdecydowanie jego częścią, a druga część to priorytet pamięci. Zobacz zaakceptowaną odpowiedź, aby uzyskać więcej informacji.
Charlie,

Po wyeksportowaniu zadania do pliku XML może być konieczna zmiana kodowania znaków z Unicode na ANSI. W systemie Windows Server 2008 R2 eksport jest plikiem Unicode i przy próbie zaimportowania go z powrotem The format of the task is not valid. The following error was reported: (1,2)::pojawia się komunikat o błędzie . Zapisanie pliku w ANSI rozwiązuje go dla mnie.
Erik Anderson,

Dziękuję bardzo, to naprawdę najlepsze rozwiązanie. Jak wspomniano w dokumentacji, można również ustawić Priorytet jeszcze wyżej (przynajmniej do 1), aby uzyskać wyższy priorytet procesora.
Rune Aamodt

Dla każdego, kto myśli, że możesz poprawić to w rejestrze, nie przejmuj się, nie wydaje się, że jest tam w przyjemny sposób do edycji.
Nik

1

Jeśli ustawisz, aby działało jako zaplanowane zadanie jako Użytkownik X, a następnie zalogujesz się jako Użytkownik X, zanim ma ono zostać uruchomione, powinno otworzyć okno sesji po uruchomieniu, będzie działać w trakcie sesji.

Jeśli to zrobisz, czy potrwa to dłużej, czy krócej? Nie wiem, co to będzie oznaczać, ale może być przydatnym wyróżnikiem. Czy może istnieć pewien dostęp do sieci, który ma konto użytkownika po zalogowaniu, ale nie podczas uruchamiania jako zaplanowane zadanie, które musi przekroczyć limit czasu i zakończyć się niepowodzeniem? Czy zachowanie jest inne, jeśli utworzysz nowe konto użytkownika i uruchomisz je jako zaplanowane zadanie na tym koncie?

Kolejny pomysł: kiedy uruchamiasz go jako zaplanowane zadanie - czy po ustaleniu priorytetu skryptu wszystkie podprocesy działają normalnie, czy poniżej normalności?


1
Podprocesy zdecydowanie działają jako Normalne, co zostało zweryfikowane przez procexp / taskman. Myślę, że kwestia sieci nie jest prawdą, ponieważ nie zapewnia żadnego istotnego dostępu do sieci, ale sprawdzę to dwukrotnie. Ciekawy jest też pomysł uruchomienia zadania jako interaktywnego, spróbuję.
Charlie

Sam proces nie wymaga dostępu do sieci, o którym wiesz, że jest to problem. Przeczytaj ten post z Sysinternals i zobacz, jak coś pozornie niezwiązanego może powodować zawieszanie się / spowolnienie. blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni

1

Być może zaplanowane zadania są domyślnie uruchamiane z niższym priorytetem.

Użyj, prioaby wymusić wyższy priorytet.


Masz rację, że mają niższy priorytet, ale jak już wspomniałem, już to uwzględniłem. Chyba że istnieje jakiś priorytet inny niż priorytet procesu, o którym nie wiem.
Charlie

0

na początku - możesz użyć priorytetu wyższego niż normalny (na przykład Wysoki)

po drugie - musisz zrozumieć, że sesja pierwszego planu zajmuje trochę zasobów, głównie We / Wy dysku twardego i pamięci, więc zaplanowane zadanie staje się mniejsze. dla jasnego testu porównawczego musisz się wylogować podczas działania skryptu PowerShell

a także możesz spróbować dodać więcej pamięci / użyć pracy z ramdrive / split na kilku dyskach twardych, aby przyspieszyć procesy


Dzięki za pomysły. Maszyna ma dużo pamięci i pojemność IO, problem polega na tym, że rzeczy działają wolniej niż zaplanowane zadania niż interaktywnie. Gdy zaplanowane zadanie jest uruchomione, zwykle nie ma interaktywnej sesji logowania, więc myślę, że nie o to też chodzi.
Charlie

0

To pytanie jest jakiś czas temu i dotyczy systemu Windows Server 2008R2. Miałem to samo pytanie, ale w przypadku systemu Windows 10. W systemie Windows 10 (zweryfikowanym w 1703 i 1809) wystarczy ustawić „Priorytet” na 4 za pomocą importowanego pliku XML, aby uzyskać ten sam priorytet podstawowy, priorytet dynamiczny, priorytet we / wy oraz Priorytet pamięci jako interaktywnie rozpoczęty proces.


0

Oto fragment PowerShell do ustawiania priorytetu (działa w zdalnej sesji 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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.