単一のサーバーが、リサイクルしようとしたときにゾンビw3wp.exeプロセスを離れる場合があります。新しいプロセスが適切に生成され、古いプロセスがまだ存在してメモリを消費していることを除いて、すべてが機能しているように見えます。タスクマネージャは、通常40〜70のスレッドを持つアクティブなスレッドからはほど遠い、残りのスレッドは1つだけであると報告します。
ProcDumpを使用して、WinDbgでさらに分析するためにフルメモリダンプを取得しました。このマシンは、WinDbgが述べているように、Server 2008 R2 x648コアマシンです。
Windows 7 Version 7600 MP (8 procs) Free x64
Sosをロードした後、管理対象スレッドを印刷すると、次のことがわかります。
0:000> !threads
ThreadCount: 19
UnstartedThread: 0
BackgroundThread: 19
PendingThread: 0
DeadThread: 0
Hosted Runtime: no
PreEmptive Lock
ID OSID ThreadOBJ State GC GC Alloc Context Domain Count APT Exception
XXXX 1 9d0 000000000209b4c0 8220 Enabled 0000000000000000:0000000000000000 000000000208e770 0 Ukn
XXXX 2 c60 00000000020c3130 b220 Enabled 000000013fbe5ed0:000000013fbe7da8 000000000208e770 0 MTA (Finalizer)
XXXX 3 a24 00000000020f0d60 880a220 Enabled 0000000000000000:0000000000000000 000000000208e770 0 MTA (Threadpool Completion Port)
XXXX 4 97c 0000000002105180 80a220 Enabled 0000000000000000:0000000000000000 000000000208e770 0 MTA (Threadpool Completion Port)
XXXX 5 c28 000000000210bfe0 1220 Enabled 0000000000000000:0000000000000000 000000000208e770 0 Ukn
XXXX 6 d40 00000000053f9080 180b220 Enabled 00000001bfe75d20:00000001bfe767c8 000000000208e770 0 MTA (Threadpool Worker)
XXXX 7 c18 00000000053f9b30 180b220 Enabled 00000000fff95880:00000000fff97210 000000000208e770 0 MTA (Threadpool Worker)
XXXX 8 f7c 00000000053fa5e0 180b220 Enabled 000000011fbea268:000000011fbea920 000000000208e770 0 MTA (Threadpool Worker)
XXXX 9 91c 00000000053fb090 180b220 Enabled 00000001dfc39138:00000001dfc39670 000000000208e770 0 MTA (Threadpool Worker)
XXXX a fb0 00000000053fbd20 180b220 Enabled 00000000fff922b0:00000000fff93210 000000000208e770 0 MTA (Threadpool Worker)
XXXX b fc8 00000000053fc9b0 180b220 Enabled 0000000160053ea0:0000000160054778 000000000208e770 0 MTA (Threadpool Worker)
XXXX c 538 00000000053fd460 180b220 Enabled 000000017fd8fc98:000000017fd911f8 000000000208e770 0 MTA (Threadpool Worker)
XXXX d 604 00000000053fdf10 180b220 Enabled 000000019fd7aa78:000000019fd7c648 000000000208e770 0 MTA (Threadpool Worker)
0 f 2cc 0000000005514c60 220 Enabled 0000000000000000:0000000000000000 000000000208e770 0 Ukn
XXXX 10 9bc 00000000020a90c0 220 Enabled 0000000000000000:0000000000000000 000000000208e770 0 Ukn
XXXX 11 9c0 00000000056b7a00 220 Enabled 0000000000000000:0000000000000000 000000000208e770 0 Ukn
XXXX e 9d4 00000000056b7fd0 220 Enabled 0000000000000000:0000000000000000 000000000208e770 0 Ukn
XXXX 12 9d8 00000000056b85a0 220 Enabled 0000000000000000:0000000000000000 000000000208e770 0 Ukn
XXXX 13 cb8 00000000056b8b70 220 Enabled 0000000000000000:0000000000000000 000000000208e770 0 Ukn
ただし、さらに興味深いのは、残っている単一のアンマネージスレッドのスタックバックトレースの出力です。
0:000> ~* kb 2000
. 0 Id: 85c.2cc Suspend: -1 Teb: 000007ff`fffd3000 Unfrozen
RetAddr : Args to Child : Call Site
000007fe`fdcc1843 : 00000000`00fd6b60 00000000`00fd6b60 ffffffff`ffffffff 00000000`77bc04a0 : ntdll!ZwClose+0xa
00000000`77ab2c41 : 00000000`77bc1670 00000000`00000000 00000000`77bc04a0 7fffffff`ffffffff : KERNELBASE!CloseHandle+0x13
000007fe`f56537c6 : 00000000`00000000 00000000`00000000 00000000`012da080 000007fe`f5442eac : kernel32!CloseHandleImplementation+0x3d
000007fe`f54443d2 : 00000000`00000007 000007fe`f5443d3c 00000000`00000000 00000000`77bc9997 : httpapi!HttpCloseRequestQueue+0xa
000007fe`f54444c3 : 00000000`00000000 00000000`012e6900 00000000`00000000 00000000`77bd5afa : w3dt!UL_APP_POOL::Cleanup+0x62
000007fe`f549384a : 00000000`012da080 00000000`00c93a28 00000000`012e6900 00000000`00000000 : w3dt!WP_CONTEXT::CleanupOutstandingRequests+0x83
000007fe`f549417a : 00000000`00000000 00000000`0000ffff 00000000`00000000 00000000`77bcf9fd : iiscore!W3_SERVER::StopListen+0x4a
000007fe`f562b5bf : 00000000`012d2f30 00000000`00000000 00000000`00000000 00000000`0000ffff : iiscore!IISCORE_PROTOCOL_MANAGER::StopListenerChannel+0x5a
000007fe`f5626e8f : 00000000`012d2f30 00000000`00000000 00000000`00424380 00000000`00000000 : w3wphost!LISTENER_CHANNEL_STOP_WORKITEM::ExecuteWorkItem+0x7b
00000000`77bcf8eb : 00000000`021782b0 00000000`021782b0 00000000`00000000 00000000`00000001 : w3wphost!W3WP_Host::ExecuteWorkItem+0xf
00000000`77bc9d9f : 00000000`00000000 00000000`012d2f30 00000000`00424380 00000000`010aa528 : ntdll!RtlpTpWorkCallback+0x16b
00000000`77aaf56d : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!TppWorkerThread+0x5ff
00000000`77be3281 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : kernel32!BaseThreadInitThunk+0xd
00000000`00000000 : 00000000`00000000 00000000`00000000 00000000`00000000 00000000`00000000 : ntdll!RtlUserThreadStart+0x1d
スタックトレースから、w3wpプロセスがシャットダウンしてクリーンアップタスクを実行しようとしていることは明らかですが、何らかの理由でntdll!ZwCloseがハングアップしています。変更なしで数日間ハングアップしました。メモリ使用量の増加に加えて、明らかな副作用もありません。
W3wpプロセスが常にハングアップするわけではなく、再現可能なパターンをまだ見つけていません。それまでの間、さらにデバッグするための提案はありますか?
印象的な研究。
RSCAをチェックして、そのアプリプールへのハンドルがまだあるかどうかを確認し、実行中のページがまだあるかどうかを確認できます。パターンやリードが出る場合があります。 IISのトップレベルでドリルダウンし、[ワーカープロセス]を開いて、アプリプールが表示されている場合はダブルクリックします。
新しいバージョンのWebサイトが展開されると同時に、問題が発生しましたか?
ワーカープロセスが閉じられると、オブジェクトはメモリから消去されます。オブジェクトが「ファイナライズ」/「破棄」されているときに実行されるコードを開発者が作成し、このコードが例外をスローした場合、オブジェクトはメモリから削除されません。メモリからすべてのオブジェクトを削除できない場合、ワーカープロセスのシャットダウンがブロックされる可能性があります。
それから、なぜそれが毎回起こらないのかという問題があります。このコードは、頻繁に使用されないシステムの一部に含まれている可能性があるため、この問題の原因となるオブジェクトのタイプが常に存在するとは限りません。
これをテストする方法は次のとおりです。
また、オブジェクトをクリーンアップするための特別なコードがあるかどうかを開発者に確認することもできます。
IIS 7.0では、WWWサービスはワーカープロセスを管理しなくなりました。代わりに、WWWサービスはHTTPリスナーHTTP.sysのリスナーアダプターです。リスナーアダプターとして、WWWサービスは主に構成を担当します。 HTTP.sys、構成が変更されたときにHTTP.sysを更新し、要求が要求キューに入ったときにWASに通知します。
このサーバーで具体的に何を実行していますか?アプリケーションプール、それらは統合モードですか、それともクラシックモードですか?