Comment savoir pourquoi un pool d'applications IIS est recyclé
De fond:
J'ai déployé une ASP.NET MVC 3 app qui fonctionne sur ma machine pour un fournisseur d'hébergement mutualisé et je suis la découverte de certains des problèmes qui semblent être liées à l'application de la piscine recyclé. L'hôte est configuré de recyclage de se produire sous l'une de ces circonstances:
- L'utilisation de la mémoire dépasse les 200 MO
- L'utilisation du PROCESSEUR dépasse 75% (probablement sur une longue période)
- 20 minutes de temps d'inactivité
Les restrictions sont plus à l'aise sur ma machine de développement, donc je ne voyais pas de recyclage comme cela, au cours du développement. Je n'ai pas accès à l'administration d'hébergement partagé de la boîte (à juste titre) donc je ne peux pas lire le journal des événements pour voir pourquoi le recyclage est en cours.
Question:
Est-il une manière que je peux savoir pourquoi mon application a été recyclé (en Application_End
par exemple), de sorte que je peux me connecter à l'aide de mon débogage?
Vous devez vous connecter pour publier un commentaire.
Sans accès aux journaux d'événements (parce que vous êtes dans un environnement d'hébergement partagé) la plupart des informations que vous allez obtenir est de la
Application_End
de l'événement, et en demandant auxHttpRuntime
(par réflexion) pour les valeurs d'une ou de deux des membres privés qui sont malheureusement ce n'est pas exposée au public.Pour ce faire, ajoutez le code suivant à votre
Application_End
événement:Si j'ai d'arrêt ou de recycler mon application de la piscine, je vois les suivantes:
C'est probablement à peu près aussi bon qu'il obtient.
Mise à jour:
Je ne me souviens pas où j'ai trouvé ce code mais Attire utilement rappelé à moi, c'était à partir d'un Scott Guthrie blog.
Il y a quelques autres membres privés qui pourraient être utiles telles que:
Vous pouvez examiner ces champs .NET Réflecteur (si vous en avez une copie qui n'est pas le temps bombardée) ou des variantes (Des Alternatives Open Source à Réflecteur?).
System.Web.Hosting.HostingEnvironment.ShutdownReason
de la propriété (c'est un enum.)string shutDownReason = runtime.GetType().GetField("_shutdownReason", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField) .GetValue(runtime).ToString();
De recherche - 1
Tout d'abord j'ai essayé d'utiliser
System.Web.ProcessModelInfo.GetCurrentProcessInfo()
etSystem.Web.ProcessModelInfo.GetHistory(int)
. Les résultats de ces méthodes retournent des informations telles que le PID, l'heure de début, l'âge, le statut et l'utilisation maximale de la mémoire. Malheureusement, elles n'étaient pas disponibles dans mon environnement d'hébergement:Cette approche pourrait fonctionner pour les autres, si vous êtes dans cette situation, donner un coup de feu.
De recherche - 2
La propriété
System.Web.Hosting.HostingEnvironment.ShutdownReason
est un enum avec beaucoup de valeurs, mais malheureusement tous les cas que je décris dans mes question sont regroupés dans une unique valeur d'enum:De recherche - 3
ScottGu a une approche sur son blog (qui est le même code Kev posté) qui utilise la réflexion pour accéder à l'état interne de l'
HttpApplication
. Malheureusement, dans ce cas, il ne signale que le même niveau de détail que #2 ci-dessus:Ci-dessous est le code de bonne trouver de http://mitchelsellers.com/blogs/2007/03/15/logging-aspnet-application-restarts.aspx
C'est vraiment une réponse tardive, mais j'espère qu'il peut fournir plus de perspicacité, pour les personnes ayant des problèmes similaires (IIS 7.x ou ci-dessus).
1. Conclusion lors de l'application de la piscine est de commencer à l'arrêt - le code suivant peut être utilisé pour savoir si le pool d'applications de commencer son arrêt. L'arrêt lui-même se produit dans un délai maximum de Fermeture (limite de secondes, par défaut 90) après cet événement.
Ce qui aide à trouver la raison générale et quand exactement il a été déclenché. Dans votre cas, je pense que
HostingEnvironment
est la valeur. Malheureusement, la cause sous-jacente n'est pas unique. Il peut être périodique, recycler, recycler en raison de la limite de mémoire (le plus probable en raison de l'OP de la question), recycler grâce à heure fixe, etc.2. Trouver la cause exacte - une façon de trouver la cause exacte est à rechercher dans le Journal des événements. Si ce n'est pas accessible, il peut être demandé au fournisseur d'hébergement en fournissant les détails suivants pour affiner leur recherche.
Journal des événements doit retourner les informations les plus pertinentes comme celles ci-dessous: