ヘルス サービスの障害
適用先:Windows Server 2016
障害とは何か
ヘルス サービスは、記憶域スペース ダイレクト クラスターを常に監視し、問題を検出して "障害" を生成します。 1 つの新しいコマンドレットで現在の障害をすべて表示できるため、すべてのエンティティや機能を順番に確認することなく、展開の正常性を簡単に検証できます。 障害は正確で理解しやすく、意思決定に役立つように設計されています。
各障害には、5 つの重要なフィールドがあります。
- 重大度
- 問題の説明
- 問題への対処に推奨される次のステップ
- 障害が発生したエンティティの識別情報
- 物理的な場所 (該当する場合)
たとえば、一般的な障害は次のとおりです。
Severity: MINOR
Reason: Connectivity has been lost to the physical disk.
Recommendation: Check that the physical disk is working and properly connected.
Part: Manufacturer Contoso, Model XYZ9000, Serial 123456789
Location: Seattle DC, Rack B07, Node 4, Slot 11
Note
物理的な場所は、障害ドメインの構成から取得されます。 障害ドメインの詳細については、Windows Server 2016 での障害ドメインに関する記事を参照してください。 こうした情報を指定していない場合、スロット番号しか表示されないなどのように、場所フィールドがあまり役に立ちません。
根本原因分析
ヘルス サービスでは、障害が発生しているエンティティで潜在的な原因を評価し、同様の根本的な問題の結果である障害を特定して組み合わせることができます。 影響の連鎖を認識することにより、レポートに記載される分量が絞られます。 たとえば、サーバーがダウンしている場合、サーバー内のドライブも接続できないことが予想されます。 したがって、根本原因として示される障害は 1 つのみ、つまりこの場合はサーバーです。
PowerShell での使用法
PowerShell で現在のエラーを確認するには、次のコマンドレットを実行します。
Get-StorageSubSystem Cluster* | Debug-StorageSubSystem
記憶域スペース ダイレクト クラスター全体に影響を与える障害が返されます。 ほとんどの場合、このような障害は、ハードウェアまたは構成に関連します。 障害がない場合、このコマンドレットは何も返しません。
注
非運用環境では、ご自身の責任において自分で障害をトリガーする (物理ディスクを 1 つ除去する、ノードを 1 つシャットダウンするなど) ことによって、この機能を試すことができます。 障害が表示された後、物理ディスクを再び挿入したり、シャットダウンしたノードを再起動したりすると、障害は再び表示されなくなります。
次のコマンドレットを使用して、特定のボリュームまたはファイル共有のみに影響を与えている障害を表示することもできます。
Get-Volume -FileSystemLabel <Label> | Debug-Volume
Get-FileShare -Name <Name> | Debug-FileShare
指定したボリュームまたはファイル共有のみに影響する障害が返されます。 ほとんどの場合、これらの障害は、キャパシティ プランニング、データの回復性、または記憶域のサービスの品質や記憶域レプリカのような機能に関連しています。
.NET および C# での使用方法
接続する
ヘルス サービスに対してクエリを実行するには、クラスターとの CimSession を確立する必要があります。 これを行うには、完全な .NET でのみ利用できる一部の機能が必要になります。つまり、Web アプリやモバイル アプリからこれを直接簡単に行うことはできません。 これらのコード サンプルでは、このデータ アクセス層で最も単純な選択肢である C# を使用します。
using System.Security;
using Microsoft.Management.Infrastructure;
public CimSession Connect(string Domain = "...", string Computer = "...", string Username = "...", string Password = "...")
{
SecureString PasswordSecureString = new SecureString();
foreach (char c in Password)
{
PasswordSecureString.AppendChar(c);
}
CimCredential Credentials = new CimCredential(
PasswordAuthenticationMechanism.Default, Domain, Username, PasswordSecureString);
WSManSessionOptions SessionOptions = new WSManSessionOptions();
SessionOptions.AddDestinationCredentials(Credentials);
Session = CimSession.Create(Computer, SessionOptions);
return Session;
}
指定するユーザー名は、ターゲット コンピューターのローカル管理者である必要があります。
パスワード SecureString は、ユーザー入力からリアルタイムで直接構築するようにして、パスワードがクリア テキストでメモリに格納されないようにすることをお勧めします。 これは、さまざまなセキュリティの問題を軽減するために役立ちます。 ただし、実際には、ひな形作成の目的で上記のように構築するのが一般的です。
オブジェクトを検出します
CimSession が確立されると、クラスターの Windows Management Instrumentation (WMI) に対してクエリを実行できます。
障害またはメトリックを取得する前に、関連するいくつかのオブジェクトのインスタンスを取得する必要があります。 まず、クラスター上の記憶域スペース ダイレクトを表すMSFT_StorageSubSystem。 これを使用すると、クラスター内のすべての MSFT_StorageNode と、すべての MSFT_Volume (データ ボリューム) を取得できます。 最後に、MSFT_StorageHealth、つまりヘルス サービス自体も必要になります。
CimInstance Cluster;
List<CimInstance> Nodes;
List<CimInstance> Volumes;
CimInstance HealthService;
public void DiscoverObjects(CimSession Session)
{
// Get MSFT_StorageSubSystem for Storage Spaces Direct
Cluster = Session.QueryInstances(@"root\microsoft\windows\storage", "WQL", "SELECT * FROM MSFT_StorageSubSystem")
.First(Instance => (Instance.CimInstanceProperties["FriendlyName"].Value.ToString()).Contains("Cluster"));
// Get MSFT_StorageNode for each cluster node
Nodes = Session.EnumerateAssociatedInstances(Cluster.CimSystemProperties.Namespace,
Cluster, "MSFT_StorageSubSystemToStorageNode", null, "StorageSubSystem", "StorageNode").ToList();
// Get MSFT_Volumes for each data volume
Volumes = Session.EnumerateAssociatedInstances(Cluster.CimSystemProperties.Namespace,
Cluster, "MSFT_StorageSubSystemToVolume", null, "StorageSubSystem", "Volume").ToList();
// Get MSFT_StorageHealth itself
HealthService = Session.EnumerateAssociatedInstances(Cluster.CimSystemProperties.Namespace,
Cluster, "MSFT_StorageSubSystemToStorageHealth", null, "StorageSubSystem", "StorageHealth").First();
}
これらは、PowerShell で Get-StorageSubSystem、Get-StorageNode、および Get-Volume のようなコマンドレットを使用して取得するものと同じオブジェクトです。
Storage Management API クラスに記載されている、同じプロパティのすべてにアクセスできます。
using System.Diagnostics;
foreach (CimInstance Node in Nodes)
{
// For illustration, write each node's Name to the console. You could also write State (up/down), or anything else!
Debug.WriteLine("Discovered Node " + Node.CimInstanceProperties["Name"].Value.ToString());
}
障害のクエリ
Diagnose を呼び出して、クラスターまたはいずれかのボリュームであるターゲットの CimInstance にスコープ設定した現在のすべての障害を取得します。
Windows Server 2016 の各スコープで利用できる障害の完全な一覧については、以下で説明します。
public void GetFaults(CimSession Session, CimInstance Target)
{
// Set Parameters (None)
CimMethodParametersCollection FaultsParams = new CimMethodParametersCollection();
// Invoke API
CimMethodResult Result = Session.InvokeMethod(Target, "Diagnose", FaultsParams);
IEnumerable<CimInstance> DiagnoseResults = (IEnumerable<CimInstance>)Result.OutParameters["DiagnoseResults"].Value;
// Unpack
if (DiagnoseResults != null)
{
foreach (CimInstance DiagnoseResult in DiagnoseResults)
{
// TODO: Whatever you want!
}
}
}
省略可能: MyFault クラス
独自の障害表現を構築して保持することが理にかなっている場合もあります。 たとえば、この MyFault クラスには、FaultId などの障害のいくつかの重要なプロパティが格納されます。FaultId は、更新や削除通知を関連付けるためや、同じ障害が複数回検出された場合に重複除去するためなどの理由で後で使用できます。
public class MyFault {
public String FaultId { get; set; }
public String Reason { get; set; }
public String Severity { get; set; }
public String Description { get; set; }
public String Location { get; set; }
// Constructor
public MyFault(CimInstance DiagnoseResult)
{
CimKeyedCollection<CimProperty> Properties = DiagnoseResult.CimInstanceProperties;
FaultId = Properties["FaultId" ].Value.ToString();
Reason = Properties["Reason" ].Value.ToString();
Severity = Properties["PerceivedSeverity" ].Value.ToString();
Description = Properties["FaultingObjectDescription"].Value.ToString();
Location = Properties["FaultingObjectLocation" ].Value.ToString();
}
}
List<MyFault> Faults = new List<MyFault>;
foreach (CimInstance DiagnoseResult in DiagnoseResults)
{
Faults.Add(new Fault(DiagnoseResult));
}
各障害のプロパティの完全な一覧 (DiagnoseResult) を以下に示します。
障害イベント
障害が作成、削除、または更新されると、ヘルスサービス によって WMI イベントが生成されます。 これらは、頻繁にポーリングを行わなくてもアプリケーションの状態を同期するために不可欠であり、たとえば、電子メール アラートをいつ送信するかを決定するために役立ちます。 これらのイベントをサブスクライブするために、このサンプル コードではオブザーバー デザイン パターンを再度使用します。
まず、MSFT_StorageFaultEvent イベントにサブスクライブします。
public void ListenForFaultEvents()
{
IObservable<CimSubscriptionResult> Events = Session.SubscribeAsync(
@"root\microsoft\windows\storage", "WQL", "SELECT * FROM MSFT_StorageFaultEvent");
// Subscribe the Observer
FaultsObserver<CimSubscriptionResult> Observer = new FaultsObserver<CimSubscriptionResult>(this);
IDisposable Disposeable = Events.Subscribe(Observer);
}
次に、新しいイベントが生成されるたびに呼び出される OnNext() メソッドを持つオブザーバーを実装します。
各イベントには、障害が作成、削除、または更新されているかどうかを示す ChangeType と、関連する FaultId が含まれています。
さらに、障害自体のすべてのプロパティが含まれています。
class FaultsObserver : IObserver
{
public void OnNext(T Event)
{
// Cast
CimSubscriptionResult SubscriptionResult = Event as CimSubscriptionResult;
if (SubscriptionResult != null)
{
// Unpack
CimKeyedCollection<CimProperty> Properties = SubscriptionResult.Instance.CimInstanceProperties;
String ChangeType = Properties["ChangeType"].Value.ToString();
String FaultId = Properties["FaultId"].Value.ToString();
// Create
if (ChangeType == "0")
{
Fault MyNewFault = new MyFault(SubscriptionResult.Instance);
// TODO: Whatever you want!
}
// Remove
if (ChangeType == "1")
{
// TODO: Use FaultId to find and delete whatever representation you have...
}
// Update
if (ChangeType == "2")
{
// TODO: Use FaultId to find and modify whatever representation you have...
}
}
}
public void OnError(Exception e)
{
// Handle Exceptions
}
public void OnCompleted()
{
// Nothing
}
}
障害のライフサイクルを理解する
障害は、ユーザーによって "確認済み" または解決済みとしてマークされるものではありません。 これらはヘルス サービスによって問題が観察されたときに作成され、ヘルス サービスで問題が観察できなくなった場合にのみ自動的に削除されます。 これは通常、問題が修正されたことを示します。
ただし、場合によっては障害が ヘルス サービス によって (フェールオーバー後や断続的な接続などの理由で) 再検出される場合があります。 このため、障害の独自の表現を保持し、簡単に重複解除できるようにすることが理にかなっている場合があります。 これは、電子メール アラートまたは同等のアラートを送信する場合に特に重要です。
障害のプロパティ
次の表は、障害オブジェクトのいくつかの主要なプロパティを示しています。 完全なスキーマについては、storagewmi.mof 内の MSFT_StorageDiagnoseResult クラスを調べてください。
プロパティ | 例 |
---|---|
FaultId | {12345-12345-12345-12345-12345} |
FaultType | Microsoft.Health.FaultType.Volume.Capacity |
理由 | "ボリュームの空き領域が不足しています。" |
PerceivedSeverity | 5 |
FaultingObjectDescription | Contoso XYZ9000 S.N. 123456789 |
FaultingObjectLocation | ラック A06、RU 25、スロット 11 |
RecommendedActions | {"ボリュームを拡張してください。", "ワークロードを他のボリュームに移行してください。"} |
FaultId 1 つのクラスターのスコープ内で一意です。
PerceivedSeverity PerceivedSeverity = { 4, 5, 6 } = { "情報", "警告", "エラー" }、または青、黄、赤などの対応する色。
FaultingObjectDescription ハードウェアのパーツ情報。ソフトウェア オブジェクトの場合、通常は空白です。
FaultingObjectLocation ハードウェアの位置情報。ソフトウェア オブジェクトの場合、通常は空白です。
RecommendedActions 推奨されるアクションの一覧。これらは独立していて、特定の順序はありません。 現在、このリストの長さは通常は 1 です。
障害イベントのプロパティ
次の表は、障害イベントのいくつかの主要なプロパティを示しています。 完全なスキーマについては、storagewmi.mof 内の MSFT_StorageFaultEvent クラスを調べてください。
障害が作成、削除、または更新されているかどうかを示す ChangeType と、FaultId に注意してください。 イベントには、影響を受けた障害のすべてのプロパティも含まれます。
プロパティ | 例 |
---|---|
ChangeType | 0 |
FaultId | {12345-12345-12345-12345-12345} |
FaultType | Microsoft.Health.FaultType.Volume.Capacity |
理由 | "ボリュームの空き領域が不足しています。" |
PerceivedSeverity | 5 |
FaultingObjectDescription | Contoso XYZ9000 S.N. 123456789 |
FaultingObjectLocation | ラック A06、RU 25、スロット 11 |
RecommendedActions | {"ボリュームを拡張してください。", "ワークロードを他のボリュームに移行してください。"} |
ChangeType ChangeType = {0, 1, 2} = {"作成", "削除", "更新" }。
カバレッジ
Windows Server 2016 のヘルス サービスでは、次の障害が対象になります。
物理ディスク (8)
FaultType: Microsoft.Health.FaultType.PhysicalDisk.FailedMedia
- 重要度: 警告
- Reason: "物理ディスクに障害が発生しました。"
- RecommendedAction: "物理ディスクを交換してください。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.LostCommunication
- 重要度: 警告
- Reason: "物理ディスクとの接続が失われました。"
- RecommendedAction: "物理ディスクが動作していること、正しく接続されていることを確認してください。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.Unresponsive
- 重要度: 警告
- Reason: "物理ディスクで無応答が繰り返し発生しています。"
- RecommendedAction: "物理ディスクを交換してください。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.PredictiveFailure
- 重要度: 警告
- Reason: "物理ディスクで、間もなく障害が発生することが予想されます。"
- RecommendedAction: "物理ディスクを交換してください。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnsupportedHardware
- 重要度: 警告
- Reason: "物理ディスクは、ソリューション ベンダーによってサポートされていないため、検疫されています。"
- RecommendedAction: "物理ディスクを、サポートされているハードウェアに交換してください。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnsupportedFirmware
- 重要度: 警告
- Reason: "物理ディスクは、ファームウェアのバージョンがソリューション ベンダーによってサポートされていないため、検疫中です。"
- RecommendedAction: "物理ディスクのファームウェアをターゲット バージョンに更新してください。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnrecognizedMetadata
- 重要度: 警告
- Reason: "物理ディスクに、認識されていないメタデータがあります。"
- RecommendedAction: "このディスクには、不明な記憶域プールからのデータが含まれている可能性があります。まず、このディスクに有効なデータがないことを確認してから、ディスクをリセットしてください。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.FailedFirmwareUpdate
- 重要度: 警告
- Reason: "物理ディスク上のファームウェアの更新が失敗しました。"
- RecommendedAction: "別のファームウェア バイナリを使用してみてください。"
仮想ディスク (2)
FaultType: Microsoft.Health.FaultType.VirtualDisks.NeedsRepair
- 重大度 : 情報
- Reason: "このボリュームの一部のデータは完全回復性を備えていません。引き続きアクセスはできます。"
- RecommendedAction: "データの回復性の復元。"
FaultType: Microsoft.Health.FaultType.VirtualDisks.Detached
- 重大度: Critical
- Reason: "ボリュームにアクセスできません。一部のデータが失われる可能性があります。"
- RecommendedAction: "すべての記憶装置の物理的な接続またはネットワーク接続を確認してください。バックアップからの復元が必要になる場合があります。"
プール容量 (1)
FaultType: Microsoft.Health.FaultType.StoragePool.InsufficientReserveCapacityFault
- 重要度: 警告
- 理由: "記憶域プールには、推奨される最小予約容量がありません。これにより、ドライブで障害が発生した場合にデータの回復性を復元する機能が制限される可能性があります。"
- 推奨される操作: "記憶域プールに容量を追加するか、容量を解放します。推奨される最小予約はデプロイによって異なりますが、約 2 ドライブ分の容量に相当します。"
ボリューム容量 (2)1
FaultType: Microsoft.Health.FaultType.Volume.Capacity
- 重要度: 警告
- Reason: "ボリュームの空き領域が不足しています。"
- RecommendedAction: "ボリュームを拡張するか、ワークロードを他のボリュームに移行してください。"
FaultType: Microsoft.Health.FaultType.Volume.Capacity
- 重大度: Critical
- Reason: "ボリュームの空き領域が不足しています。"
- RecommendedAction: "ボリュームを拡張するか、ワークロードを他のボリュームに移行してください。"
サーバー (3)
FaultType: Microsoft.Health.FaultType.Server.Down
- 重大度: Critical
- Reason: "サーバーに接続できません。"
- RecommendedAction: "サーバーを起動または交換してください。"
FaultType: Microsoft.Health.FaultType.Server.Isolated
- 重大度: Critical
- Reason: "接続の問題により、サーバーはクラスターから分離されています。"
- RecommendedAction: "分離が解決しない場合、ネットワークを確認するかワークロードを他のノードに移行してください。"
FaultType: Microsoft.Health.FaultType.Server.Quarantined
- 重大度: Critical
- Reason: "サーバーは、障害が繰り返し発生しているため、クラスターによって検疫されました。"
- RecommendedAction: "サーバーを交換するか、ネットワークを修復してください。"
クラスター (1)
FaultType: Microsoft.Health.FaultType.ClusterQuorumWitness.Error
- 重大度: Critical
- Reason: "このクラスターはあと 1 台のサーバーで障害が発生すると停止します。"
- RecommendedAction: "監視リソースを確認し、必要に応じて再起動してください。失敗したサーバーを起動または交換してください。"
ネットワーク アダプター/インターフェイス (4)
FaultType: Microsoft.Health.FaultType.NetworkAdapter.Disconnected
- 重要度: 警告
- Reason: "ネットワーク インターフェイスが切断されました。"
- RecommendedAction: "ネットワーク ケーブルを再接続してください。"
FaultType: Microsoft.Health.FaultType.NetworkInterface.Missing
- 重要度: 警告
- Reason: "サーバー {server} に、クラスター ネットワーク {cluster network} に接続されているネットワーク アダプターがありません。"
- RecommendedAction: "切断されているクラスター ネットワークにサーバーを接続してください。"
FaultType: Microsoft.Health.FaultType.NetworkAdapter.Hardware
- 重要度: 警告
- Reason: "ネットワーク インターフェイスでハードウェア障害が発生しました。"
- RecommendedAction: "ネットワーク インターフェイス アダプターを交換してください。"
FaultType: Microsoft.Health.FaultType.NetworkAdapter.Disabled
- 重要度: 警告
- Reason: "ネットワーク インターフェイス {network interface} は有効ではなく、使用されていません。"
- RecommendedAction: "ネットワーク インターフェイスを有効にしてください。"
エンクロージャ(6)
FaultType: Microsoft.Health.FaultType.StorageEnclosure.LostCommunication
- 重要度: 警告
- Reason: "ストレージ エンクロージャへの通信が切断されました。"
- RecommendedAction: "ストレージ エンクロージャを起動または交換してください。"
FaultType: Microsoft.Health.FaultType.StorageEnclosure.FanError
- 重要度: 警告
- Reason: "記憶域エンクロージャの位置 {position} にあるファンに障害が発生しました。"
- RecommendedAction: "ストレージ エンクロージャのファンを交換してください。"
FaultType: Microsoft.Health.FaultType.StorageEnclosure.CurrentSensorError
- 重要度: 警告
- Reason: "ストレージ エンクロージャの位置 {position} にある電流センサーに障害が発生しました。"
- RecommendedAction: "ストレージ エンクロージャの電流センサーを交換してください。"
FaultType: Microsoft.Health.FaultType.StorageEnclosure.VoltageSensorError
- 重要度: 警告
- Reason: "ストレージ エンクロージャの位置 {position} にある電圧センサーに障害が発生しました。"
- RecommendedAction: "ストレージ エンクロージャの電圧センサーを交換してください。"
FaultType: Microsoft.Health.FaultType.StorageEnclosure.IoControllerError
- 重要度: 警告
- Reason: "ストレージ エンクロージャの位置 {position} にある IO コントローラーに障害が発生しました。"
- RecommendedAction: "ストレージ エンクロージャの IO コントローラーを交換してください。"
FaultType: Microsoft.Health.FaultType.StorageEnclosure.TemperatureSensorError
- 重要度: 警告
- Reason: "ストレージ エンクロージャの位置 {position} にある温度センサーに障害が発生しました。"
- RecommendedAction: "ストレージ エンクロージャの温度センサーを交換してください。"
ファームウェアのロールアウト (3)
FaultType: Microsoft.Health.FaultType.FaultDomain.FailedMaintenanceMode
- 重要度: 警告
- Reason: "現在、ファームウェア ロールアウトを実行中のため、進行状況を確認できません。"
- RecommendedAction: "すべてのストレージ スペースが正常であることと、現在、メンテナンス モードになっている障害ドメインがないことを確認してください。"
FaultType: Microsoft.Health.FaultType.FaultDomain.FirmwareVerifyVersionFaile
- 重要度: 警告
- Reason: "ファームウェアの更新プログラムを適用した後に、ファームウェア バージョン情報が読み取り不能または予期しないものであったため、ファームウェアのロールアウトが取り消されました。"
- RecommendedAction: "ファームウェアの問題が解決されたら、ファームウェアのロールアウトを再開してください。"
FaultType: Microsoft.Health.FaultType.FaultDomain.TooManyFailedUpdates
- 重要度: 警告
- Reason: "ファームウェアの更新の試行に失敗した物理ディスクの数が多すぎるため、ファームウェアのロールアウトが取り消されました。"
- RecommendedAction: "ファームウェアの問題が解決されたら、ファームウェアのロールアウトを再開してください。"
記憶域 QoS (3)2
FaultType: Microsoft.Health.FaultType.StorQos.InsufficientThroughput
- 重要度: 警告
- Reason: "予約に対処するには記憶域スループットが不十分です。"
- RecommendedAction: "記憶域 QoS ポリシーを再構成してください。"
FaultType: Microsoft.Health.FaultType.StorQos.LostCommunication
- 重要度: 警告
- Reason: "記憶域 QoS ポリシー マネージャーが、ボリュームと通信できなくなりました。"
- RecommendedAction: "ノード {nodes} を再起動してください"
FaultType: Microsoft.Health.FaultType.StorQos.MisconfiguredFlow
- 重要度: 警告
- Reason: "1 つ以上のストレージ コンシューマー (通常は仮想マシン) が、存在しない、id {id} のポリシーを使用しています。"
- RecommendedAction: "見つからない記憶域 QoS ポリシーを再作成してください。"
1 ボリューム容量が 80% に達した (重大度: マイナー) または 90% に達した (重大度: メジャー) ことを示します。 2 ボリュームの一部の .vhd の最小 IOPS が、直前の 24 時間のうち 10% (マイナー)、30% (メジャー)、または 50% (重大) の間満たされていないことを示します。
Note
ファン、電源、センサーなどのストレージ格納装置コンポーネントの正常性は、SCSI エンクロージャ サービス (SES) から取得されます。 この情報は、ベンダーから提供されていない場合はヘルス サービスで表示されません。