Wie halte ich meine ASP.NET App immer "am Leben" und wenn es eine schlechte Idee ist, warum sollte ich das nicht tun?

8

Ich habe vor kurzem eine ASP.NET-Anwendung auf meinem neuen, glänzenden VPS installiert und während ich mit der allgemeinen Leistungssteigerung, die ein VPS über eine Shared-Hosting-Lösung bieten kann, zufrieden bin, bin ich unzufrieden mit der Startzeit meines Anwendung.

Meine Webanwendung benötigt eine gewisse Zeit, um zu starten, wenn mein Kunde sie zum ersten Mal findet. Ich führe es nicht im Debug-Modus (deaktiviert das in meiner web.config), und es hat keine echte Arbeit beim Start zu tun - ich habe keinen Code in meiner Anwendung starten Event-Handler, ich starte keine extra Fäden, nichts. Das erste Mal, dass mein Kunde meine Anwendung anspricht, dauert es gut 15 bis 20 Sekunden, um zu antworten. Nachfolgende Anrufe dauern 1-2 Sekunden, es sei denn, ich warte ein paar Minuten auf das Herunterfahren meiner Anwendung. Dann ist es wieder zu einer Startzeit von 15-20 Sekunden.

(Ich bin mir bewusst, dass mein Timing-Benchmark sehr unwissenschaftlich ist, diese Zahlen sollten nur ein Gefühl für die Leistung beim Start meiner App geben).

Mein Verständnis von ASP.NET war, dass IIS (in diesem Fall 7.0) eine Webanwendung kompiliert, wenn sie zum ersten Mal ausgeführt wird, und dann diese Binärdateien zwischenspeichert, bis die Webanwendung geändert wird. Ist mein Verständnis falsch?

Nach dem Vorwort im Buchformat sind hier also meine Fragen:

  • Ist mein Verständnis der ASP.NET-Kompilierung inkorrekt? Wie funktioniert es wirklich?
  • Gibt es eine Möglichkeit, IIS zu zwingen, meine Binärdateien zwischenzuspeichern oder meine Anwendung auf unbestimmte Zeit am Leben zu erhalten?
  • Wenn es eine schlechte Idee ist, eines der Dinge in meiner vorherigen Frage zu tun, warum ist es eine schlechte Idee, und was kann ich stattdessen tun, um die Startleistung zu erhöhen?

Danke!

Bearbeiten: Es scheint, dass meine Frage ein kleines Duplikat von diese Frage (ich dachte, ich hätte hier besser nach einer Antwort gesucht, haha). Ich denke jedoch, dass meine Frage umfassender ist, und ich würde mich freuen, wenn sie nicht als Duplikat geschlossen würde, es sei denn, es gäbe hier bessere, bereits gestellte Fragen, die sich damit befassen.

    
Rob Ringham 03.05.2009, 18:15
quelle

3 Antworten

3

IIS beendet auch Ihre Webanwendung nach einer bestimmten Zeit, abhängig von ihrer Konfiguration. Ich bin nicht so vertraut mit IIS7 und wo dies zu konfigurieren, also möchten Sie vielleicht ein wenig Nachforschungen darüber, wie dies konfigurieren ( Startpunkt? ).

Ist es schlecht? Hängt davon ab, wie gut dein Code ist. Wenn Sie keinen Speicher oder Ressourcen verlieren, wahrscheinlich nicht.

Die andere Lösung besteht darin, Ihre Website vorkompilieren . Dies könnte die bessere Option für Sie sein. Sie müssen es jedoch überprüfen und sehen, je nachdem, wie Sie mit Ihrer Website interagieren.

    
Will 03.05.2009, 18:46
quelle
2
  

Mein Verständnis von ASP.NET war, dass IIS (in diesem Fall 7.0) eine Webanwendung kompiliert, wenn sie das erste Mal überhaupt ausgeführt wird, und dann diese Binärdateien zwischenspeichert, bis die Webanwendung geändert wird. Ist mein Verständnis falsch?

Das ist richtig. Insbesondere werden die Assemblies als Schattenkopien erstellt (nicht zu verwechseln mit dem Feature für den Snapshot-Dienst / Schattenkopie). Dadurch können Sie den Code im Ordner im laufenden Betrieb ersetzen, ohne bestehende laufende Sitzungen zu beeinträchtigen. ASP.NET erkennt die Änderung und kompiliert neue Versionen in das Zielverzeichnis (normalerweise Temporary ASP.NET Files ). Mehr zu diesem Prozess: Grundlegendes zur dynamischen ASP.NET-Kompilierung

    
Sören Kuklau 03.05.2009 18:32
quelle
1

Wenn es die reine Kompilierungszeit ist, dann ist oft der effizienteste Ansatz, die Website nach dem Recycling selbst zu starten. Machen Sie in regelmäßigen Abständen einen Anruf, um sicherzustellen, dass Sie die Verzögerung von 15 Sekunden erhalten, nicht Ihr Kunde.

Ich würde mich wundern, wenn das alles Kompilierungszeit ist (abhängig von der Hardware) - haben Sie viele statische Instanzen von Klassen? Machen sie viel Arbeit beim Start?

Entweder mit Tracing oder Profiling könnte man ziemlich schnell herausfinden, wo die Startzeit verbracht wurde.

Warum ein Prozess zu halten ist eine schlechte Idee, ich glaube, es ist zu klären. Ganz gleich, wie gut wir uns um unsere Daten kümmern oder wie gut sich der GC verhält, es gibt eine gute Aufarbeitung, indem der Prozess neu gestartet wird. Dinge wie Fragmentierung können verschwinden und alle anderen Ressourcenprobleme, die sich im Laufe der Zeit aufbauen, werden abgebaut. Daher ist es eine ziemlich schlechte Idee, einen Serverprozess unbegrenzt laufen zu lassen.

    
Tollo 03.05.2009 19:02
quelle

Tags und Links