Der Prozess wird als geplante Aufgabe langsamer ausgeführt als interaktiv

41

Ich habe eine geplante Aufgabe, die sehr CPU- und IO-intensiv ist und deren Ausführung etwa vier Stunden dauert (Erstellen von Quellcode, wenn Sie neugierig sind). Die Aufgabe ist ein Powershell-Skript, das verschiedene Unterprozesse für die Ausführung seiner Arbeit erzeugt. Wenn ich denselben Prozess interaktiv von einer Powershell-Eingabeaufforderung aus als dasselbe Benutzerkonto ausführe, dauert es ungefähr zweieinhalb Stunden. Die Aufgabe wird unter Windows Server 2008 R2 ausgeführt.

Ich möchte wissen, warum die Ausführung als geplante Aufgabe so viel länger dauert - mehr als eine Stunde länger. Eine Sache, die mir aufgefallen ist, ist, dass der Taskplaner mit einer Priorität unter Normal ausgeführt wird. Wenn meine Task gestartet wird, erbt sie dieselbe niedrigere Priorität. Ich habe das Skript jedoch aktualisiert, um die Priorität des Powershell-Prozesses auf Normal zurückzusetzen, und es dauert immer noch genauso lange.

Hat jemand eine Idee, was zwischen den beiden Szenarien unterschiedlich sein könnte? Ich habe Unterschiede in der Prozessor- und E / A-Auslastung ausgeschlossen - nur für diese Aufgabe wird das System verwendet, sodass nichts anderes ausgeführt wird, das um Ressourcen konkurrieren könnte.

Charlie
quelle
Irgendwelche Updates? Ich bin sehr gespannt, was Sie finden können.
mfinni
Ich habe herausgefunden, was meiner Meinung nach die Ursache ist. Siehe meine Antwort unten.
Charlie
Ab Windows 10 Fall Creators besteht dieses Problem weiterhin und die Problemumgehung von @Jason Mathison (Bearbeiten der Taskplaner-XML-Datei) ist immer noch die beste Lösung.
BSalita

Antworten:

36

Hier scheint es mehr als nur "normale" Prozesspriorität zu geben. Wie ich in der Frage festgestellt habe, führt der Aufgabenplaner Ihre Aufgabe standardmäßig mit einer niedrigeren Priorität als der normalen aus. In dieser Frage zu StackOverflow wird beschrieben, wie Sie einen Task so korrigieren , dass er mit der Priorität "Normal" ausgeführt wird. Bei der Korrektur bleibt jedoch eines etwas anders: die Speicherpriorität. Die Speicherpriorität war eine neue Funktion für Windows Vista und wird in diesem Technet-Artikel beschrieben . Sie können die Speicherpriorität mit Process Explorer anzeigen , ein unverzichtbares Tool für jeden Administrator oder Programmierer.

Trotzdem ist die Speicherpriorität Ihrer Aufgabe auf 4 festgelegt, was eine Stufe unter der normalen Einstellung von 5 liegt. Als ich die Speicherpriorität meiner Aufgabe manuell auf 5 erhöhte, war die Leistung eingeschaltet Par mit dem interaktiven Ausführen des Prozesses.

Informationen zum Erhöhen der Priorität finden Sie in meiner Antwort auf eine verwandte StackOverflow-Frage zur E / A-Priorität. Das Festlegen der Speicherpriorität erfolgt in ähnlicher Weise über NtSetInformationProcess mit PROCESS_INFORMATION_CLASSset to ProcessMemoryPriority(der Wert hierfür ist 39 oder 0x27). Ich könnte ein kostenloses Dienstprogramm erstellen, mit dem dies eingestellt werden kann, wenn andere es benötigen und keinen Zugriff auf Programmierwerkzeuge haben.

BEARBEITEN: Ich habe ein kostenloses Dienstprogramm zum Abfragen und Festlegen der Speicherpriorität einer Aufgabe geschrieben, das hier verfügbar ist . Der Download enthält sowohl Quellcode als auch eine kompilierte Binärdatei.

Charlie
quelle
Sie können die Speicherpriorität in Process Explorer anzeigen, indem Sie auf den Namen der ausführbaren Datei
Moshe
17

Das Problem ist, dass Ihr Prozess mit einer niedrigen E / A-Priorität und einer niedrigen Speicherpriorität beginnt. Dies lässt sich am einfachsten mit dem Prozess-Explorer von sysinternals überprüfen. Wenn Sie sich die Eigenschaften eines der Prozesse ansehen, die aus dieser geplanten Aufgabe hervorgegangen sind, werden Sie feststellen, dass die E / A-Priorität niedrig und die Speicherpriorität 2 ist.

Hier ist die Lösung für dieses Problem:

  1. Erstellen Sie die Aufgabe
  2. Klicken Sie mit der rechten Maustaste auf die Aufgabe und "exportieren" Sie sie
  3. Bearbeiten Sie die soeben exportierte Datei task.xml
  4. Sie finden eine ähnliche Zeile wie <Priority>7</Priority>
  5. Ändern Sie den Wert auf eine normale Priorität (zwischen 4 und 6). Eine Tabelle der möglichen Werte: TaskSettings.Priority-Eigenschaft
    • Ein Wert von 4 hat die gleiche E / A- und Speicherpriorität wie ein interaktiver Prozess. Die Werte 5 und 6 haben eine niedrigere Speicherpriorität
  6. Löschen Sie im Aufgabenplaner die Aufgabe, die Sie ursprünglich erstellt haben
  7. Importieren Sie im Aufgabenplaner im Aktionsbereich die Aufgabe aus der XML-Datei

Leider gibt es keine Möglichkeit, die anfängliche Priorität geplanter Aufgaben über die GUI zu ändern.

Jason Mathison
quelle
Danke für den Vorschlag. Die reguläre Prozesspriorität und die E / A-Priorität sind definitiv Teil davon, und der andere Teil ist die Speicherpriorität. Weitere Informationen finden Sie in der akzeptierten Antwort.
Charlie
Nach dem Exportieren der Aufgabe in eine XML-Datei müssen Sie möglicherweise die Zeichencodierung von Unicode in ANSI ändern. Unter Windows Server 2008 R2 ist der Export eine Unicode-Datei. Wenn Sie versuchen, sie wieder zu importieren, wird die Fehlermeldung angezeigt The format of the task is not valid. The following error was reported: (1,2)::. Wenn Sie die Datei in ANSI speichern, lösen Sie sie für mich auf.
Erik Anderson
Vielen Dank, das ist wirklich die beste Lösung. Wie in den Dokumenten erwähnt, können Sie die Priorität auch noch höher einstellen (mindestens bis zu 1), um eine höhere CPU-Priorität zu erhalten.
Rune Aamodt,
Für alle, die glauben, Sie könnten dies in der Registrierung ändern, stören Sie sich nicht, es scheint nicht auf eine gut bearbeitbare Weise vorhanden zu sein.
Nik
1

Wenn Sie festlegen, dass es als geplante Aufgabe als Benutzer X ausgeführt wird, und sich dann als Benutzer X anmelden, bevor es ausgeführt werden soll, sollte es ein Fenster in Ihrer Sitzung öffnen, wenn es ausgeführt wird. Es wird in Ihrer Sitzung ausgeführt.

Wenn Sie dies tun, dauert es länger oder kürzer? Ich weiß nicht, was dies bedeuten wird, aber es kann ein nützliches Unterscheidungsmerkmal sein. Konnte es einen Netzwerkzugriff geben, über den das Benutzerkonto verfügt, wenn es angemeldet ist, aber nicht, wenn es als geplante Aufgabe ausgeführt wird, der eine Zeitüberschreitung verursachen und fehlschlagen muss? Ist das Verhalten anders, wenn Sie ein neues Benutzerkonto erstellen und es als geplante Aufgabe unter diesem Konto ausführen lassen?

Eine andere Idee: Wenn Sie es als geplante Aufgabe ausführen - werden die Unterprozesse jetzt, da Sie die Priorität für Ihr Skript festgelegt haben, alle als normal oder unter normal ausgeführt?

mfinni
quelle
1
Die Unterprozesse werden definitiv als normal ausgeführt, wie von procexp / taskman überprüft. Ich denke, das Netzwerk-Ding ist es nicht, weil es keinen substantiellen Netzwerkzugriff macht, aber ich werde das noch einmal überprüfen. Die Idee, die Aufgabe als interaktiv auszuführen, ist ebenfalls interessant. Ich werde es versuchen.
Charlie
Der Prozess selbst muss keinen Netzwerkzugriff ausführen, von dem Sie wissen, dass er ein Problem darstellt. Lesen Sie diesen Beitrag von Sysinternals und sehen Sie, wie etwas, das scheinbar nichts damit zu tun hat, zu Hängen / Langsamkeit führen kann. blogs.technet.com/b/markrussinovich/archive/2005/08/28/…
mfinni
1

Möglicherweise werden geplante Aufgaben standardmäßig mit einer niedrigeren Priorität ausgeführt.

Verwenden Sie prio, um eine höhere Priorität zu erzwingen.

mcandre
quelle
Sie haben Recht, dass sie mit niedrigerer Priorität ausgeführt werden, aber wie ich bereits erwähnt habe, habe ich das bereits berücksichtigt. Es sei denn, es gibt eine andere Priorität als die Prozesspriorität, über die ich nichts weiß.
Charlie
0

Zuerst - Sie können mehr als die normale Priorität verwenden (z. B. Hoch).

Zweitens: Sie müssen verstehen, dass eine Vordergrundsitzung einige Ressourcen beansprucht, hauptsächlich Festplatten-E / A und Arbeitsspeicher, sodass geplante Aufgaben weniger werden. Für einen klaren Benchmark müssen Sie sich abmelden, während das Powershell-Skript ausgeführt wird

Sie können auch versuchen, mehr Arbeitsspeicher hinzuzufügen, RAM-Laufwerk zu verwenden oder die Arbeit auf mehrere Festplatten aufzuteilen, um Prozesse zu beschleunigen

evg345
quelle
Danke für die Ideen. Der Computer verfügt über ausreichend Arbeitsspeicher und E / A-Kapazität. Das Problem ist lediglich, dass die Ausführung von geplanten Aufgaben langsamer ist als die interaktive Ausführung. Wenn die geplante Aufgabe ausgeführt wird, gibt es normalerweise keine interaktive Anmeldesitzung, daher denke ich, dass dies auch nicht das Problem ist.
Charlie
0

Diese Frage ist von vor einiger Zeit und für Windows Server 2008R2. Ich hatte die gleiche Frage, aber für Windows 10. Unter Windows 10 (überprüft auf 1703 und 1809) reicht es aus, die "Priorität" über importiertes XML auf 4 zu setzen, um Ihnen die gleiche Basispriorität, dynamische Priorität und E / A-Priorität zu geben und Speicherpriorität als interaktiv gestarteter Prozess.

aggieNick02
quelle
0

Hier ist ein Powershell-Snippet zum Festlegen der Priorität (funktioniert in einer Remote-Powershell-Sitzung!):

$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"
Hank Killinger
quelle