Server サービス異常終了時に、クラスターサービスに与える影響と回避策について

こんにちは。Windows プラットフォーム サポートの加藤です。
本日は Server サービス異常終了時に、クラスターサービスに与える影響と回避策についてお伝えします。

 

・現象

CSV を使用したHyper-V クラスター環境で、突然 CSV のコーディネーター ノード以外のノードから CSV にアクセスできなくなり、仮想マシンが停止してしまうお問い合わせを多くいただいています。

また、ファイルサーバーをクラスター化している環境では、ファイル サーバー リソースが障害となりフェールオーバーするお問い合わせもいただいております。

これらの現象が発生した際、以下の Server サービスの予期せぬ停止イベントが記録されていることがあります。

 

 システム ログ
------------------
エラー,Service Control Manager,7031,,Server サービスは予期せぬ原因により終了しました。このサービスの終了は 1 回目です。次の修正操作が 60000 ミリ秒以内に実行されます: サービスの再開。
------------------

また、上記の Server サービスの予期せぬ停止イベント以外にも多数のサービスが停止したイベントが記録されます。
同時間帯には、アプリケーション ログに以下のようなエラーも記録されます。

 

アプリケーション ログ
例:
------------------
エラー,Application Error,1000,(100),"障害が発生しているアプリケーション名: svchost.exe_ProfSvc、バージョン: 6.1.7600.16385、タイム スタンプ: 0x4a5bc3c1
障害が発生しているモジュール名: wmiprvsd.dll、バージョン: 6.1.7601.17514、タイム スタンプ: 0x4ce7ca79
------------------

上記のアプリケーション エラーは、svchost.exe が、何らかの原因でクラッシュしたことを示しています。
svchost.exe は、OS内の各種サービスをホストする汎用的なプロセスで、ひとつの svchost.exe で複数のサービスを管理しています。
あるサービスの処理において異常が発生すると、svchost.exe 自体がクラッシュし、当該 svchost.exe によって起動されたサービスはすべて停止します。
そのため、このクラッシュが Server サービス以外のサービスの問題により発生しても、Server サービスも影響を受けてしまいます。

Server サービスが停止した場合には、CSV を正常に利用することができません。
その理由は、CSV のコーディネーターノード以外のノードから、CSV にアクセスする際には、コーディネーターノードとの SMB による通信が必要なためです。
Server サービスは、SMB 通信を提供するサービスであり、このサービスが停止すると、非コーディネーターノードから、CSV へのアクセスが一切できなくなります。

また、同様にファイルサーバー リソースも、Server サービスが停止するとアクセスができなくなり、クラスターの正常性チェックで異常が検出され、フェールオーバーが発生します。

根本原因を解決するには、svchost.exe がクラッシュした原因を追究する必要がありますが、原因が特定できるまでの間に現象が再発してしまうと、再び仮想マシンが停止し業務に影響が発生します。
そこで、他のサービスの問題で svchost.exe がクラッシュした際に CSV への影響を抑えるために、プロセスを分離する回避策があります。

 

・ホストプロセスの分離
前述のように、svchost.exe は複数のサービスを管理しています。
Server サービス以外のサービスの問題が、Server サービスに影響を与えないようにするには、ひとつの svchost.exe で Server サービスを管理するように構成を変更します。
これにより、Server サービスは、他のサービスの svchost.exe とは独立するため、他のサービスの問題に起因する svchost.exe のクラッシュの影響を受けなくなります。
なお、分離を実施することで svchost.exe プロセスがひとつ増えますが、もともと OS には複数の svchost.exe が存在しており、増えることでシステムに影響を与えることはありません。

 

- 手順
Server (LanmanServer) サービスにおけるホストプロセスの分離について

---------------------------------------------------------
(1) コマンド プロンプトから "Tasklist /svc" を実行し、Server (LanmanServer) サービスが含まれている svchost.exe を確認します。

実行例:
C:\>Tasklist /svc

イメージ名                     PID サービス
========================= ======== ============================================
System Idle Process              0 N/A
System                          4 N/A


svchost.exe                   1020 AeLookupSvc, Appinfo, AppMgmt, BDESVC,
                                   BITS, CertPropSvc, EapHost, gpsvc, hkmsvc,
                                   IKEEXT, iphlpsvc, LanmanServer, MMCSS,
                                   ProfSvc, Schedule, SENS, ShellHWDetection,
                                   Themes, wuauserv

 

(2) コマンドプロンプトから "sc config LanmanServer type= own" を実行します。

実行例:
C:\>sc config LanmanServer type= own
[SC] ChangeServiceConfig SUCCESS

 

(3) OS をリブートします。

 

(4) コマンドプロンプトから "Tasklist /svc" を実行し、LanmanServer サービスが他多数のサービスと分離して、単独のホストプロセスにロードされたことを確認します。

実行例:
Tasklist /svc

イメージ名                     PID サービス
========================= ======== ============================================
System Idle Process              0 N/A
System                          4 N/A


svchost.exe                   3136 LanmanServer


 

以上で分離作業は完了です。