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.
Odpowiedzi:
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_CLASS
ustawieniem naProcessMemoryPriority
(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.
źródło
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:
<Priority>7</Priority>
Niestety nie ma możliwości zmodyfikowania początkowego priorytetu zaplanowanych zadań z GUI.
źródło
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.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?
źródło
Być może zaplanowane zadania są domyślnie uruchamiane z niższym priorytetem.
Użyj,
prio
aby wymusić wyższy priorytet.źródło
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
źródło
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.
źródło
Oto fragment PowerShell do ustawiania priorytetu (działa w zdalnej sesji PowerShell!):
źródło