Schnelles Überprüfen oder Einschränken der Threadspeicherbelegung in .NET?

9

Ich habe einige Diskussionen gesehen, die dieser Frage ähnlich sind, aber nichts, was wirklich das Problem beantwortet, vor dem ich stehe.

Ich arbeite an einer C # -Anwendung, bei der das Softwareverhalten durch interpretierte Skripte angepasst werden kann. Jedes Skript wird in einem anderen untergeordneten Thread der C # -App ausgeführt. (Ich benutze den Javascript-Interpreter von Jint, um die Skripte auszuführen, aber meine Frage gilt gleichermaßen für alle anderen Umstände, unter denen sich ein Thread in einer .NET-Anwendung dynamisch verhalten könnte). Bis jetzt funktioniert das großartig. Aber ich muss sicherstellen, dass sich die Anwendung selbst verhält. Im Falle eines ungültigen Skripts, das dazu führen kann, dass die Anwendung keinen Heapspeicher mehr hat, muss ich jeden Thread erkennen und stoppen können, der zu viel Speicher verbraucht. Konzeptionell könnte dies einem Webbrowser ähneln, der feststellt, ob Javascript auf einer Seite zu lange oder zu viel Arbeitsspeicher benötigt, um ausgeführt zu werden. Das Problem ist, ich konnte nicht feststellen, ob es eine Möglichkeit gibt, dies in .NET zu tun.

Gibt es eine Möglichkeit, die Speichermenge, die ein Thread verwenden kann, stark zu begrenzen oder schnell die Speicherauslastung des Threads anhand eines übergeordneten Threads zu überprüfen? Ich bin nicht mit Stack-Überlauf innerhalb des Threads betroffen, nur Heap-Speicherplatz.

Die "naheliegende" Lösung wäre natürlich, das Interpretieren in separate Prozesse anstatt in separate Threads aufzuteilen, aber das würde für meine Anwendung einen erheblichen Leistungseinbruch bedeuten, da diese Skripte das Softwareverhalten verändern und daher eng gekoppelt sein sollen . Die Überwachung auf Anwendungsebene wäre ebenfalls nicht ideal, da sie keine Informationen darüber liefern würde, welches Skript sich nicht selbst verhält. Außerdem wird eine langsame Methode zum Debuggen nicht funktionieren, da die Skripts eine schnelle Änderung der Software ermöglichen sollen, anstatt sie zu erstellen, zu testen und erneut zu implementieren. Ich brauche nur einen einigermaßen schnellen Weg, um einen Thread zu finden, der zu viel Speicher verbraucht, damit ich sein Skript töten und ignorieren kann.

Danke!

    
Jon 26.06.2011, 23:25
quelle

2 Antworten

3

Wie andere Poster vorschlagen, könnte es einfacher sein, in einem separaten Prozess zu hosten. Ein etwas leichterer Ansatz wäre, in einer separaten App-Domain zu hosten und die App-Domain-Ressourcenüberwachung api zur Überwachung der Speichernutzung.

    
dashton 27.06.2011 09:38
quelle
0

WMI ist eine Option für Sie. Ich bin mir sicher, dass Sie die Speichernutzung überwachen können. Aber Sie können diese Idee mehr erforschen.

Hier ist ein kleiner Einstieg in WMI in C # . Es gibt eine ganze Reihe von Klassen, die Sie abfragen können. Und um lokale Maschinenstatistiken abzufragen, wird es nicht sehr teuer werden. Aber ich würde empfehlen, zuerst einige Performance-Nummern zu nehmen.

    
ata 26.06.2011 23:34
quelle

Tags und Links