Hallo,
es ist ja allgemein bekannt, dass sich der WP vom ASP.Net nach einer bestimmten Zeit oder wenn die Speicherbelegung zu sehr zunimmt recycelt.
Ich bin gerade auf der Suche nach Möglichkeiten den WP "kontrolliert" zu recyceln, wenn z.B. kein Benutzer mehr online ist, bzw. nach von mir definierten Kriterien.
Kennt jemand Möglichkeiten den Pool vom Programm selber zu recyceln? Ich habe bisher nur die Möglichkeit über WMI gefunden. Das wird aber nur von einem anderen Tool funktionieren, da der ASP.Net User mit Sicherheit keine Rechte besitzt WMI Funktionen aufzurufen.
Eine andere Idee wäre noch den Process zu killen(Process.GetCurrentProcess().Kill()). Bin mir aber nicht sicher, ob das eine gute Idee ist. Was meint ihr? Jemand schon das gleiche Problem gehabt?
Hi,
mir fällt im Moment kein Grund ein, wieso sich Deine Anwendung darum kümmern sollte.
Warum soll sie denn das tun?
Aber.. mir fällt auch keine Variante ein, ohne dass Du dafür erweiterte Rechte benötigst.
Gruß
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Der Grund liegt einfach darin, dass ich verhindern will das den Benutzern die Session gekillt wird. Benutze InProc-Session State, weil das um einiges schneller ist als das Serialisieren der SessionInfos auf dem SQL-Server oder sonst wo.
MfG
Sascha
Da wäre wiederum die Frage, welche Daten Du in die Session legst, damit der Speicher so wachsen kann.
Ich komm selten über 1,5 GB Speicher bei teilweise >1000 Requests/s - und das interessiert den Worker Process noch lange nicht.
Fühlt sich nach einem ziemlich "dreckigen" Workaround an, den Du da vor hast - aber eine Lösung ohne entsprechende Rechte sehe ich wie gesagt nicht. Ist schließlich ein administrativer Vorgang.
Alternative zu InProc und SQL Sessions wäre der StateServer. Ist ein Dienst der mit dem IIS6 hinzu kam.
Zudem gibts noch die "healthMonitoring"-Section in der web.config - aber ich weiß gerade nicht, ob da was passendes dabei wäre.
Interessant wäre hier auch, ob Du WebForms oder MVC nutzt.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Mein Speicher wächst nicht so. Hatte nur die Gründe für ein Recycling aufgeführt 😃
Soviel Request haben wir nicht. Die Anzahl ist auch nicht das Problem. Relevant ist die Anzahl der Zugriffe auf die Daten die in der Session gespeichert sind und der damit verbundene Overhead von Serialisierung und Deserialisierung bei != InProc. Ok, bei dem StateServer fällt das Speichern auf Platte weg, aber das Übertragen über Prozessgrenzen ist auch sehr auswendig.
Benutzen tuen wir webforms. Ich gebe zu das ein wenig schmutzig ist, aber ich hätte gerne mehr Kontrolle darüber.
Du musst wissen was Du willst; bzw in diesem Fall, was Dir wichtiger ist.
Du kannst Dich nicht ohne Schirm in den Regen stellen und nicht nass werden wollen.
* Sind es unwichtige Session-Daten, die unter den Tisch fallen dürfen: InProc
* Sind es Session-Daten, die ein Recycling überleben sollen / müssen: SQL Server / StateServer
* Sind es Session-Daten, die auch noch skalierbar sein sollen: SQL Server / StateServer
In jeder Deiner Antworten sehen ich einen weiteren Punkt für meine Kritik 8) ((Nicht bös gemeint!)
Du redest von der (De-)Serialisierung. Man sollte absolut keine Daten oder Objekte, die für eine Laufzeit entscheidend sind (zB SQL Verbindungen) in die Session legen. Gründe:
* Multiple Requests des Anwenders möglich - damit Threading-/Sync-Probleme der Session
* Die Zeitspanne zwischen zwei Requests könnten in der Theorie unendlich lange sein
WebForms ist nicht für "hochperformante" Anwendungen geeignet; bzw. nicht dafür fokusiert entwickelt worden. Deswegen wirst Du hier auch nur wenige Hebelpunkte finden können.
Ich weiß nun nicht, von welcher Art von Daten Du redest; aber wenn es Datenbank-Daten sind: niemals in den Cache des Webservers!
Hierfür wäre eben ASP MVC inklusive Entity Framework der richtige Ansatzpunkt, da hier ein integriertes Caching von Daten sehr einfach möglich ist (Custom Cache Provider).
Reden wir von Daten, die zB bei einem Wizard durch den Anwender anfallen, so hat WebForms das Problem, dass diese im ViewState landen - bei MVC werden diese an den Client gesendet und befinden sich in Hidden Form Elements im Source (und beeinflussen dadurch auch den Webserver nicht).
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich danke Dir auf jeden Fall für Deine Antworten, aber ich kann/will mit Dir keine Diskussion über das Design/Infrastruktur der Anwendung führen. Dazu kennst Du die Anwendung nicht und ich kann das auch nicht alles erklären. Würde den Rahmen sprengen, weil an dieser Anwendung schon mehrere Jahre entwickelt wird und die komplette Umgebung sehr komplex ist bzw. viele Abhängigkeiten bestehen..
Ich mache das schon sehr viele Jahre und ich kenne mich sehr gut aus. Kritik ist ok, aber ohne Kenntniss der Zusammenhänge wertlos.
Für mich ging es nur um die Frage den WP kontrolliert zu recyceln. Warum, wieso, InProc, StateServer oder was auch immer ist eine Diskussion die ich nur mit Kollegen führen kann, bzw. schon geführt wurde.
Gruß
Sascha
P.S: Ist auch nicht böse gemeint 😃
Dann weiß ich nicht, was Du für eine Antwort erwartest. Deine Ziele sind einfach Gegenläufig - die Wünsche arbeiten gegeneinander. Dass das Murks is, brauch ich Dir ja allem Anschein nach nich mehr zu sagen 😉
Die simpelste, die Du bekommen kannst: gib der Anwendung administrative Rechte, damit Du per WMI aufräumen kannst - mit allen Gefahren und Risiken.
Die Anwendung selbst hat ansonsten keine Möglichkeit das Recycling auszuführen, weil das die Anwendung überhaupt nicht zu interessieren hat. .NET hat kein Wissen zu irgendwelchen Windows-Spezifischen Applikationen, wie den IIS; deswegen gibt es die WMI Schnittstelle.
Im Standard hast Du nicht mal die Rechte den PerformanceCounter
abzufragen.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo,
Kennt jemand Möglichkeiten den Pool vom Programm selber zu recyceln? Meinst du mit Programm die aktuelle Webanwendung?
Ich denke im System.Web.Hosting-Namespace sollten diese Funktionen vorhanden sein. (ProcessHost)
Habe selbst diese Funktion nie gebraucht.
Hi ben,
ja mit Programm meine ich die aktuelle Webanwendung. Danke für den Tipp, ich schaue mir das mal an.
habe noch diese Seite gefunden:
http://www.west-wind.com/weblog/posts/2006/Oct/08/Recycling-an-ASPNET-Application-from-within