Introduction

IIS permet de recycler les processus hébergeant les applications exécutées par le serveur web (processus W3WP.EXE). Par défaut si un processus IIS est toujours actif, il sera recyclé après 1740 minutes (29h) d'activité. Ce paramétrage se trouve au niveau des propriétés avancées du pool d'application. Dans le cas d'IIS7, le paramétrage se présente comme suit :


Comme nous pouvons le constater, les critères de recyclages peuvent être variés (intervalle de temps, mémoire, nombre de requêtes…). Lorsqu'un recyclage survient, IIS génèrera par défaut une entrée dans le journal d'évènement système Windows sur un certain type d'évènement.

Exemple de paramétrage par défaut IIS7 :




Note : cette propriété n'est pas accessible depuis l'interface d'administration d'IIS6 mais il est possible d'obtenir une fonctionnalité équivalente en positionnant certaines propriétés de la métabase par le script "adsutil.vbs".

Comme nous pouvons le constater, il est possible de configurer IIS pour générer des informations sur de très nombreux évènements de recyclage. Dans IIS6, ce comportement peut-être paramétré à l'aide de la propriété suivante de la métabase : LogEventOnRecycle et dans IIS7 à l'aide de la section : system.applicationHost/applicationPools -applicationPoolDefaults.recycling.logEventOnRecycle.

Comment paramétrer IIS pour générer un message lors de tout recyclage

Avant de réaliser toute modification de configuration, nous recommandons de réaliser une sauvegarde de cette dernière ce qui vous permettra de faire, au besoin, un retour arrière. Pour sauvegarder votre configuration, utiliser les commandes suivantes selon votre version d'IIS :

IIS6

IIS7

Cd c:\inetpub\adminscripts

  • Pour lister les sauvegardes réalisées :

cscript iisback.vbs /list

  • Pour réaliser une sauvegarde :

cscript iisback.vbs /backup /b sauvegadeAvantModification

Cd C:\Windows\System32\inetsrv

  • Pour lister les sauvegardes réalisées :

appcmd list backup

  • Pour réaliser une sauvegarde :

appcmd add backup sauvegadeAvantModification

Pour générer un message lors de tout recyclage, utiliser les commandes suivantes selon votre version d'IIS :

IIS6

IIS7

Cd c:\inetpub\adminscripts

  • Pour récupérer la valeur configurée (par défaut 137) :

cscript adsutil.vbs GET W3SVC/AppPools/LogEventOnRecycle

  • Pour tracer tous les évènements de recyclage :

cscript adsutil.vbs SET W3SVC/AppPools/LogEventOnRecycle 255

Cd C:\Windows\System32\inetsrv

  • Pour récupérer la valeur configurée (par défaut 137) :

appcmd list CONFIG -section:system.applicationHost/applicationPools

  • Pour tracer tous les évènements de recyclage :

appcmd set CONFIG -section:system.applicationHost/applicationPools -applicationPoolDefaults.recycling.logEventOnRecycle:Time,Requests,Schedule,Memory,IsapiUnhealthy,OnDemand,ConfigChange,PrivateMemory

Si vous souhaitez que seuls certains évènements soient pris en compte sous IIS6, il vous faudra remplacer la valeur 255 par le « bitmask » approprié :

LogEventOnRecycle Configuration

Recycle Condition

Event ID

Metabase Property

Bitmask

Elapsed time

1074

AppPoolRecycleTime

1 (0x1)

Number of requests processed

1075

AppPoolRecycleRequests

2 (0x2)

Scheduled recycle

1076

AppPoolRecycleSchedule

4 (0x4)

Virtual memory consumed

1077

AppPoolRecycleMemory

8 (0x8)

ISAPI reported itself unhealthy

1078

AppPoolRecycleIsapiUnhealthy

16 (0x10)

Recycled on demand

1079

AppPoolRecycleOnDemand

32 (0x20)

Recycled due to configuration change

1080

AppPoolRecycleConfigChange

64 (0x40)

Private memory consumed

1117

AppPoolRecyclePrivateMemory

128 (0x80)

Avec IIS7 les EventID générés on été incrémentés de 4000 par exemple l'EventID 1009 deviens 5009.

Comment identifier les évènements de recyclage

Il est par la suite simple d'identifier quand et quels sont les évènements qui ont forcé IIS à recycler à l'aide l'outil LogParser : http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&displaylang=en .

Exemple de requête SQL permettant d'identifier ces évènements (requête inspirée de l'article : «Yes, We Recycle!...That Includes AppPools») :

Select top 100 to_string(TimeGenerated, 'MM/dd/yyyy hh:mm:ss') as dateTime,
case
EventID
when 1009 then 'IIS6-UnExpEnd'
when 5009 then 'IIS7-UnExpEnd'
when 1010 then 'IIS6-PingFail'
when 5010 then 'IIS7-PingFail'
when 1011 then 'IIS6-FatalComErr'
when 5011 then 'IIS7-FatalComErr'
when 1074 then 'IIS6-TimeLimit'
when 5074 then 'IIS7-TimeLimit'
when 1077 then 'IIS6-VMem'
when 5077 then 'IIS7-VMem'
when 1078 then 'IIS6-ISAPIUnHealth'
when 5078 then 'IIS7-ISAPIUnHealth'
when 1079 then 'IIS6-Admin'
when 5079 then 'IIS7-Admin'
when 1080 then 'IIS6-ConfigChange'
when 5117 then 'IIS7-PMem'
end as Reason

from \\localhost\System
where SourceName in ('W3SVC';'WAS') and
EventID in (1117;1080;1079;1078;1077;1074;1011;1010;1009;5117;5080;5079;5078;5077;5074;5011;5010;5009) and
TimeGenerated > to_timestamp('2008-01-01 00:01:01','yyyy-MM-dd hh:mm:ss')

Conclusion

Il est possible de configurer IIS pour qu'il génère un message lors de tout type de recyclage et d'identifier ces derniers avec l'outil LogParser. Conservez précieusement vos journaux Windows car ils contiennent des informations importantes sur l'état de santé de vos applications !

Julien Clauzel