Configuration et analyse des évènements de recyclage IIS 6 & 7
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
cscript iisback.vbs /list
cscript iisback.vbs /backup /b sauvegadeAvantModification |
Cd C:\Windows\System32\inetsrv
appcmd list backup
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
cscript adsutil.vbs GET W3SVC/AppPools/LogEventOnRecycle
cscript adsutil.vbs SET W3SVC/AppPools/LogEventOnRecycle 255 |
Cd C:\Windows\System32\inetsrv
appcmd list CONFIG -section:system.applicationHost/applicationPools
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 : https://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