Correction de la charge initiale lente pour IIS

IIS dispose d’une fonctionnalité agaçante pour les sites Web à faible trafic, où il recycle les processus de travail inutilisés, ce qui entraîne un délai extrêmement long pour le premier utilisateur (30 secondes).

J’ai cherché une solution au problème et j’ai trouvé ces solutions potentielles.

A. Utilisez le plugin Application Initialization

B. Utiliser le démarrage automatique avec .NET 4

C. Désactiver le délai d’inactivité (sous Réinitialisation IIS)

D. Précomstackr le site

Je me demande laquelle de ces options est préférée et, plus important encore, pourquoi y a-t-il autant de solutions au même problème? (Je suppose qu’ils ne sont pas, et je ne comprends pas quelque chose correctement).

modifier

Effectuer C semble être suffisant pour maintenir mon site au chaud, mais j’ai découvert que la véritable racine de la lenteur de mon site est liée à Entity Framework, dont je n’arrive pas à comprendre pourquoi il fait froid. Voir cette question, qui n’a malheureusement pas encore reçu de réponse a été répondu!

J’ai finalement dû faire un script de mise en route pour bash mon site de temps en temps pour m’assurer qu’il restait rapide.

Les options A, B et D semblent être dans la même catégorie, car elles n’influencent que l’heure de début, elles échauffent le site comme la compilation et le chargement des bibliothèques en mémoire.

L’utilisation de C, définissant le délai d’inactivité, devrait être suffisante pour que les requêtes ultérieures au serveur soient traitées rapidement (le redémarrage du pool d’applications prend un certain temps, de l’ordre de quelques secondes).

Autant que je sache, le délai existe pour économiser de la mémoire que d’autres sites Web exécutés en parallèle sur cette machine pourraient avoir besoin. Le prix étant ce temps de chargement lent une fois.

Outre le fait que le pool d’applications est arrêté en cas d’inactivité de l’utilisateur, le pool d’applications sera également recyclé par défaut toutes les 1740 minutes (29 heures).

De technet:

Les pools d’applications IIS (Internet Information Services) peuvent être périodiquement recyclés pour éviter les états instables pouvant entraîner des pannes, des blocages ou des memory leaks.

Tant que le recyclage de la piscine d’applications est activé, cela devrait suffire. Mais si vous voulez vraiment des performances de premier ordre pour la plupart des composants, vous devriez également utiliser quelque chose comme le module d’initialisation de l’application que vous avez mentionné.

Défi d’hébergement Web

Vous devez vous rappeler qu’aucune des options de configuration de la machine n’est disponible si vous êtes hébergé sur un serveur partagé, comme beaucoup d’entre nous (petites entresockets et particuliers).

ASP.NET MVC Overhead

Mon site prend au moins 30 secondes lorsqu’il n’a pas été touché depuis plus de 20 minutes (et que l’application Web a été arrêtée). C’est terrible.

Une autre façon de tester les performances

Il y a une autre façon de tester s’il s’agit de votre démarrage ASP.NET MVC ou autre chose. Déposez une page HTML normale sur votre site où vous pouvez la toucher directement.
Si le problème est lié au démarrage d’ASP.NET MVC, la page HTML sera rendue presque immédiatement, même lorsque l’application Web n’a pas été démarrée.
C’est la première fois que j’ai reconnu que le problème était au démarrage d’ASP.NET MVC. J’ai chargé une page HTML à tout moment et cela se chargerait rapidement. Puis, après avoir atteint cette page HTML, j’ai atteint l’une de mes URL ASP.NET MVC et j’ai reçu le message Chrome “En attente de raddev.us …”

Un autre test avec un script utile

Après cela, j’ai écrit un script LINQPad (consultez http://linqpad.net pour plus) qui allait bash mon site Web toutes les 8 minutes (moins que le temps nécessaire à l’application pour décharger – ce qui devrait être 20 minutes) et j’ai laissé ça dure des heures.

Pendant que le script était en cours d’exécution, je me suis rendu sur mon site Web et chaque fois que mon site était extrêmement rapide. Cela me donne une bonne idée du fait que la lenteur que je ressentais était probablement due aux temps de démarrage d’ASP.NET MVC.

Obtenez LinqPad et vous pouvez exécuter le script suivant – changez simplement l’URL pour vous-même et laissez-le s’exécuter et vous pourrez le tester facilement. Bonne chance.

REMARQUE : Dans LinqPad, vous devrez appuyer sur F4 et append une référence à System.Net pour append la bibliothèque qui récupérera votre page.

AUSSI : assurez-vous de modifier la variable URL de la chaîne pour qu’elle pointe sur une URL qui chargera une route à partir de votre site ASP.NET MVC pour que le moteur s’exécute.

System.Timers.Timer webKeepAlive = new System.Timers.Timer(); Int64 counter = 0; void Main() { webKeepAlive.Interval = 5000; webKeepAlive.Elapsed += WebKeepAlive_Elapsed; webKeepAlive.Start(); } private void WebKeepAlive_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { webKeepAlive.Stop(); try { // ONLY the first time it resortingeves the content it will print the ssortingng Ssortingng finalHtml = GetWebContent(); if (counter < 1) { Console.WriteLine(finalHtml); } counter++; } finally { webKeepAlive.Interval = 480000; // every 8 minutes webKeepAlive.Start(); } } public String GetWebContent() { try { String URL = "http://YOURURL.COM"; WebRequest request = WebRequest.Create(URL); WebResponse response = request.GetResponse(); Stream data = response.GetResponseStream(); string html = String.Empty; using (StreamReader sr = new StreamReader(data)) { html = sr.ReadToEnd(); } Console.WriteLine (String.Format("{0} : success",DateTime.Now)); return html; } catch (Exception ex) { Console.WriteLine (String.Format("{0} -- GetWebContent() : {1}",DateTime.Now,ex.Message)); return "fail"; } } 

Ecrire un service / script ping pour bash votre site Web inactif est plutôt la meilleure solution, car vous aurez un contrôle complet. D’autres options que vous avez mentionnées seraient disponibles si vous avez loué un hébergement dédié.

Dans un espace d’hébergement partagé, les scripts d’échauffement sont le meilleur moyen de défense de premier niveau (l’auto-assistance est la meilleure aide). Voici un article qui partage une idée sur la façon de le faire depuis votre propre application Web .

J’utiliserais B parce que, en conjonction avec le recyclage des processus de travail, il n’y aurait qu’un retard dans le recyclage. Cela évite le délai normalement associé à l’initialisation en réponse à la première demande après l’inactivité. Vous pouvez également conserver les avantages du recyclage.

Une bonne option pour exécuter une commande ping sur le site consiste à utiliser Microsoft Flow, qui est gratuit pour un maximum de 750 «exécutions» par mois. Il est très facile de créer un stream qui frappe votre site toutes les heures pour le garder au chaud. Vous pouvez même contourner la limite de 750 en créant un stream unique avec des retards séparant plusieurs access de votre site.

https://flow.microsoft.com

Consultez cet article pour obtenir des conseils sur la manière de résoudre les problèmes de performances. Cela inclut à la fois les problèmes de performance liés au démarrage, dans la section “démarrage à froid”. La plupart de ces éléments importeront peu importe le type de serveur que vous utilisez, localement ou en production.

http://blogs.msdn.com/b/mcsuksoldev/archive/2011/01/19/common-performance-issues-on-asp-net-web-sites.aspx

Si l’application désérialise quelque chose de XML (et qui inclut les services Web…), assurez-vous que SGEN est exécuté sur tous les fichiers binarys impliqués dans la désérialisation et placez les DLL résultantes dans le GAC (Global Assembly Cache). Cela précomstack tous les objects de sérialisation utilisés par les assemblys sur lesquels SGEN a été exécuté et les met en cache dans la DLL résultante. Cela peut vous permettre de gagner énormément de temps lors de la première désérialisation (chargement) des fichiers de configuration à partir du disque et des appels initiaux aux services Web. http://msdn.microsoft.com/en-us/library/bk3w6240(VS.80).aspx

Si des serveurs IIS n’ont pas d’access sortant à Internet, désactivez la liste de révocation de certificates (CRL) en recherchant les fichiers binarys Authenticode en ajoutant generatePublisherEvidence = “false” dans machine.config. Sinon, tous les processus de travail peuvent se bloquer pendant plus de 20 secondes pendant le démarrage, alors qu’ils tentent de se connecter à Internet pour obtenir une liste de liste de révocation de certificates. http://blogs.msdn.com/amolravande/archive/2008/07/20/startup-performance-disable-the-generatepublisherevidence-property.aspx

http://msdn.microsoft.com/en-us/library/bb629393.aspx

Envisagez d’utiliser NGEN sur tous les assemblages. Cependant, sans une utilisation soigneuse, cela ne donne pas beaucoup de gain de performance. En effet, les adresses de chargement de base de tous les fichiers binarys chargés par chaque processus doivent être soigneusement définies au moment de la génération pour ne pas se chevaucher. Si les binarys doivent être rebasés lorsqu’ils sont chargés en raison de conflits d’adresses, la quasi-totalité des gains de performances liés à l’utilisation de NGEN seront perdus. http://msdn.microsoft.com/en-us/magazine/cc163610.aspx