Pourquoi après chaque redémarrage, mes sites .NET locaux mettent du temps à se charger pour la première fois? [fermé]

27

Je développe des sites basés sur la plateforme .NET. Je déploie généralement ces sites sur mon IIS local, afin de pouvoir les tester et voir leurs fonctionnalités avant de les mettre en ligne. Cependant, chaque fois que je redémarre Windows, il semble que les sites mettent beaucoup de temps à s'exécuter pour la première fois.

Je connais JIT et je suis également au courant de cette question , mais cela ne répond pas à ma question.

JIT se produit-il à chaque redémarrage de Windows? Est-ce lié à la création du processus w3wp.exe? Pourquoi les sites sont-ils si lents pour la première demande après chaque redémarrage?

Saeed Neamati
la source
3
C'est ce qu'on appelle le «démarrage à froid» ou quelque chose. Le système doit charger le w3wp en mémoire, qui a également besoin de toutes les DLL associées, probablement des trucs JIT, traiter les tables d'importation, lire les données du disque, car il ne se trouve pas dans le cache RAM, etc.
Codeur
@Coder, +1 pour votre commentaire. Mais pourriez-vous s'il vous plaît expliquer plus dans une réponse, afin que moi et un autre développeur en profitions. :)
Saeed Neamati
IIS n'est pas ma spécialité, j'espère donc que quelqu'un donnera une meilleure réponse. Voici un sujet similaire que j'ai commencé il y a un moment stackoverflow.com/questions/3807791/cold-startup-optimization Peut-être que cela aidera un peu plus.
Coder
4
Cette question semble être hors sujet car elle concerne un problème d'implémentation et non un problème de programmation conceptuelle.

Réponses:

32

Ce problème est la compilation JIT. Le pool d'applications a besoin de temps pour créer les bibliothèques avant de pouvoir commencer à les traiter. Cela peut être accéléré en utilisant un script d'échauffement, mais c'est quelque chose qui doit se produire. Cela dépend également si vous utilisez un site Web ou un projet d'application Web. Un site Web est JIT pour chaque page, donc le tout premier hit est lent et chaque nouvelle page a également un temps de compilation supplémentaire. Les projets d'applications Web sont précompilés et ne devraient pas subir ce coup aussi durement, mais les bibliothèques doivent encore être chargées. Plus vous avez de bibliothèques / d'outils, plus ce hit a tendance à être pire. Voici quelques liens qui discutent de l'échauffement:

http://weblogs.asp.net/gunnarpeipman/archive/2010/01/22/iis-application-warm-up-module.aspx http://blogs.iis.net/steveschofield/archive/2009/05/30 /application-pool-warm-up.aspx /programming/2063461/iis-web-applications-warmup http://sharepoint.smayes.com/2011/06/application-pool-specific-warm -up-scripts /

Joel Etherton
la source
6
C'est généralement correct mais il y a une différence entre la compilation et le jitting qui n'est pas claire dans cette réponse. Jitting compile le bytecode .NET en code machine. ASP.NET compile en fait ces pages Web, même dans un projet d'application Web (sauf si vous utilisez aspnet_compiler). Tout ce temps de compilation / compilation, plus le temps de jitting et de chargement de la bibliothèque, est pourquoi c'est si lent.
Aaronaught
JIT signifie juste à temps. Il n'y a pas de différence entre "jitting" et "compilation", au-delà du timing et de la quantité de code qui est compilé. De plus, la compilation JIT ne se produit que pour chaque code non visité , pas nécessairement pour chaque page. S'ils utilisent le même modèle, par exemple, la compilation n'est pas nécessaire. La remarque que plus de bibliothèques entraînent plus de temps de compilation est tout à fait vraie, bien sûr.
Cornelius
9

La réaction lente à votre première demande est due au fait qu'IIS démarre / charge uniquement un site ou un pool d'applications sur sa première demande entrante. Et après un laps de temps fixe, aucune nouvelle demande entrante n'arrive sur le serveur IIS arrête à nouveau le site (recyclage du pool d'applications).

ASP.NET 4.0 a une nouvelle fonctionnalité appelée démarrage automatique. Avec cette fonctionnalité, vous pouvez définir un pool d'applications ou un site individuel pour démarrer lui-même avant toute demande. Cela se déclenche au démarrage (lorsque IIS démarre) ou lorsque vous mettez à jour un site ASP.NET (qui arrête le site).

<applicationPools>
    <add name="MyAppPool" managedRuntimeVersion="v4.0" startMode="AlwaysRunning" />
</applicationPools>

<sites>
    <site name="MySite" id="1">
        <application path="/" serviceAutoStartEnabled="true" />
    </site>
</sites>

Vous avez besoin d'IIS 7.5 pour l'utiliser.

Il existe également une option pour effectuer certaines tâches supplémentaires lorsque le démarrage automatique entre en jeu, par exemple. pour précharger les données dans le cache.

Stief
la source
Normalement, vous compilez votre site complet avant de le mettre sur le serveur Web, donc le code n'a plus besoin d'être compilé à la première demande. JIT est uniquement utilisé pour les sites utilisant le dossier App_code où vous publiez votre code source avec le site Web.
Stief
2

Une partie du problème est également le GAC. La sécurité des bibliothèques doit être vérifiée à chaque fois qu'elles sont chargées, ce qui signifie que toute une charge de travail de type chiffrement est effectuée, ce qui ralentit considérablement les choses. Il y a un moment, MS a parlé des performances de WPF, qui a décrit ce problème - leur réponse était "ne mettez pas de choses dans le GAC si vous ne pouvez pas l'aider"

gbjbaanb
la source
1
Cela devrait être "peut l'aider" pour éviter un double négatif
Richard Szalay