97 votes

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

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

Malheureusement, IIS semble recycler le processus de manière assez régulière. J'essaie donc de modifier les paramètres du pool d'applications pour faire en sorte que IIS ne recycle pas l'application. Jusqu'à présent, j'ai modifié les éléments suivants :

  • Intervalle limite sous CPU de 5 à 0.
  • Idle Time-out sous le modèle de processus de 20 à 0.
  • Intervalle de temps régulier sous Recyclage de 1740 à 0.

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

  1. Que signifie précisément le paramètre Limit Interval sous CPU ? Cela signifie-t-il que si une certaine utilisation du CPU est dépassée, le pool d'applications sera recyclé ?
  2. Que signifie exactement "recyclé" ? L'application est-elle complètement démantelée et redémarrée ?
  3. Quelle est la différence entre "arrêt du processus de travail" et "recyclage du pool d'applications" ? La documentation relative au délai d'inactivité sous Modèle de processus parle de l'arrêt du processus de travail. Alors que la documentation pour Regular Time Interval sous Recycling parle du recyclage du pool d'applications. Je ne comprends pas bien la différence entre les deux. Je pensais que le w3wp.exe était le processus de travail qui exécute le pool d'applications. Quelqu'un peut-il expliquer la différence entre les deux pour l'application ?

La raison pour laquelle nous avons des étiquettes IIS7 et IIS7.5 est que l'application fonctionnera dans les deux et que nous espérons que les réponses sont les mêmes pour les deux versions.

Image de référence : enter image description here

0 votes

Où avez-vous obtenu la capture d'écran ci-dessus avec les paramètres pour IIS ?

1 votes

C'est la feuille de propriétés du pool d'applications avancé.

123voto

TristanK Points 8893

Recyclage

Le recyclage consiste généralement* à ce que IIS démarre un nouveau processus en tant que conteneur pour votre application, puis abandonne l'ancien processus à ShutdownTimeLimit de s'en aller de son plein gré avant d'être tué.

*- habituellement : voir DisallowOverlappingRotation / "Désactiver le recyclage par chevauchement".

Il est destructeur En effet, le processus d'origine et toutes ses informations d'état sont supprimés. L'utilisation d'un état de session hors processus (par exemple, le 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 c'est par défaut chevauché - ce qui signifie que la durée d'une interruption est réduite au minimum parce que le nouveau processus démarre et est relié à la file d'attente des demandes, avant que l'ancien processus ne soit averti "vous avez [ ShutdownTimeLimit ] secondes pour s'en aller. Veuillez vous y conformer."

Paramètres

Pour répondre à votre question : tous les paramètres de cette page contrôlent le recyclage d'une manière ou d'une autre. L'"arrêt" pourrait être décrit comme un "recyclage proactif" - où le processus lui-même décide qu'il est temps de partir, et sort de manière ordonnée.

Le recyclage réactif consiste à ce que le WAS détecte un problème et lance le processus (après avoir établi un W3WP de remplacement approprié).

Maintenant, voici quelques trucs qui peuvent causer un recyclage d'une forme ou d'une autre :

  • un ISAPI décidant qu'il est malsain
  • tout module se bloque
  • délai d'inactivité
  • limitation du nombre de processeurs
  • ajustement des propriétés du pool d'applications
    • comme ta mère mai ont crié à un moment donné : "Arrêtez cueillir ou ça ne s'améliorera jamais !"
  • échec du "ping" * pas vraiment de ping à proprement parler, car il utilise un tuyau nommé - plutôt une "détection de vie".
  • tous les paramètres de la capture d'écran ci-dessus

Ce qu'il faut faire :

En général :

  • Désactiver Délais d'inactivité . 20 minutes d'inactivité = boom ! L'ancien processus a disparu ! Nouveau processus à la prochaine demande entrante. Mettez ça à zéro.

  • Désactiver Intervalle de temps régulier - le défaut de 29 heures a été décrit comme "insensé", "ennuyeux" et "intelligent" par diverses parties. En fait, seuls deux de ces qualificatifs sont vrais.

  • En option, Allumez DisallowRotationOnConfigChange (ci-dessus, Désactiver le recyclage pour les changements de configuration ) si vous ne pouvez pas vous empêcher de jouer avec - cela vous permet de modifier n'importe quel paramètre du pool d'applications sans qu'il signale instantanément aux processus de travail qu'il doit être tué. 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, quitter pinging activé . C'est votre filet de sécurité. J'ai vu des gens qui l'ont désactivé, et ensuite le site se bloque indéfiniment parfois, conduisant à la panique... donc si les paramètres sont trop agressifs pour votre application apparemment très lente à répondre, diminuez-les un peu et voyez ce que vous obtenez, plutôt que de le désactiver. (A moins que vous n'ayez mis en place un dumping automatique en mode crash pour les W3WP bloqués par votre propre processus de surveillance).

C'est suffisant pour qu'un processus bien conduit vive pour toujours. S'il meurt, bien sûr, il sera remplacé. S'il se bloque, le ping devrait le détecter et un nouveau devrait démarrer dans les 2 minutes (par défaut ; dans le pire des cas, le calcul devrait être : jusqu'à fréquence de ping + délai d'attente pour le ping + limite de temps de démarrage avant que les demandes ne recommencent à fonctionner).

La limitation du CPU n'est pas normalement intéressant, parce que par défaut il est désactivé, et il est aussi configuré 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. Laissez-la désactivée. Notez que pour IIS 8.x, l'étranglement du processeur devient également une option.

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

Mais... ensuite nous entrons dans le monde de .Net, et App Domaine le recyclage, qui peut également entraîner une perte d'état. (Voir : https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

Version courte, vous faites cela en touchant un fichier web.config dans votre dossier de contenu ( encore une fois avec la cueillette ! ), ou en créant un dossier dans ce dossier, ou un fichier ASPX, ou ... d'autres choses... et c'est à propos de aussi destructeur qu'un recyclage d'App Pool, moins les coûts de démarrage du code natif (il s'agit d'un concept purement de code géré (.Net), donc seule l'initialisation du code géré a lieu ici).

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

3 votes

Attendez attendez attendez... pourquoi la LECTURE d'un web.config par un Antivirus déclencherait-elle une notification de changement ? Tout antivirus qui "touche" un web.config sans raison est une poubelle, je pense.

1 votes

L'AV peut non seulement lire, mais aussi écrire, par exemple sur un autre flux de données, en enregistrant la dernière version du moteur utilisée pour analyser un fichier. En guise de réflexion.

0 votes

Pour des raisons de bon sens, il n'y a aucune raison de croire qu'un antivirus respectueux de l'environnement puisse tenter de modifier une adresse IP. web.config ou tout autre fichier d'application, sauf s'ils ont été testés positifs (ce qui inclut les faux positifs) ou s'ils ont été volontairement "innocentés", ce qui exclurait certainement les fichiers de configuration comme web.config. Cela dit, je vous mets au défi de le prouver.

11voto

MSTdev Points 199

Veuillez vérifier,

Pourquoi recycler nos pools d'applications ?

si vous naviguez sur le web pour trouver la raison pour laquelle les pools d'applications sont configurés pour se recycler automatiquement de façon périodique, vous aurez du mal à trouver une réponse raisonnable qui ne soit pas liée à des problèmes de mémoire. C'est comme si la communauté en général avait accepté le fait que nos applications web (ou les 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, alors il y a clairement quelque chose qui ne va pas. Il y a un bug dans votre code quelque part et vous devez le corriger, au lieu de redémarrer le processus de temps en temps pour que le problème "disparaisse".

J'ai vraiment besoin de me concentrer davantage sur gestion de la mémoire dans .NET et de s'assurer que nos applications peuvent continuer à fonctionner sans problème.

3 votes

L'une des raisons était que .NET utilise un tas séparé pour les "gros objets" (généralement 85K ou plus ou quelque chose comme ça) qui n'est pas compacté lors de la collecte des déchets (bien que dans .NET 4.5.1 je pense qu'ils ont ajouté une option pour compacter le LOH), et dans ASP. NET, lors du rendu d'un HTML côté serveur, il n'est pas rare de voir 85K de HTML (surtout pour du contenu répété comme des tableaux et des grilles) et ce HTML n'est en fait à un moment donné qu'un énorme objet String sur le serveur, et s'il est considéré comme un gros objet, il contribue à la fragmentation du tas de gros objets, ce qui entraîne finalement une OutOfMemoryException, d'où le recyclage.

0 votes

Indépendamment du compactage, toutes les grandes chaînes HTML ne seraient-elles pas libérées une fois les requêtes terminées et le ramassage des ordures effectué ? Pour éviter une mémoire en forme de fromage suisse (où les trous de la mémoire disponible sont éparpillés), le compactage pourrait être nécessaire pour les applications prévalentes. à long terme (comme les variables d'application ou même les variables de session), mais si une application évite l'utilisation de nombreux objets volumineux à longue durée de vie, y aurait-il un problème à ne jamais recycler l'application ?

1 votes

Si l'espace libre n'est jamais compacté, une fragmentation se produira. Si le tas devient tellement fragmenté qu'il n'y a pas de bloc d'adresses contiguës suffisamment grand pour stocker votre objet, .NET lève l'exception OutOfMemoryException. Théoriquement, si vous utilisez le compactage et si votre utilisation totale de la mémoire reste dans les limites, vous éviterez cette situation. "Y aurait-il un problème à ne jamais recycler l'application ?" Je ne sais pas quel genre de bogues vous créez dans votre code donc il pourrait y avoir des problèmes. Mais si vous comprenez comment votre mémoire s'écoule, vous pouvez garder les choses à flot pendant un long moment probablement.

1voto

Alexei Points 182

En se basant sur le scénario du PO (initialisation longue au démarrage/réchauffement), une autre chose à vérifier est la suivante 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 Startup, le processus worker peut être terminé.

0voto

Steve Walsh Points 1284

La réponse est, vous peut d'empêcher le recyclage de l'AppPool, mais vous pouvez ne devrait pas.

La raison en est que s'il y a une fuite de mémoire, elle finira par consommer toute la mémoire du serveur et Windows affichera un écran bleu ou lancera des exceptions de manque de mémoire qui feront tomber d'autres sites sur le même serveur IIS.

Décidez donc de la quantité de mémoire qui peut être utilisée par ce site et définissez les paramètres ci-dessus pour qu'ils soient recyclés lorsque cette limite est atteinte.

Normalement, le recyclage se fait de manière élégante, de sorte que les utilisateurs finaux ne s'en rendent pas compte. Mais si vous utilisez Blazor Server, alors toutes les sessions sont exécutées sur le serveur, et tout l'état sera perdu. En pratique, je vois une application Blazor afficher le message "connecting..." pendant environ 5 secondes pendant que le recyclage se produit. En d'autres termes, ce n'est pas gracieux pour les applications Blazor côté serveur.

La morale de l'histoire est ce qui a été mentionné précédemment, assurez-vous que votre site ne fuit pas la mémoire. Testez votre mémoire au début du processus de développement, n'attendez pas qu'il soit en ligne, car le serveur Blazor est gourmand en mémoire et, d'après mon expérience, j'ai dû passer pas mal de temps à déboguer des problèmes de mémoire. Ce n'est pas une faute de Blazor, c'est juste dans la nature des applications Blazor Server d'exiger un code très serré. Plus tôt dans .net, je ne me suis jamais inquiété de la mémoire car le GC s'occupait de tout cela, mais fonctionner dans IIS est une autre histoire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X