Q

Windows 2000 Serverでシャットダウンを実行したところ,一瞬画面が暗くなったものの,そのまま何も起こりませんでした。マウスでデスクトップをクリックしてみたところ,暗くなっていた画面も元に戻ってしまったので,何かアプリケーションを起動しようとしました。すると,図3のようなエラーが表示されており,確かにシャットダウン処理中のようです。

図3●このメッセージが表示されることからも,確かにシャットダウン処理中のようである


△ 図をクリックすると拡大されます
図4●シャットダウン時に記録されていた4つのシステム警告ログ
15分ほど待ったところ,突然シャットダウン処理が進み始め,完了しました。システム・ログを確認したところ,その15分間に同じような警告ログが多数記録されていました(図4)。一体何が起こっていたのでしょうか。


A

図4の4つの警告ログは,いずれもIRP(I/O要求パケット)のキャンセル処理がタイムアウト時間内に完了しなかったことを示すものです。IRPは,OSへのI/O要求を表現するカーネル内のデータ構造体で,カーネル内のI/Oシステム・コンポーネント間でIRPをやり取りしています。リードやライトなど,カーネルへのI/Oリクエストは,I/Oマネージャが作成するIRPを使用して処理されています

I/Oキャンセルが完了しないと300秒待機
 OSのシャットダウンなどでI/O処理をキャンセルする必要が生じた場合,IRPがポイントするドライバのキャンセル・ルーチンをコールして,1つのIRPに対して最大300秒(5分)完了を待ちます。デバイス・ドライバにキャンセル・ルーチンが実装されていて実際のキャンセル処理に時間がかかる場合,あるいはキャンセル・ルーチンがそもそも実装されていない場合には,300秒でタイムアウトが発生します。それから,I/OマネージャによりIRPが削除されます。

 300秒以上待つことになるのは,IRPの個数分,記録されているからです。すべてのIRPキャンセル処理が終了しないと,OSのシャットダウンは完了しません。このため,キャンセルが必要なIRP個数×300秒の間,シャットダウン処理が停止しているように見えます。

 図4の4つのシステム・ログに記録された時刻によると,

●\Device\Tape1に対して01:58:12と02:03:41(およそ5分間隔)
●\Device\Tape2に対して02:03:41と02:09:09(およそ5分間隔)

で,10分以上シャットダウン処理を待たされていたことになります。\Device\Tape1と\Device\Tape2の1回目のログ時刻に差があるのは,内部で何らかの同期処理が行われていたためだと考えられます。

 IRPのキャンセル処理が完了しなかった理由としては,ハードウエア的な問題である場合から,ドライバがそもそもI/Oキャンセル・ルーチンを実装していない場合まで,様々な原因が考えられます。システム・ログだけでは判断できませんが,警告ログのソースに記録されているデバイス・ドライバの提供ベンダーへ,ドライバがI/Oキャンセル・ルーチンを実装しているかを確認してください。実装していないのであれば,実行中のI/O処理をキャンセルするような動作を招かないよう運用で回避するしかありません。

小森博司