Frage Der Prozess läuft langsamer als eine geplante Aufgabe als interaktiv


Ich habe eine geplante Aufgabe, die sehr CPU- und IO-intensiv ist, und dauert etwa vier Stunden (Quellcode zu erstellen, wenn Sie neugierig sind). Die Aufgabe ist ein Powershell-Skript, das verschiedene Unterprozesse zur Ausführung bringt. Wenn ich denselben Prozess interaktiv über eine Powershell-Eingabeaufforderung als das gleiche Benutzerkonto ausführe, wird es in ungefähr zweieinhalb Stunden ausgeführt. Die Aufgabe wird unter Windows Server 2008 R2 ausgeführt.

Ich möchte wissen, warum es so viel länger dauert, als eine geplante Aufgabe zu laufen - mehr als eine Stunde länger. Eine Sache, die mir aufgefallen ist, ist, dass der Task-Scheduler mit Below-Normal-Priorität ausgeführt wird. Wenn meine Task gestartet wird, erbt sie also dieselbe herabgesetzte Priorität. Allerdings habe ich das Skript aktualisiert, um die Powershell-Prozesspriorität wieder auf Normal zu setzen, und es dauert immer noch genauso lange.

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


37
2018-06-16 18:05


Ursprung


Irgendwelche Updates? Ich bin sehr neugierig, was du finden kannst. - mfinni
Ich fand, was ich für die Ursache hielt; Siehe meine Antwort unten. - Charlie
Ab Windows 10 Fall Creators ist dieses Problem weiterhin vorhanden und @Jason Mathisons Problemumgehung (Taskplaner-XML-Datei bearbeiten) ist immer noch die beste Lösung. - BSalita


Antworten:


Offenbar gibt es hier mehr als nur "normale" Prozessprioritäten. Wie ich in der Frage angemerkt habe, führt der Taskplaner standardmäßig deine Aufgabe mit einer niedrigeren Priorität als normal aus. Diese Frage zu StackOverflow beschreibt, wie eine Aufgabe mit normaler Priorität repariert werden kann, aber der Fix unterscheidet sich noch ein wenig: Speicherpriorität. Speicherpriorität war eine neue Funktion für Windows Vista und wird in beschrieben Dieser Technet-Artikel. Sie können die Speicherpriorität mit anzeigen Process ExplorerDies ist ein Muss für jeden Administrator oder Programmierer.

Wie auch immer, selbst bei der geplanten Aufgabenprioritätsprüfung ist die Speicherpriorität Ihrer Aufgabe auf 4 gesetzt, 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 parallel zum interaktiven Ausführen des Prozesses.

Informationen zur Erhöhung der Priorität finden Sie unter meine Antwort auf eine verwandte StackOverflow-Frage über IO-Priorität; Die Einstellung der Speicherpriorität erfolgt analog über NtSetInformationProcess mit PROCESS_INFORMATION_CLASS einstellen ProcessMemoryPriority (Der Wert davon ist 39 oder 0x27). Ich könnte ein kostenloses Dienstprogramm erstellen, das verwendet werden kann, um dies festzulegen, wenn andere es benötigen und keinen Zugriff auf Programmiertools haben.

EDIT: Ich habe weitergemacht und ein kostenloses Dienstprogramm für die Abfrage und Einstellung der Speicherpriorität einer Aufgabe geschrieben, hier verfügbar. Der Download enthält Quellcode und eine kompilierte Binärdatei.


32
2018-06-21 01:08



Freut mich, dass du es gefunden hast, danke fürs Teilen. - MadBoy
Sie können die Speicherpriorität im Process Explorer sehen, indem Sie auf den Namen der ausführbaren Datei doppelklicken, die Registerkarte "Leistung" öffnen und unter "Physischer Speicher" einen Eintrag für "Speicherpriorität" eingeben. - Moshe


Das Problem besteht darin, dass Ihr Prozess mit einer niedrigen E / A-Priorität und einer niedrigen Speicherpriorität beginnt. Der einfachste Weg, dies zu überprüfen, ist der Process Explorer von sysinternals. Wenn Sie sich die Eigenschaften eines der Prozesse ansehen, die von dieser geplanten Aufgabe erzeugt wurden, werden Sie feststellen, dass sie eine E / A-Priorität mit niedriger Priorität und eine Speicherpriorität von 2 aufweist.

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 Datei task.xml, die Sie gerade exportiert haben
  4. Sie werden eine ähnliche Linie finden <Priority>7</Priority>
  5. Ändern Sie den Wert in 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 geringere Speicherpriorität
  6. Löschen Sie im Aufgabenplaner die Aufgabe, die Sie ursprünglich erstellt haben
  7. Importieren Sie die Aufgabe im Aufgabenplaner im Aktionsbereich aus der XML-Datei

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


15
2018-04-08 04:37



Danke für den Vorschlag. Regelmäßige Prozesspriorität und IO-Priorität gehören definitiv dazu, und der andere Teil ist Speicherpriorität. Siehe die akzeptierte Antwort für weitere Informationen. - 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, und wenn Sie versuchen, es wieder zu importieren, wird die Fehlermeldung angezeigt The format of the task is not valid. The following error was reported: (1,2):: ist gegeben. Speichern Sie die Datei in ANSI lösen Sie es für mich. - Erik Anderson
Vielen Dank, das ist wirklich die beste Lösung. Wie in der Dokumentation erwähnt, können Sie die Priorität auch höher einstellen (mindestens bis zu 1), um eine höhere CPU-Priorität zu erhalten. - Rune Aamodt
Für alle, die denken, dass Sie in der Lage sein könnten, dies in der Registry zu ändern, nicht stören, scheint nicht auf eine gut bearbeitbare Weise da zu sein. - Nik


Wenn Sie es so einrichten, dass es als geplante Aufgabe als Benutzer X ausgeführt wird und sich dann als Benutzer X anmeldet, 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 das bedeutet, aber es kann ein nützliches Unterscheidungsmerkmal sein. Könnte es einen Netzwerkzugriff geben, den das Benutzerkonto hat, wenn es angemeldet ist, aber nicht, wenn es als geplante Aufgabe ausgeführt wird, die Zeitüberschreitung und einen Fehler aufweisen muss? Ist das Verhalten anders, wenn Sie ein neues Benutzerkonto erstellen und es unter diesem Konto als geplante Aufgabe ausführen?

Eine weitere Idee: Wenn Sie es als geplante Aufgabe ausführen - nachdem Sie nun die Priorität für Ihr Skript festgelegt haben, werden die Unterprozesse alle als Normal oder Below-Normal ausgeführt?


1
2018-06-16 18:42



Die Subprozesse werden definitiv als Normal ausgeführt, wie von procexp / taskman verifiziert. Ich denke, die Netzwerk-Sache ist es nicht, weil sie keinen substanziellen Netzwerkzugriff hat, aber ich werde das überprüfen. Die Idee, die Aufgabe als interaktiv zu gestalten, ist auch interessant, ich werde es versuchen. - Charlie
Der Prozess selbst muss keinen Netzwerkzugriff durchführen, von dem Sie wissen, dass dies ein Problem ist. Lesen Sie diesen Beitrag von Sysinternals und sehen Sie, wie etwas, das scheinbar nichts miteinander zu tun hat, Hänge / Langsamkeit verursachen kann. blogs.technet.com/b/markrussinovich/archive/2005/08/28/... - mfinni


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

Benutzen prio eine höhere Priorität erzwingen.


1
2018-06-16 18:11



Sie haben recht, dass sie mit geringerer Priorität laufen, 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, von der ich nichts weiß. - Charlie


zuerst - Sie können mehr als normale Priorität (Hoch zum Beispiel) verwenden

an zweiter Stelle - Sie müssen verstehen, als Vordergrundsitzung einige Ressourcen nimmt, hauptsächlich Festplatten-IO und Speicher, so dass geplante Aufgabe weniger bekommt. Für einen klaren Benchmark müssen Sie sich abmelden, während Sie das Powershell-Skript ausführen

und Sie können auch versuchen, mehr Arbeitsspeicher hinzuzufügen / ramdrive / split Arbeit auf mehreren Festplatten verwenden, um Prozesse zu beschleunigen


0
2018-06-17 13:05



Danke für die Ideen. Die Maschine hat viel Speicher und IO-Kapazität, das Problem ist nur, dass die Dinge langsamer als geplante Tasks als interaktiv laufen. Wenn die geplante Aufgabe ausgeführt wird, gibt es normalerweise keine interaktive Anmeldesitzung, also denke ich, dass das nicht das Problem ist. - Charlie