クラスター ハートビート通信の失敗と OS の負荷について

*1 2013/12/15 VSS の修正プログラムの情報を追記しました。
こんにちは。Windows プラットフォーム サポートの加藤です。

Windows Server 2008 以降のクラスター環境において、OS の負荷が原因で、クラスター ハートビート通信が失敗するお問い合わせをいただくことがよくあります。
また、場合によっては、一部のノードのクラスター サービスが停止し、フェールオーバーが発生する場合があります。

クラスター ハートビート通信の詳細とハートビートのタイムアウト変更手順については、下記 Blog にてご紹介しているため、ここでは省略させていただきます。
フェールオーバー クラスターのハートビートについて
https://blogs.technet.com/b/askcorejp/archive/2012/03/22/3488080.aspx

クラスター ハートビート通信は、上記の Blog でも触れられているように、既定で 5 秒間通信が途絶えるとハートビート通信の失敗と判断され、エラーが記録されます。
「通信が途絶える」という点については、ネットワーク上の問題以外にも、OS の負荷が著しく増加した場合にハートビート パケットの送信が一定期間できなくなり、ハートビート通信が失敗と判断されることがあります。

ハートビートの通信を妨げる高負荷の原因としては様々な要因がありますが、弊社製品では VSS (Volume Shadow Copy Service) が、大容量のディスクに対し SnapShot を作成した際に、この問題が発生する事例が報告されております。Snapshot が作成されるタイミングとしては、該当ボリュームのバックアップを取得しようとした際や、共有フォルダのシャドウ コピーを有効にしている場合があります。
また、Windows Server 2012 では、重複除去機能を有効にした場合にも VSS が使用されます。

Snapshot 作成時には、一時的にボリュームに対する I/O を停止する必要があるため、できる限り高い優先度で素早く実行する必要があります。そのため、ハートビートなどの Snapshot 作成以外の処理が待たされ、結果としてハートビート通信が失敗する場合があります。 また Snapshot 対象のボリュームのサイズが大きければ大きいほど作成処理にかかる時間も長くなるため、結果としてハートビート通信の失敗が発生しやすくなります。

弊社ではこの問題を回避するために VSS の処理を見直し、Snapshot 作成時にほかの処理が待たされないよう変更しました。(2013年9月11日にリリース)
下記の公開情報で修正プログラムがダウンロードできますので、Snapshot 作成時にハートビート通信の失敗が発生している環境に適用し、現象が回避できるか確認をお願いいたします。

I/O failures occur when you create a snapshot for a large volume in Windows Server 2012 or Windows Server 2008 R2 SP1
https://support.microsoft.com/kb/2871085/en-us
※ Windows Server 2012 R2 ではすでにこの修正プログラムと同様の動作に変更されております。

上記修正プログラムは Windows Server 2008 R2 SP1 以降の OS のみ適用可能なため、それ以外の OS をご利用の場合や、上記修正プログラムで改善しない場合には、負荷を下げるか、ハートビートの閾値を大きくします。
VSS が負荷の原因であった場合には、Snapshot 作成にかかる時間を短くする必要があります。CPU など、ハードウェアをより高性能なものに変更するといった方法もありますが、それ以外の現実的な対処としては、対象のボリューム サイズを小さくすることです。トータルのサイズを小さくできない場合には、ボリュームを複数に分割し、それぞれの SnapShot 作成のタイミングをずらすことで回避可能です。

この現象を抑制するための最適なボリュームのサイズについては、実際にはハードウェアのスペックなどに依存するため、具体的なサイズをお伝えすることは難しいです。そのため、推奨するボリューム サイズや、上限サイズなども特に定義はしておりません。
参考情報といたしまして、弊社の事例にて、5 TB のボリュームの Snapshot 作成時にハートビート通信が失敗したという環境がございました。
なお、VSS 以外の負荷原因を特定するには、現象発生時のパフォーマンスログが調査に有効な情報となります。

ボリュームの分割が難しい場合や、VSS 以外の負荷で発生しており、その負荷を下げることができない場合には、負荷が発生する時間帯に、ハートビートの閾値と間隔を延ばしていただく回避策の実施をご検討ください。
バックアップなどの負荷がかかるジョブを実行する前に、ハートビートの閾値を延ばすコマンドを組み込んだバッチファイルをタスク スケジューラなどで実行し、ジョブ完了後に、閾値を元に戻すコマンドを組み込んだバッチファイルを実行する方法などが回避策として有効です。

また、最近では、仮想基盤上のゲストマシンで作成したゲストクラスターの環境で、仮想基盤側の負荷や障害により、クラスターを構成しているゲストマシンが一時的にスローダウンやハング状態に陥り、ハートビート通信が失敗する事例も多数報告されております。
そのため、仮想基盤上のゲストマシンでクラスターを構築している場合には、仮想基盤側の負荷の調査もお願いします。

ハートビートのタイムアウト値については推奨値はなく、環境に合わせて柔軟に変更可能ですので、OS やネットワーク負荷によるハートビート通信が失敗している環境では、適宜変更をお願いします。