Der Prozess läuft als geplante Aufgabe langsamer ab als interaktiv

Der Prozess läuft als geplante Aufgabe langsamer ab als interaktiv

Ich habe eine geplante Aufgabe, die sehr CPU- und IO-intensiv ist und deren Ausführung etwa vier Stunden dauert (Erstellen des Quellcodes, falls es Sie interessiert). Die Aufgabe ist ein Powershell-Skript, das verschiedene Unterprozesse startet, um seine Arbeit zu erledigen. Wenn ich denselben Prozess interaktiv von einer Powershell-Eingabeaufforderung aus mit demselben Benutzerkonto ausführe, dauert er etwa zweieinhalb Stunden. Die Aufgabe wird auf 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. Mir ist aufgefallen, dass der Aufgabenplaner mit der Priorität „Unterhalb des Normalen“ ausgeführt wird. Wenn meine Aufgabe also gestartet wird, erhält sie dieselbe niedrigere Priorität. Ich habe das Skript jedoch aktualisiert, um die Priorität des Powershell-Prozesses wieder auf „Normal“ zu setzen, und es dauert immer noch genauso lange.

Hat jemand eine Idee, was zwischen den beiden Szenarien anders sein könnte? Unterschiede in der Prozessor- und IO-Last habe ich ausgeschlossen – diese Aufgabe ist die einzige, für die das System verwendet wird, es läuft also nichts anderes, das um Ressourcen konkurrieren könnte.

Antwort1

Es scheint, dass hier mehr als nur die „normale“ Prozesspriorität eine Rolle spielt. Wie ich in der Frage angemerkt habe, führt der Taskplaner Ihren Task standardmäßig mit einer niedrigeren Priorität als normal aus.Diese Frage auf StackOverflowbeschreibt, wie man jede Aufgabe so einrichtet, dass sie mit der Priorität Normal ausgeführt wird, aber die Korrektur lässt eine Sache etwas anders: die Speicherpriorität. Die Speicherpriorität war eine neue Funktion für Windows Vista und wird indieser Technet-ArtikelSie können die Speicherpriorität sehen mitProcess Explorer, ein unverzichtbares Tool für jeden Administrator oder Programmierer.

Selbst mit der geplanten Aufgabenprioritätskorrektur wird die Speicherpriorität Ihrer Aufgabe jedoch 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 vergleichbar mit der interaktiven Ausführung des Prozesses.

Informationen zur Erhöhung der Priorität finden Sie untermeine Antwort auf eine verwandte StackOverflow-Fragezur IO-Priorität; die Einstellung der Speicherpriorität erfolgt ähnlich ü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, falls andere es benötigen und keinen Zugriff auf Programmiertools haben.

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

Antwort2

Das Problem besteht darin, dass Ihr Prozess mit einer niedrigen E/A-Priorität und einer niedrigen Speicherpriorität startet. Am einfachsten lässt sich dies mit dem Prozess-Explorer von Sysinternals überprüfen. Wenn Sie sich die Eigenschaften eines der Prozesse ansehen, die von dieser geplanten Aufgabe erzeugt wurden, werden Sie feststellen, dass dieser eine niedrige E/A-Priorität und eine Speicherpriorität von 2 hat.

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

  1. Erstellen der Aufgabe
  2. Klicken Sie mit der rechten Maustaste auf die Aufgabe und "exportieren" Sie sie
  3. Bearbeiten Sie die Datei task.xml, die Sie gerade exportiert haben
  4. Sie finden eine Zeile ähnlich der<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. Werte von 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 Bereich Aktionen die Aufgabe aus der XML-Datei

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

Antwort3

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

$taskName = "MyTask" ;`
$currentTask = Get-ScheduledTask -TaskName $taskName ;`
$settings = $currentTask.Settings ;`
$settings.Priority = 4 ;`
Set-ScheduledTask -TaskName $taskName -TaskPath $currentTask.TaskPath -Settings $settings

Antwort4

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

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

verwandte Informationen