2010-03-01 5 views
10

Ich habe eine ASP.NET-Webanwendung, die auf dem Backend mit einem ASMX-Webdienst kommuniziert. Wir haben gezählt und die durchschnittliche Wartezeit für die erste Anfrage ist 20s. Ich frage mich, ob es eine Möglichkeit gibt, den Web-Service vorkompiliert an den Server zu schicken und damit die Notwendigkeit einer Kompilierung zu negieren.Wie verhindere ich, dass IIS Websites kompiliert?

Wir haben auch festgestellt, dass IIS seine Worker-Threads zu recyceln neigt und dies auch eine Kompilierung verursacht. Auf den Prozess selbst wird nicht oft zugegriffen, aber er muss viel schneller sein.

Irgendwelche Gedanken?

Vielen Dank im Voraus

Update: Dank an alle Vorschläge, habe ich eine Reihe von ihnen versucht, und hier ist das, was ich gefunden habe. Recycle Time Shutdown/Tinkering ist gefährlich, weil ich nicht möchte, dass Threads einfach rumsitzen und nichts tun. Bei näherer Betrachtung wird die Seite vorkompiliert, weshalb meine Frage ist, warum gibt es eine erste Anlaufzeit für einen Webservice?

Gerade jetzt: Lehnen in Richtung der Warm-up-Skript Vorschlag unter

Update: Der Dienst auf einer anderen Maschine von einem Webserver getroffen wird. Wir sehen nur Probleme mit der ersten Anfrage.

+0

Wenn wir es auf den Punkt kommen könnten, wo keine Kompilierung notwendig, immer neben war, bevor ich bewege Dinge zum virtuellen Verzeichnis, ich denke, das wäre optimal. Ist das überhaupt möglich? – xximjasonxx

+0

Wenn Sie vorkompilieren, ist Ihr Problem nicht IIS-Kompilierung. Startup-Zeit für Web-App ist eine Sache und Compilation ist eine andere. – Vnuk

Antwort

7

Ein alternativer Ansatz ist ein „Warm-up-Skript“ zu schreiben, die einfach ausführt eine Seite von deiner App Dadurch wird der Server für Sie hochgefahren und die nächste Person erhält einen schnellen Treffer. Sie können auch einen geplanten Prozess festlegen, um dieses Skript gelegentlich auszuführen (wenn Sie beispielsweise planen, dass der Threadpool um 4:00 Uhr recycelt wird, sollten Sie das Aufwärmskript auf 4:01 Uhr terminieren).

+3

Ich habe die kostenlose [tagBeep uptime monitoring] (http://tagbeep.com) für mehrere meiner Webseiten konfiguriert. Dies hat den Nebeneffekt, dass das Aufwärmen automatisch generiert wird, da es meine Websites regelmäßig alle 5 Minuten auf Verfügbarkeit prüft. –

1

Versuchen Sie die Anwendungsrezyklierung in der Konfiguration der Seite oder des Anwendungspools im IIS zu deaktivieren.

IIS 6 (wenn ich mich richtig erinnere): Rechtsklick auf AppPool -> Tab "Performance" -> Deaktivieren Sie die Option "Shut down Arbeitsprozess auf Leerlaufzeit"

IIS 7.5 Es Eigenschaft ist (scheint Auch eine appPool-Einstellung ist), die den AppPool nach X Minuten Leerlaufzeit herunterfährt. Der Wert 0 ist gleich "nie heruntergefahren"

this helps

+0

Danke dafür, ich war in diesem Bereich, aber ich habe Recycle Timeout super lang gemacht. Es schien nicht wie eine gute Idee, denn ich denke, ich möchte die Threads zu recyceln, so dass IIS nicht aus Threads läuft. Versuchen Sie dies, lassen Sie sehen, ob es funktioniert – xximjasonxx

+0

Hat unser Test heute Morgen und Startup seine längste noch, 35s zu reagieren. Also nicht gut, danke für den Vorschlag, obwohl – xximjasonxx

+0

ersten Start nach der Bereitstellung oder ersten Start nach einer Zeit der Nichtbenutzung? – citronas

2

Haben Sie versucht aspnet_compiler im Rahmen Ordner (z% SYSTEMROOT% \ Microsoft.NET \ Framework \ v2.0.50727) verwendet?

Sie können das ASP.NET-Recycling über die Einstellungen im Anwendungspool steuern. Wenn es öfter als die Einstellungen recycelt wird, verursacht das (zB Änderungen an der web.config usw.)

+0

Was kann ich in der web.config suchen, die dazu beitragen könnte das Problem? – xximjasonxx

+0

Änderungen an der Datei web.config führen dazu, dass ASP.NET den App-Pool wiederverwendet. Also, wenn es Code gibt, der die Datei web.config ändert, würde es das definitiv tun. Der erste Ort, um zu sehen, ist jedoch die Anwendung Pool-Recycling-Einstellungen. Wenn diese alle deaktiviert sind und die App recycelt wird, erzwingt etwas anderes ein Zurücksetzen des Anwendungspools (oder IIS selbst). – Thomas

+0

Richtig, aber ich mache mir Sorgen, wenn ich den Thread-Recycle zu hoch setze, könnten mir die Threads ausgehen. Gedanken zu diesem Punkt? – xximjasonxx

1

An einer früheren Position hatten wir ähnliche Probleme mit WCF-Diensten, als wir beim ersten Spooling dies umgangen haben ein einfaches Programm, das nach einer Bereitstellung alle unsere Webdienste aufrufen würde.

Sie könnten auch diese gleiche Art von Programm als lebendig Service halten verwenden und nur die Dienste alle 5-10 Minuten ping usw.

+0

Dies ist etwas, das vorgeschlagen wurde, aber es ist ein Bandaid IMO. Was nicht heißen soll, dass ich es nicht benutzen werde, ich möchte einfach andere Dinge ausprobieren – xximjasonxx

3

Sie sollten nachsehen Führen Sie eine Vorkompilierung als Teil Ihrer Build/Deploy-Skripts durch.

Eine Post-Deployment-Aktivität zum programmatischen Anfordern jeder Webressource und zum Auslösen der Kompliation scheint mir ziemlich dumm zu sein.

Thomas Antwort gibt den Compiler, es gibt auch eine Anleitung über die MSDN, How to: Precompile ASP.NET Web Sites. Wenn Sie MSBuild verwenden, gehen Sie für die AspNetCompiler Task.

(ich wahrscheinlich hätte dies eine Bemerkung gemacht, aber ich bin noch nicht erlaubt ... nicht genug SO Saft)

+0

Das scheint nach dem zu sein, wonach ich gesucht habe. Versuchen Sie es einmal, danke – xximjasonxx

+1

Wird dies auch Auswirkungen auf die Web-Services haben?Ich benutze dies bereits in meinen Bereitstellungen mit Web Deployment-Projekten, aber unabhängig davon, dass es vorkompiliert wird, gibt es immer noch eine erste Ladezeit für die erste Anfrage, die immer noch die erste Anfrage nach der Bereitstellung macht. Sie ist kürzer als nicht Dies. –

+0

Also anscheinend ist meine Seite schon vorkompiliert, was gibt dann? Warum braucht dieses Ding 35s, um beim ersten Treffer zurück zu kommen? – xximjasonxx