Speicherverlust durch Powershell Remote-Aufrufe in C #

8

Ich habe einen Windows-Dienst, der viele Remote-Fernanrufe durchführt, um einige Serverinformationen zu erhalten. Mir ist aufgefallen, dass der Speicher des Dienstes, solange die Zeit vergeht, wächst, bis eine Speicherausnahme ausgelöst wird. Ich habe gesucht und es sieht so aus, als ob es ein bekanntes Speicherleck in System.Management.Automation gibt, das nicht den gesamten Speicher von Runspace enthält, der beim Aufruf der Methode close und / dispose erstellt wurde. Ich habe einen Beitrag gelesen, in dem vorgeschlagen wurde, CreateOutOfProcessRunspace von RunspaceFactory zu verwenden, aber nicht sicher, wie er verwendet werden soll.

So kann das Problem reproduziert werden: ( System.Management.Automation dll referenziert)

%Vor%

Wenn Sie diesen Code ausführen, sehen Sie, wie der Speicher inkrementiert wird. Aufgrund der Anforderungen ist es eine gute Lösung, eine Verbindung so weit wie möglich offen zu halten.

Weißt du, wie ich dieses Problem beheben kann, sogar mit der CreateOutOfProcessRunspace -Methode von RunspaceFactory oder wie man den Speicher entsorgt?

Vielen Dank im Voraus

BEARBEITEN

Ich benutzte die V3 und ändere die Erstellung des Runspace, um die CreateRunspacePool-Methode zu verwenden, und es sieht so aus, als wäre das Leck verschwunden. Vielen Dank für deine Hilfe!

    
Manuel Quintero 23.04.2014, 03:20
quelle

2 Antworten

4

Ich kann das Problem in PS v3.0 sehen, aber nicht in PS v2.0. Hier ist der Code, den ich verwendet habe Siehe hierzu (alle Beispiele sind in PowerShell):

%Vor%

Es sieht so aus, als ob Handles und Speicher in v3.0 im obigen Code undicht sind.

Soweit v2.0 dieses Problem nicht aufweist, kann eine mögliche Problemumgehung sein Starten Sie den Dienst mit PS v2.0, d. h. PowerShell.exe -Version 2.0 .

Wenn das nicht möglich ist, kann ich mir zwei weitere Problemumgehungen vorstellen. Einer von ihnen ist nicht Um Runspaces direkt zu erstellen, verwenden Sie stattdessen [powershell] . Zum Beispiel, dies Code zeigt das Leck in v3.0 nicht an:

%Vor%

Eine andere Problemumgehung, falls zutreffend, kann die Verwendung von sein %Code%. Dieser Weg zeigt auch nicht die Leck:

%Vor%

Der letzte arbeitet auch viel schneller, weil der runspace irgendwie wiederverwendet wird.

    
Roman Kuzmin 23.04.2014, 04:43
quelle
3

Ich hatte auch das gleiche Problem, als ich v1 von System.Management.Automation verwendete . Aber das Problem wurde mit v3 von System.Management.Automation gelöst und der zu verwendende Code geändert die Methode CreateOutOfProcessRunspace

Hier ist der Code

%Vor%     
Sameer 14.09.2015 10:11
quelle