Perfmon : IIS / ASP.NET

Une question qui revient régulièrement dans notre équipe concerne les compteurs de performance à mettre en place pour s'assurer qu'à la fois IIS et les application(s) ASP.NET fonctionnent bien. Cependant, comme chaque application, et donc chaque serveur IIS, vont se comporter différemment en fonction de ce qui sera exécuté, il est évident que le seuil au-delà duquel des pertes de performance seront notables va énormément varier. Il est donc indispensable de définir ces valeurs types dès le départ en testant votre application avant une mise en production. En effectuant une montée en charge progressive, vous devriez pouvoir identifier à partir de quel moment les performances de l'application se dégradent. Une fois que vous avez déterminé le seuil limite et le seuil optimal, il ne vous reste plus qu'à collecter les compteurs et cela correspondra à vos valeurs de référence.

Maintenant que vous savez comment définir ces valeurs de référence, il ne nous reste plus qu'à savoir quels compteurs mettre en place pour surveiller le tout. Pour ce faire, vous pouvez utiliser l'excellent PAL (https://pal.codeplex.com/) qui fournit une liste préétablie de compteurs à surveiller en fonction du produit sélectionné. En utilisant ces scripts, vous devriez avoir un excellent aperçu du comportement de votre application et de IIS en fonction de la charge.

Toutefois, il peut être intéressant d'élargir le champ dans le cadre de l'établissement des valeurs de référence afin d'avoir une vision globale du fonctionnement du serveur et non pas seulement de IIS ou d'ASP.NET. Il faut être capable de voir comment va se comporter le CPU, la mémoire, etc en fonction de la charge et en fonction de l'application.

Voici une liste non-exhaustive des compteurs qui peuvent être utilisés pour avoir cette vision :

Pour IIS :

Memory :
- Available Mbytes : Permet de voir la mémoire disponible. Important pour ne pas sous dimensionner son serveur par rapport au besoin de l'application
- % Commited Bytes In Use : Permet de voir la mémoire utilisée. Il est intéressant de mettre cette valeur en balance avec le compteur Available Mbytes

Process (Pour tous les processus W3WP.exe) :
- % Processor Time : Permet de voir la consommation CPU pour un processus donné.
- Virtual Bytes : Permet de voir la consommation de mémoire virtuelle du processus W3WP.exe
- Private bytes : Permet de voir la consommation de mémoire privée du processus W3WP.exe
Si vous ne connaissez pas la différence entre la mémoire virtuelle et privée, je vous invite à lire l'article suivant : https://blogs.msdn.com/b/friis/archive/2008/10/13/m-moire-recyclage-sous-iis-6.aspx
Pour résumer :
- Virtual Bytes = Reserved + Committed
- Committed = Private Bytes = Page File + Working Set

Processor (Tous les instances) :
- % Processor Time : Permet de mettre le ratio global de consommation CPU en rapport avec la consommation de chaque W3WP.exe. Si votre serveur consomme 90% de CPU alors que l'ensemble des processus W3WP.exe n'en consomme que 10%, il y a sûrement un problème ailleurs qu'au niveau de IIS

HTTP Service Request Queues (Toutes les instances) :
- CurrentQueueSize : Permet de voir la taille de la file HTTP côté Kernel et donc de voir si un trop grand nombre de requêtes s'empilent sans être prisent en charge
- RejectedRequests : Permet de voir si des requêtes sont rejetées côté Kernel sans même être traitées par le côté User Mode

APP_POOL_WAS (Pour tous les Application Pools listés) :
- Current Application Pool State : Permet de voir l'était d'un Application Pool
- Current Application Pool Uptime : Permet de savoir si l'Application Pool a été redémarré ou non pendant le test de charge

 

Pour ASP.NET :

ASP.NET Applications (Toutes les applications que vous voulaient surveiller)  :
- Compilations Total : Permet de voir le nombre de page compilées
- Request Bytes In Total : Permet de voir le nombre de bytes reçus
- Request Bytes Out Total : Permet de voir le nombre de bytes envoyés
- Request Execution Time : Permet de voir le temps nécessaire pour l'exécution de la requête la plus récente
- Request Wait Time : Permet de voir le temps passé dans la file d'attente pour la requête la plus récente
- Requests Executing : Permet de voir le nombre de requêtes en cours d'exécution
- Request in Application Queue : Permet de voir le nombre de requêtes en file d'attente
- Requests Timed Out : Permet de voir le nombre de requêtes qui ont rencontré une erreur du type Time Out
- Requests/Sec : Permet de voir le nombre de requêtes exécutées par seconde
- Sessions Active : Permet de voir le nombre de sessions actives

ASP.NET V4.0.30319 :
- Application Restarts : Permet de voir le nombre de redémarrage d'Application Domain

Avec cet ensemble d'informations, vous devriez avoir les valeurs adéquates pour déterminer le seuil de fonctionnement optimal et le seul qui indique un problème pour votre/vos application(s). Enfin, si vous souhaitez aller plus loin sur la partie ASP.NET, vous pouvez jeter un oeil à cet article qui explique certain des compteurs les plus importants et comment détecter des problèmes connus (article en anglais) : https://linqto.me/perfaspnet

En espérant que cet article vous soit utile.
@ Bientôt
Sylvain Lecerf et l'équipe du support IIS Microsoft France