IIS présente une fonctionnalité gênante pour les sites Web à faible trafic, dans lequel il recycle les processus de travail inutilisés, ce qui a pour conséquence que le premier utilisateur du site accède après un certain temps à un délai extrêmement long (plus de 30 secondes).
Je cherchais une solution au problème et j'ai trouvé ces solutions potentielles.
A. tilisez le plugin Application Initialization
B. tilisez Auto-Start avec .NET 4
C. Désactiver le délai d'inactivité (sous IIS Reset)
Je me demande lequel de ces choix est préféré et, plus important encore, pourquoi existe-t-il tant de solutions au même problème? (Je suppose qu'ils ne le sont pas et que je ne comprends tout simplement pas quelque chose correctement).
Modifier
Effectuer C semble suffire à maintenir mon site en échauffement, mais j'ai découvert que la véritable racine de la lenteur de mon site tient à Entity Framework, que je n'arrive pas à comprendre pourquoi il fait froid. Voir this question, qui malheureusement, on n'a pas encore répondu a été répondu!
J'ai finalement juste dû faire un script de mise en train pour aller sur mon site de temps en temps pour être sûr qu'il reste rapide.
Les options A, B et D semblent appartenir à la même catégorie car elles n’influencent que l’heure de démarrage initiale, elles réchauffent le site Web, comme la compilation et le chargement des bibliothèques en mémoire.
L'utilisation de C pour définir le délai d'inactivité devrait suffire pour que les demandes suivantes adressées 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, il existe un délai d'attente pour économiser de la mémoire dont d'autres sites Web fonctionnant en parallèle sur cette machine pourraient avoir besoin. Le prix étant que le temps de chargement est lent.
Outre le fait que le pool d'applications est arrêté en cas d'inactivité de l'utilisateur, il est également recyclé par défaut toutes les 1740 minutes (29 heures).
De technet:
Les pools d'applications Internet Information Services (IIS) peuvent être périodiquement recyclés pour éviter les états instables pouvant provoquer des pannes, des blocages ou des fuites de mémoire.
Tant que le recyclage de la piscine d'applications reste actif, cela devrait être suffisant. Mais si vous voulez vraiment des performances de premier ordre pour la plupart des composants, vous devez également utiliser quelque chose comme le module d'initialisation d'applications que vous avez mentionné.
Défi de l'hébergement Web
N'oubliez pas qu'aucune des options de configuration de la machine n'est disponible si vous êtes hébergé sur un serveur partagé, contrairement à beaucoup d'entre nous (petites entreprises et particuliers).
Surcharge ASP.NET MVC
Mon site prend au moins 30 secondes lorsqu'il n'a pas été visité 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 existe un autre moyen de vérifier s'il s'agit de votre démarrage ASP.NET MVC ou de quelque chose d'autre. Déposez une page HTML normale sur votre site sur laquelle vous pouvez cliquer directement.
Si le problème est lié au démarrage d'ASP.NET MVC, la page HTML s'affiche presque immédiatement, même lorsque l'application Web n'a pas été démarrée.
C'est ainsi que j'ai d'abord reconnu que le problème venait du démarrage d'ASP.NET MVC. J'ai chargé une page HTML à tout moment et elle se chargerait à toute vitesse. Ensuite, après avoir affiché cette page HTML, j'ai saisi l'une de mes URL ASP.NET MVC et 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 d’informations) qui afficherait mon site Web toutes les 8 minutes (moins que le temps nécessaire au déchargement de l’application - ce qui devrait 20 minutes) et je le laisse fonctionner pendant des heures.
Pendant que le script fonctionnait, je me suis rendu sur mon site Web et chaque fois que mon site a été extrêmement rapide. Cela me donne une bonne idée du fait que la lenteur que j'ai subie était due aux délais de démarrage d'ASP.NET MVC.
Obtenez LinqPad et vous pouvez exécuter le script suivant - changez simplement l'URL et laissez-le fonctionner pour que vous puissiez le tester facilement. Bonne chance.
NOTE: Dans LinqPad, vous devez appuyer sur F4 et ajouter une référence à System. Net pour ajouter la bibliothèque qui récupérera votre page.
AUSSI: assurez-vous de changer la variable String String pour qu'elle pointe vers une URL qui chargera une route à partir de votre site ASP.NET MVC afin que le moteur va courir.
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 retrieves the content it will print the string
String 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";
}
}
Écrire un service/script de ping sur votre site web inactif est plutôt une meilleure façon de faire, car vous aurez un contrôle total. D'autres options que vous avez mentionnées seraient disponibles si vous avez loué une boîte d'hébergement dédiée.
Dans un espace d'hébergement partagé, les scripts de réchauffement constituent la meilleure défense de premier niveau (l'auto-assistance est la meilleure aide). Voici un article qui partage un idée sur la façon de le faire à partir de votre propre application Web .
J'utiliserais B car, associé au recyclage des processus de travail, il n'y aurait qu'un délai d'attente avant le recyclage. Cela évite le délai normalement associé à l'initialisation en réponse à la première demande après une période d'inactivité. Vous bénéficiez également des avantages du recyclage.
Une bonne option pour envoyer une requête ping sur le site selon un calendrier consiste à utiliser Microsoft Flow, qui est gratuit pendant un maximum de 750 "exécutions" par mois. Il est très facile de créer un flux qui frappe votre site toutes les heures pour le garder au chaud. Vous pouvez même contourner leur limite de 750 en créant un flux unique avec des retards séparant plusieurs hits de votre site.
Consultez cet article pour obtenir des conseils sur la manière de résoudre les problèmes de performances. Ceci inclut les deux problèmes de performance liés au démarrage, dans la section "démarrage à froid". La plupart de ces problèmes importeront quel que soit le type de serveur que vous utilisez, localement ou en production.
Si l'application désérialise quelque chose que ce soit à partir de XML (et qui inclut les services Web…), assurez-vous que SGEN est exécuté sur tous les fichiers binaires impliqués dans la désérialisation et placez les DLL résultantes dans le GAC (Global Assembly Cache). Cela précompile tous les objets 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 faire gagner énormément de temps lors de la première désérialisation (chargement) des fichiers de configuration à partir du disque et lors des appels initiaux aux services Web. http://msdn.Microsoft.com/en-us/library/bk3w6240 (VS.80) .aspx
Si l'un des serveurs IIS n'a pas d'accès sortant à Internet, désactivez la vérification de la liste de révocation de certificats pour les fichiers binaires Authenticode en ajoutant generatePublisherEvidence = "false" dans le fichier machine.config. Sinon, tous les processus de travail peuvent être suspendus pendant plus de 20 secondes lors du démarrage, mais le délai de tentative de connexion à Internet est dépassé pour obtenir une liste de liste de révocation de certificats. 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
Pensez à utiliser le NGEN sur tous les assemblages. Cependant, sans une utilisation prudente, cela ne donne pas beaucoup de gain de performance. En effet, les adresses de charge de base de tous les fichiers binaires chargés par chaque processus doivent être soigneusement définies au moment de la construction pour ne pas se chevaucher. Si les fichiers binaires doivent être rebasés lorsqu’ils sont chargés à cause des conflits d’adresses, la quasi-totalité des gains de performances liés à l’utilisation de NGEN sera perdue. http://msdn.Microsoft.com/en-us/magazine/cc163610.aspx
Je recevais un retard constant de 15 secondes sur la première demande après 4 minutes d'inactivité. Mon problème était que mon application utilisait l'authentification intégrée de Windows auprès de SQL Server et que le profil de service se trouvait dans un domaine différent de celui du serveur. Cela a provoqué une authentification interdomaine de IIS à SQL lors de l'initialisation de l'application, ce qui était la véritable source de mon retard. J'ai changé pour utiliser une connexion SQL au lieu de l'authentification Windows. Le retard était immédiatement parti. Tous les paramètres d'initialisation d'applications sont toujours en place pour améliorer les performances, mais ils n'ont peut-être pas été utilisés du tout dans mon cas.