2009-09-17 11 views
13

J'ai un site Web ASP.NET 3.5 fonctionnant sous IIS7 sur Windows 2008.application ASP.NET sur IIS7 - démarrage très lent après iisreset

Lorsque je redémarre IIS (iisreset), puis appuyez sur une page, la mise en service est vraiment lent.

Je vois l'activité suivante dans Process Explorer:

  • fraie w3wp.exe, mais montre 0% CPU activité pendant environ 60 secondes
  • Enfin, w3wp.exe va à la CPU de 50% pour environ 5 secondes, puis la page charges.

Je ne vois pas d'autres processus utilisant le processeur pendant ce temps non plus. Il se bloque simplement.

Que se passe-t-il pendant tout ce temps? Comment puis-je savoir ce qui se passe tout ce temps?

Répondre

4

J'ai constaté qu'il y avait un délai réseau établissant une connexion initiale entre le serveur Web frontal et le serveur de base de données.

Le problème était propre à Windows 2008 et à notre matériel réseau spécifique.

La résolution est de désactiver les éléments suivants sur les serveurs Web:

4

IL est converti en code natif de la machine (Assembly) par le compilateur Just-In-Time et vous pouvez attendre pendant que toute la magie se produit.

Lors de la compilation du code source code managé, le compilateur traduit la source en langage intermédiaire Microsoft (MSIL). Il s'agit d'un ensemble d'instructions indépendant du processeur, , qui peut être converti efficacement en code natif . Le langage intermédiaire Microsoft (MSIL) est une traduction utilisée comme sortie d'un certain nombre de compilateurs . C'est l'entrée d'un compilateur juste-à-temps (JIT) . Le Common Language Runtime inclut un compilateur JIT pour la conversion de code MSIL en code natif .

Avant Microsoft Intermediate Language (MSIL) peut être exécutée il, doit être converti par le compilateur .NET Framework juste à temps (JIT) en code natif . Il s'agit d'un code spécifique à l'unité centrale qui fonctionne sur la même architecture d'ordinateur que le compilateur JIT ( ). Plutôt que d'utiliser le temps et la mémoire pour convertir tous les MSIL dans un fichier portable exécutable (PE) en code natif. Il convertit le MSIL au besoin lors de l'exécution, puis met en cache le code natif résultant afin que soit accessible pour tous les appels suivants.

source

+0

Si elle compilait JIT, ne je vois csc.exe dans Process Explorer? Je ne vois pas csc.exe en cours d'exécution pendant les 60 secondes d'attente. – frankadelic

+0

@frankadelic csc.exe est le compilateur C#. Le JIT fait partie de .NET et pourquoi .NET doit être installé sur les machines exécutant C#. –

+0

Que ce soit csc ou le JIT, vous verriez l'utilisation du processeur. –

4

Cest la compilation de pages ASP.net en langage intermédiaire + compilation JIT - il arrive que la première fois que la page est chargée. (Voir http://msdn.microsoft.com/en-us/library/ms366723.aspx)

Si cela vous dérange vraiment alors vous pouvez l'empêcher de se produire en pré-compilant votre site. Il suffit de relire la question - 60 secondes est très longue, et vous vous attendez à voir une activité du processeur pendant cette période.Vérifiez l'EventLog pour les erreurs/messages dans les destinations Système et Application. Essayez également de créer un vidage sur incident du processus w3wp pendant ces 60 secondes - il est possible que vous reconnaissiez ce qu'il fait en regardant certaines des piles d'appels.

Si cela prend exactement 60 secondes à chaque fois alors il est probable qu'il attende quelque chose pour expirer - 60 secondes est un bon nombre rond. Assurez-vous qu'il a des connexions appropriées aux contrôleurs de domaine etc ...

(S'il y a certains outils de diagnostic IIS qui feraient un meilleur travail alors je crains de ne pas les connaître, cette question pourrait être plus adapté à ServerFault, ce qui précède est une approche beaucoup plus de développement-ish de dépannage :-p)

+0

comme mentionné dans d'autres commentaires - Je ne vois aucun csc.exe fonctionnant pendant ce délai. – frankadelic

1

Ce chapeau n'a rien à voir avec la compilation JIT. Le compilateur C# normal compile votre code derrière les fichiers (.aspx.cs) en langage intermédiaire dans un assembly au démarrage si cet assembly n'existe pas ou si les fichiers de code ont changé. L'assemblage de votre site Web se trouve dans le dossier «bin» de votre site Web.

En fait, la compilation JIT se produit après cela, mais c'est très rapide et ne prendra pas plusieurs minutes. La compilation JIT se produit à chaque démarrage d'une application .net et cela ne prendra pas plus d'une seconde.

Vous pouvez éviter le copiage de votre site Web si vous déployez l'assembly de site Web déjà compilé (YourWebsite.dll) dans le dossier bin. Il est également possible de déployer uniquement les fichiers aspx et de laisser le code derrière les fichiers (aspx.cs).

+0

En fait, même avec un site pré-compilé, les fichiers .aspx, .ascx, etc. sont analysés en code C#, compilés et ensuite JIT'd. Il y a donc beaucoup d'activité lors du réchauffement d'une application ASP.NET pour la première fois. – Kev

2

Plus de 60 secondes semble louche. Essayez d'exécuter une page test.html pour voir combien de temps cela prend. Cela isolera le rôle d'IIS7. Puis renommez temporairement vos dossiers web.config, global.asax et application et essayez une page test.aspx (page très simple). Cela isolera ASP.NET.

Si les deux sont rapides (c'est-à-dire environ 10 secondes), alors c'est votre application. Mais, si l'un ou l'autre est lent alors pas l'application et quelque chose avec le serveur lui-même.

+0

La page HTML de test a pris environ 2 secondes après l'iisreset. Si IIS était en cours d'exécution et que je modifiais web.config, il faut peut-être 3 secondes pour charger une page ASPX de test. – frankadelic

+3

Il semble que IIS et ASP.NET se portent bien alors. Ce doit être quelque chose dans l'application qui cause cela. Si c'est seulement lent sur le premier chargement, c'est la conversation en code natif. Avez-vous un projet massif? J'examinerais le type et la taille de votre projet et verrais à propos de le diviser en parties ou pré-compiler avant de télécharger sur le serveur. –

6

Nous avons rencontré un problème similaire et il s'est avéré que Windows procédait à une vérification de la révocation des certificats de signature. Vérifiez si votre serveur tente d'appeler quelque part (par exemple, crl.microsoft.com). Peut-être avez-vous un paramètre proxy incorrect? Ou un pare-feu sur le chemin? Nous avons finalement déterminé que nous avions assez de contrôle sur le serveur et ne voulions pas «appeler chez nous», alors nous avons simplement désactivé le chèque. Vous pouvez le faire avec .NET 2.0 SP1 et versions ultérieures en ajoutant ce qui suit au fichier machine.config. Je ne sais pas si vous pouvez simplement mettre cela dans votre app.config/web.config.