Pourquoi IIS ne nettoie-t-il pas les vieux processus de travail (w3wp.exe) sur le recyclage de piscine menant au site Web hors de l'exception de mémoire?

<!-- J'ai une asp.net-mvc site et récemment je reçois un hors des exceptions de mémoire sur mon serveur web. Je n'ai qu'un pool d'applications et nous avons récemment mis IIS à recycler après qu'il atteigne une certaine limite. Je suis allé l'autre jour et a vu 4 w3wp.exe processus en cours d'exécution (chacune avec une mémoire d'environ 1,8 Go)

je suppose que pendant le processus de recyclage, il ne tue pas le processus de l'ancien travailleur et finalement je sors des exceptions de mémoire sur mon site Web parce que la boîte seulement a 8 go de mémoire. Je peux ajouter de la mémoire à la boîte, mais je me demande pourquoi ces vieux processus ne sont pas nettoyés.

y a-t-il des recommandations pour comprendre pourquoi ce processus de Recyclage ne tue pas l'ancien w3wp.les processus exe et les laisser en marche? Des suggestions à propos de comprendre à la fois cause profonde ou même solutions de rechange pour éviter ce risque aller de l'avant?

27
demandé sur Chamin Wickramarathna 2016-12-14 15:08:10

4 réponses

j'ai eu le même problème quand je dirigeais des choses comme FFMpeg.exe ou une conversion de PDF avec des graphiques WPF, le processus IIS ne sera pas arrêté et émettra des erreurs de mémoire non trouvées. Le problème n'est pas avec IIS, mais quelques blocages dans le processus qui bloque même après un crash.

solution de contournement est, diviser votre site Web en deux sites Web distincts, on ne devrait faire le traitement des transactions avec la base de données qui n'a généralement pas de plantages. La conversion logique comme vidéo / photo, PDF la conversion, ou toute autre logique qui pourrait causer le crash devrait être déplacée à un autre service web. Et utilisez L'appel HTTP de votre site Web en interne pour les traiter sur les services web.

maintenant, dans ce cas, il n'y a toujours aucun moyen de contourner le processus de service web s'effondrant, donc j'ai décidé de recycler le travailleur de la piscine d'application toutes les 100 requêtes (j'ai choisi ce nombre après avoir regardé peu de requêtes, en moyenne il irait au-delà de 1 Go seulement après avoir frappé 200 requêtes) et j'ai transformé la piscine d'application en Web Garden en faisant 4 processus par Piscine.

L'avantage de cette configuration est, vous pouvez déplacer votre processus de service web à d'autres machines facilement à l'avenir, vous pouvez augmenter/diminuer le nombre de processus par pool. Et votre site Web principal, qui est simplement faire le processus de transaction devient très réactif car il n'est pas affecté par le processus recycles de services web.

3
répondu Akash Kava 2017-01-07 08:10:46

le recyclage de la piscine D'Application bloque habituellement les vieux processus de travail, donc je ne pense pas que vous ayez touché un bug d'IIS.

notez que les processus peuvent vivre plus longtemps s'ils deviennent orphelins, et basé sur la configuration IIS doit les laisser là pour que vous puissiez les dépanner,

https://www.iis.net/configreference/system.applicationhost/applicationpools/add/failure

Si vous n'êtes pas très familier avec le débogage de tels processus, je vous suggère d'ouvrir un support via http://support.microsoft.com et permettre à Microsoft de soutien les gars vous aider.

7
répondu Lex Li 2017-01-07 03:04:35

le principal suspect que vous devez suivre sont les classes qui implémentent IDisposable et tout usage de ceux qui n'appelle pas Dispose(). J'ai eu un problème similaire, j'ai déjà posté une réponse à cette question.

la cause la plus probable est que vous n'appelez pas .Dispose() sur les connexions de base de données. Les gens ont tendance à être confus à ce sujet parce que. la piscine de connexion intégrée de .NET le rend son vous ne devez pas disposer de connexions. Cependant, appel de .Dispose() à la fin de la requête (ou lorsque vous avez terminé d'utiliser la connexion) est exactement ce que vous devriez faire pour éviter les fuites. La mise en commun des connexions s'attend à ce que cela se produise.

je ne pense pas que 4 w3wp.exe les processus sont en grande partie une préoccupation - il est normal que les SII engendrent des processus multiples. Mais il est clair que votre demande présente des fuites de ressources qui doivent être corrigées. Commencez par regarder IDisposable comme je l'ai mentionné ci-dessus. Si vous avez encore des questions, prendre un coup d'oeil à les éléments que vous avez dans le cache et essayer de déterminer s'il y a une stratégie de mise en cache plus efficace que vous pourriez utiliser. Si tout le reste échoue, profilez l'application pour voir si vous pouvez localiser la source de la fuite de ressources. Très probablement votre application devrait œuvre IDisposable quelque part il n'est pas.

3
répondu NightOwl888 2017-05-23 11:54:28

Comme Il est clair que vous publiez que paramétrer IIS pour recycler après avoir atteint une certaine limite crée un nouveau pool d'applications.

Il peut y avoir plusieurs raisons pour que les personnes âgées ne soient pas congédiées.

on peut être une fuite de mémoire, ne pas éliminer des ressources non gérées, vous pouvez chercher ceci.

À trouver une autre raison, Activer "Process Orphaning" in IIS. Pour connaître le processus coupable, vous pouvez utiliser"Processus Explorer".

Vous avez aussi une option pour définir un exécutable, ceci sera exécuté lorsqu'un processus est orphelin/ abandonné.

la solution immédiate peut aussi être de régler l'action de KillW3p après une certaine limite CPU.

<applicationPools>
   <add name="DefaultAppPool">
     <cpu limit="80000" action="KillW3wp" resetInterval="00:02:00" />
   </add>
</applicationPools>
2
répondu Anil 2017-02-15 11:16:17