2009-04-30 16 views
1

Ich automatisiere die Verwendung von Powershell-Skripten aus C# mit der PowerShell Async-Pipeline aufrufen und ich merke, dass, wenn ich Skript immer wieder ausführen, mit dem gleichen Runspace, die <scriptname>.vhost.exe Speicherauslastung geht und nach oben und nach oben, und es würde nach ein paar Tagen die Arbeitsspeicher ausgehen.Powershell. C# Messung der Powershell-Host-Speicherauslastung

Gibt es eine Möglichkeit zu messen, wie viel Speicher durch den Runspace beansprucht wurde, oder tatsächlich, dass ist sogar so, wie Sie es messen würden. Ich weiß, dass ich ein spezielles Skript vorbereiten konnte, das WMI anrief und das eine Liste von Prozessen zurückgab, ich konnte nach dem korrekten vhost suchen und dann die spezifische Zeile substring, aber ich denke, dass das nur zum prob hinzufügt.

Ich dachte, vielleicht würde die rapaceconfiguration-Klasse oder die $ host-Variable summat up bieten, aber ich kann nichts sehen.

Idealerweise würde ich den ihm zugewiesenen Speicher vergrößern wollen, und sobald es diese Größe bekommen würde, würde ich es entsorgen und einen neuen Runspace erstellen, aber das ist teuer. Ist sie weg um den Speicher freizugeben, sagen sie eine Powershell Verfügung.

26.05.2009

Was ich wirklich wissen wollen, ist, wie Speicher verwendet wird, wenn die Ausführung mehrere Scripts über lange Zeiträume die Laufzeitspeicher auswirkt. Im Wesentlichen habe ich eine Ausführungs-Engine, die von Regeln gesteuert wird. Wenn eine Regel ausgelöst wird, wird manchmal ein Skript ausgeführt. Jede Regeldatei (Regelwerk) hat ihren eigenen Powershell-Host. Die Frage ist, ob ich mehrere Scripts ausführe, wie würde diese Speicherwirkung die aktuelle App-Domain sein. Wäre es besser, den Host in einer anderen Anwendungsdomäne zu deponieren, oder richtet er seine Laufzeit außerhalb des aktuellen Standard-C# -Wegs ein. Das Problem ist, dass es einen Mangel an guten Dokumenten gibt. Im Wesentlichen möchte ich sicherstellen, dass es sich nicht um eine Ansammlung von Speichernutzung durch wiederholten Gebrauch handelt. Wenn ich es in eine Remotedomäne feuere, kann ich es zumindest ab einer gewissen Größe ablegen und neu erstellen.

Was ist dein Gedanke?

+0

Ich fragte einige Zeit vorher, ob es einen PowerShell-Profiler gibt. Leider gibt es keine. Vielleicht könnten Sie Benutzer Standard-.NET-Profiler und haben auf zugeordnete PSObjects gesehen. (z.B. dotTrace). – stej

+0

Es ist mehr dynamische Nutzung, die ich kontrollieren möchte. Ich möchte kein Summat haben, wenn ich Dutzende von Skripten ausführe und finde, dass die Anwendungsdomäne auf die Größe von himem angewachsen ist. Ich kann System.GC] :: Collect() aufrufen, nach jeder guten Skriptausführung. Aber nach längerem Betrieb kann es immer noch eine Chance geben, dass die Appdomain den gesamten Speicher verbraucht. Ich kann eine Remote-Appdomain erstellen und entfernen, wo der pshell async-Invoker lebt, da es zu teuer ist. Reißen es nach jeder 50 Skript Exe, möglicherweise, wenn ich die Größe von ihm neu. Könnte nur die Größe der Appdomain selbst sein. Müssen Sie es überprüfen. Vielen Dank. –

Antwort

0

Ich denke, Sie müssen ein Code-Snippet von genau wie Sie die PowerScript-Objekte dazu verwenden, um dies zu tun.

Außerdem ist VSHost nur der Host-Prozess, wenn Sie von der IDE aus laufen (Debugging mit anderen Worten) Haben Sie die gleiche Situation, wenn Sie die App außerhalb der IDE ausführen?

1

Einer der ersten zu überprüfenden Bereiche wäre, dass alle Objekte, die Sie in diesem Runspace erstellen, dereferenziert werden (keine Variablen, die auf sie zeigen), so dass sie als Garbage Collected betrachtet werden können. Ein ähnliches Problem kann in der PowerShell-Konsole auftreten und I blogged about that problem here.