
Ich habe derzeit eine Anwendung in einem IIS-Cluster mit Lastausgleich (NLB) auf Server 2008 R2. Diese Anwendung nutzt einen veralteten Datenbankzugriffscode, der gelegentlich so stark ausfällt, dass der Anwendungspool deaktiviert wird.
Ich möchte einen WMI-Ereignisbeobachter implementieren, der die Statusänderungen des App-Pools überwacht (andere Vorschläge sind willkommen), der den App-Pool neu startet, wenn er in den gestoppten Zustand wechselt.
Dies dient als vorübergehende Problemumgehung, bis neuer Code gepusht werden kann, dieser muss jedoch einen Dev/QA/UAT-Zyklus durchlaufen.
Es gibt eine WMI-Klasse für den Anwendungspool im Namespace „root\webadministration“. Um den Status abzurufen, müssen Sie jedoch die Methode „GetState“ für dieses Objekt aufrufen. Daher bin ich nicht sicher, wie ich das mit einem WMI-Ereignis überwachen kann.
Antwort1
Dies ist möglicherweise mit der integrierten Ereignisprotokollüberwachung möglich.
Wenn der Anwendungspool aufgrund des schnellen Ausfallschutzes heruntergefahren wird, befindet sich im Systemereignisprotokoll wahrscheinlich eine Ereignis-ID 5002 wie die folgende:
„Der Anwendungspool ‚AppPoolName‘ wird aufgrund einer Reihe von Fehlern in den Prozessen, die diesen Anwendungspool bedienen, automatisch deaktiviert.“
Erstellen Sie eine geplante Aufgabe für einen benutzerdefinierten Ereignisprotokolltrigger. Eine manuelle XML-Abfrage würde etwa so aussehen:
<QueryList>
<Query Id="0" Path="System">
<Select Path="System">*[System[Provider[@Name='Microsoft-Windows-WAS'] and (EventID=5002)]]
and *[EventData[Data[@Name='AppPoolID'] and (Data='YourAppPoolFriendlyName')]]</Select>
</Query>
</QueryList>
Ihre geplante Task-Aktion könnte darin bestehen, ein Skript auszuführen, das appcmd ausführt, um den spezifischen Anwendungspool neu zu starten.
appcmd recycle apppool /?
Recycle application pool
APPCMD recycle APPPOOL <identifier> <-parameter1:value1 ...>
Recycles the specified application pool, recycling its the worker processes.
The exact application pool identifier must be provided and must resolve to an
existing application pool.
Supported parameters:
identifier (required)
Application pool name of the application pool to recycle
/apppool.name
Application pool name of the application pool to recycle (same as
identifier)
Examples:
appcmd recycle apppool "MyAppPool"
Recycle the application pool "MyAppPool".
Wenn Sie mehrere Anwendungspools auf demselben Server haben, müssen Sie möglicherweise den XML-Filter verfeinern, um die Anwendungspool-ID anzugeben. Hier ist ein Beispiel für einen XML-Ereignistext:
- <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
- <System>
<Provider Name="Microsoft-Windows-WAS" Guid="{524B5D04-133C-4A62-8362-64E8EDB9CE40}" EventSourceName="WAS" />
<EventID Qualifiers="49152">5002</EventID>
<Version>0</Version>
<Level>2</Level>
<Task>0</Task>
<Opcode>0</Opcode>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2012-10-01T19:41:43.000000000Z" />
<EventRecordID>408764</EventRecordID>
<Correlation />
<Execution ProcessID="0" ThreadID="0" />
<Channel>System</Channel>
<Computer>WEBSERVERNAME.company.com</Computer>
<Security />
</System>
- <EventData>
<Data Name="AppPoolID">YourAppPoolFriendlyName</Data>
<Binary />
</EventData>
</Event>
Informationen zur erweiterten Filterung des Ereignisprotokolls:
https://blogs.technet.com/b/askds/archive/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer.aspx
Verwenden Sie APPCMD, um einen Anwendungspool wiederzuverwenden:
http://technet.microsoft.com/en-us/library/cc770764%28v=ws.10%29.aspx
Antwort2
Zu Ihrer Information: Wenn der Fehler aufgrund des schnellen Failover-Schutzes auftritt, können Sie diesen deaktivieren, anstatt auf Zehenspitzen darum herumzureden: