Que dois-je faire pour m'assurer qu'IIS ne recycle pas mon application?

83

J'ai une application de service WCF hébergée dans IIS. Au démarrage, il va chercher une ressource très coûteuse (en termes de temps et de ressources processeur) à utiliser comme cache local.

Malheureusement, IIS semble recycler le processus assez régulièrement. J'essaie donc de modifier les paramètres du pool d'applications pour m'assurer qu'IIS ne recycle pas l'application. Jusqu'à présent, j'ai changé ce qui suit:

  • Intervalle limite sous processeur de 5 à 0.
  • Délai d'inactivité sous Modèle de processus de 20 à 0.
  • Intervalle de temps normal sous recyclage de 1740 à 0.

Cela suffira-t-il? Et j'ai des questions spécifiques sur les éléments que j'ai modifiés:

  1. Que signifie spécifiquement le paramètre Intervalle limite sous CPU? Cela signifie-t-il que si un certain usage du processeur est dépassé, le pool d'applications sera recyclé?
  2. Que signifie exactement "recyclé"? L'application est-elle complètement démolie et redémarrée?
  3. Quelle est la différence entre "l'arrêt du processus de travail" et le "recyclage du pool d'applications"? La documentation relative au délai d'inactivité dans le modèle de processus parle de l'arrêt du processus de travail. Dans la documentation relative à l'intervalle de temps régulier, sous Recyclage, parlez du recyclage du pool d'applications. Je ne fais pas la différence entre les deux. Je pensais que le fichier w3wp.exe était le processus de travail qui exécute le pool d'applications. Quelqu'un peut-il expliquer la différence entre l'application et l'application?

La raison pour avoir des balises IIS7 et IIS7.5 est parce que l'application s'exécutera dans les deux et espère que les réponses sont les mêmes entre les versions.

Image pour référence: entrez la description de l'image ici

AngryHacker
la source
Où avez-vous obtenu cette capture d'écran ci-dessus avec les paramètres d'IIS?
Andrew William Ross
C'est la feuille de propriétés du pool d'applications avancées.
TristanK

Réponses:

105

Recyclage

Le recyclage est généralement * où IIS démarre un nouveau processus en tant que conteneur pour votre application, puis donne l'ancien processus à ShutdownTimeLimit pour qu'il disparaisse de son plein gré avant d'être éliminé.

* - généralement: voir DisallowOverlappingRotation / "Désactiver le recyclage avec recouvrement"

Il est destructif en ce que le processus d'origine et toutes ses informations d'état sont ignorés. L'utilisation d'un état de session hors processus (par exemple, un serveur d'état ou une base de données, ou même un cookie si votre état est minuscule) peut vous permettre de contourner ce problème.

Mais il se chevauche par défaut, ce qui signifie que la durée d’une panne est réduite au minimum, car le nouveau processus est démarré et connecté à la file d’attente, avant que l’ancien ne soit averti "vous avez [ShutdownTimeLimit] secondes pour disparaître. Veuillez vous conformer."

Paramètres

A votre question: tous les paramètres de cette page contrôlent le recyclage d’une manière ou d’une autre. Le terme «arrêt» peut être décrit comme un «recyclage proactif» - le processus décide lui-même qu'il est temps de partir et se termine de manière ordonnée.

Le recyclage réactif est l'endroit où WAS détecte un problème et déclenche le processus (après avoir établi un W3WP de remplacement approprié).

Maintenant, voici quelques trucs qui peuvent causer le recyclage d’une forme ou d’une autre:

  • un ISAPI décidant qu'il est malsain
  • un module qui tombe en panne
  • délai d'inactivité
  • limitation du processeur
  • réglage des propriétés du pool d'applications
    • comme votre maman peut avoir hurlé à un moment donné: « Arrêtez la cueillette à elle, ou ça ne guérira jamais! »
  • "ping" échec * pas réellement ping, car il utilise un canal nommé - plus de "détection de la vie"
  • tous les paramètres de la capture d'écran ci-dessus

Que faire:

Généralement:

  • Désactiver les délais d'inactivité . 20 minutes d'inactivité = boum! Nouveau processus à la prochaine demande entrante. Réglez cela à zéro.

  • Désactiver Intervalle de temps régulier - la valeur par défaut de 29 heures a été décrite comme "insensée", "ennuyeuse" et "astucieuse" par diverses parties. En fait, seuls deux d'entre eux sont vrais.

  • Activez éventuellement DisallowRotationOnConfigChange (ci-dessus, Désactivez le recyclage pour les modifications de configuration ) si vous ne pouvez tout simplement pas arrêter de jouer. Cela vous permet de modifier tout paramètre de pool d'applications sans que celui-ci ne soit immédiatement signalé aux processus de travail. Vous devez recycler manuellement le pool d'applications pour que les paramètres prennent effet, ce qui vous permet de prédéfinir les paramètres, puis d'utiliser une fenêtre de modification pour les appliquer via votre processus de recyclage.

  • En règle générale, laissez le ping activé . C'est votre filet de sécurité. J'ai vu des gens l'éteindre, puis le site se bloque parfois indéfiniment, ce qui provoque la panique ... donc, si les paramètres sont trop agressifs pour votre application apparemment très lente à répondre très lentement, retirez-la un peu et voyez ce que vous obtenez, plutôt que de l'éteindre. (Sauf si vous avez défini une fonction de vidage en mode crash automatique pour les W3WP bloqués via votre propre processus de surveillance)

C’est assez pour qu'un processus sage se comporte pour toujours. S'il meurt, bien sûr, il sera remplacé. S'il se bloque, pinger devrait le ramassez une nouvelle devrait commencer dans les 2 minutes (par défaut, le pire cas calc devrait être: jusqu'à la fréquence de ping + délai d' attente ping + délai de démarrage avant que les demandes commencent à travailler à nouveau).

La limitation du processeur n’est normalement pas intéressante, car par défaut, elle est désactivée et elle est également configurée pour ne rien faire de toute façon. s'il était configuré pour tuer le processus, bien sûr, ce serait un déclencheur de recyclage. Laisse le. Remarque pour IIS 8.x, la limitation du processeur devient également une option.

Un AppPool (IIS) n'est pas un AppDomain (.Net) (mais peut en contenir un / des)

Mais ... alors nous entrons dans. Net, et le recyclage AppDomain, ce qui peut aussi causer une perte d'état. (Voir: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

Pour faire court, vous le faites en touchant un fichier web.config dans votre dossier de contenu (à nouveau avec le choix!), Ou en créant un dossier dans ce dossier, ou un fichier ASPX, ou .. d'autres choses ... et c'est à peu près tout aussi destructif qu’un pool d’applications recyclé, moins les coûts de démarrage du code natif (il s’agit uniquement d’un concept de code géré (.Net), de sorte que seul le code géré est traité ici).

Antivirus peut également déclencher ce problème en analysant les fichiers web.config, ce qui entraîne une notification de modification, ce qui entraîne ....

TristanK
la source
2
Attendez, attendez, attendez ... pourquoi LIRE un web.config d’Antivirus déclencherait-il une notification de modification? Tout antivirus qui "touche" un web.config sans raison est trash imho.
Shiv
AV peut ne pas simplement lire, mais écrire - par exemple, dans un autre flux de données, en enregistrant la dernière version du moteur utilisée pour analyser un fichier. Comme une pensée.
TristanK
7

Bien vouloir vérifier,

Pourquoi recyclons-nous nos pools d'applications?

Si vous naviguez sur le Web pour trouver la raison pour laquelle les pools d'applications sont configurés pour recycler automatiquement de façon périodique, vous aurez du mal à trouver une réponse raisonnable qui ne concerne pas les problèmes de mémoire. C'est comme si la communauté en général avait à peu près accepté le fait que nos applications Web (ou couches de service hébergées dans IIS) devront être recyclées pour éviter les problèmes de mémoire.

J'ai toujours été d'avis que si votre code nécessite des redémarrages périodiques pour continuer à fonctionner correctement, il est évident que quelque chose ne va pas. Il y a un bogue dans votre code quelque part et vous devez le résoudre au lieu de redémarrer le processus de temps en temps pour que le problème disparaisse.

Nous devons vraiment commencer à nous concentrer davantage sur la gestion de la mémoire dans .NET et à nous assurer que nos applications peuvent continuer à fonctionner sans problèmes.

MSTdev
la source
3
L'une des raisons était que .NET utilisait un segment de mémoire distinct pour les «objets volumineux» (généralement 85 Ko ou plus), ce qui n'est pas compacté lors de la récupération de place (bien que dans .NET 4.5.1, je pense qu'ils ont ajouté l'option de compaction du LOH), et dans ASP.NET lors du rendu HTML côté serveur, il n'est pas rare de voir 85 Ko de HTML (en particulier pour le contenu répété, comme des tableaux et des grilles) et ce code HTML est fondamentalement, à un moment donné, juste un énorme objet Chaîne sur le serveur. Objet volumineux, il contribue à la fragmentation du tas d'objets volumineux, aboutissant éventuellement à une exception OutOfMemoryException, donc au recyclage
rien n'est nécessaire
0

Selon le scénario OP (longue initialisation au démarrage / préchauffage), vous devez également vérifier la limite de temps de démarrage (secondes), qui a une valeur par défaut de 90 secondes. Si l'initialisation prend plus que la limite de temps de démarrage, le processus de travail peut être terminé.

Alexei
la source