健全狀況服務錯誤
適用於︰Windows Server 2016
什麼是錯誤
「健全狀況服務」會持續監視您的「儲存空間直接存取」叢集,以偵測問題並產生「錯誤」。 有一個新的 Cmdlet 可顯示任何目前的錯誤,讓您能輕鬆驗證部署的健康狀況,而不需要輪流查看每個項目或功能。 「錯誤」是以精確、容易理解,及可採取動作為設計目標。
每個「錯誤」都包含五個重要欄位︰
- 嚴重性
- 問題描述
- 解決此問題的下一個建議步驟
- 錯誤實體的識別資訊
- 它的實體位置 (若可用)
例如,以下是一個典型的錯誤︰
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
注意
實體位置是衍伸自您的容錯網域組態。 如需容錯網域的詳細資訊,請參閱 Windows Server 2016 中的容錯網域。 如果您未提供這項資訊,則位置欄位的實用性會較低 - 例如,它可能只會顯示插槽編號。
根本原因分析
「健全狀況服務」就能夠評估錯誤實體之間可能的因果關係,以識別並結合因相同根本問題而產生的錯誤。 藉由辨識相關聯的影響,可以讓報告較為簡潔。 例如,如果伺服器已關閉,伺服器內的任何磁碟機預期也都會失去連線。 因此,只會針對根本原因引發一個「錯誤」- 在此案例為該伺服器。
PowerShell 中的使用方式
若要查看在 PowerShell 中的任何目前的「錯誤」,請執行此 Cmdlet:
Get-StorageSubSystem Cluster* | Debug-StorageSubSystem
這會傳回任何影響整體「儲存空間直接存取」叢集的「錯誤」。 在大多數情況下,這些錯誤是與硬體或組態有關。 如果沒有「錯誤」,這個 Cmdlet 就不會傳回任何項目。
注意
您可以在非生產環境中,自行透過觸發「錯誤」來實驗這項功能 (您必須自行承擔風險) - 例如,移除實體磁碟或關閉一個節點。 出現「錯誤」之後,重新插入實體磁碟或重新啟動該節點,「錯誤」就會再次消失。
您也可以使用以下 Cmdlet 檢視只影響特定磁碟區或檔案共用的「錯誤」:
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;
}
提供的使用者名稱應該是目標電腦的本機系統管理員。
建議您直接從使用者輸入即時建構 Password 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 等 Cmdlet 取得的相同物件。
您可以存取所有相同屬性,如存放管理 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());
}
查詢錯誤
叫用 [診斷],以取得目標 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,以便稍後用來關聯更新或移除通知,或在偵測到相同錯誤多次時進行重複資料刪除作業 (無論原因為何)。
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 在一個叢集的範圍內是唯一的。
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 中,「健全狀況服務」提供下列「錯誤」涵蓋範圍:
PhysicalDisk (8)
FaultType: Microsoft.Health.FaultType.PhysicalDisk.FailedMedia
- 嚴重性: 警告
- 原因:"實體磁碟出現錯誤。"
- RecommendedAction:"取代實體磁碟。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.LostCommunication
- 嚴重性: 警告
- 原因:"實體磁碟的連線已中斷。"
- RecommendedAction:"檢查實體磁碟是否正常運作與連接。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.Unresponsive
- 嚴重性: 警告
- 原因:"實體磁碟定期出現沒有反應的情況。"
- RecommendedAction:"取代實體磁碟。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.PredictiveFailure
- 嚴重性: 警告
- 原因:"實體磁碟預計很快就會故障。"
- RecommendedAction:"取代實體磁碟。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnsupportedHardware
- 嚴重性: 警告
- 原因:"實體因您的解決方案廠商不支援而遭到隔離。"
- RecommendedAction:"使用支援的硬體更換實體磁碟。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnsupportedFirmware
- 嚴重性: 警告
- 原因:"實體磁碟因您的解決方案廠商不支援其韌體版本而處於隔離狀態。"
- RecommendedAction:"將實體磁碟上的韌體更新至目標版本。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnrecognizedMetadata
- 嚴重性: 警告
- 原因:"實體磁碟有無法辨識的中繼資料。"
- RecommendedAction:"此磁碟可能包含未知存放集區的資料。請先確定此磁碟上沒有有用的資料,然後重設磁碟。"
FaultType: Microsoft.Health.FaultType.PhysicalDisk.FailedFirmwareUpdate
- 嚴重性: 警告
- 原因:"嘗試更新實體磁碟上的韌體失敗。"
- RecommendedAction:"嘗試使用不同的韌體二進位。"
虛擬磁碟 (2)
FaultType: Microsoft.Health.FaultType.VirtualDisks.NeedsRepair
- 嚴重性:告知性
- 原因:"此磁碟上的部分資料未完全復原。它仍可存取。"
- RecommendedAction:"恢復資料的復原能力。"
FaultType: Microsoft.Health.FaultType.VirtualDisks.Detached
- 嚴重性:重大
- 原因:"無法存取磁碟區。某些資料可能遺失。"
- RecommendedAction:"檢查所有儲存裝置的實體和/或網路連線能力。您可能需要從備份還原。"
集區容量 (1)
FaultType: Microsoft.Health.FaultType.StoragePool.InsufficientReserveCapacityFault
- 嚴重性: 警告
- 原因:"存放集區沒有建議的最小保留容量。這可能會使您在磁碟機故障時恢復資料復原能力的能力受限。"
- RecommendedAction:"請為存放集區新增額外容量或釋放容量。最小的建議保留容量隨著部署而異,但約需兩個磁碟機的容量。"
磁碟區容量 (2)1
FaultType: Microsoft.Health.FaultType.Volume.Capacity
- 嚴重性: 警告
- 原因:"磁碟區的可用空間不足。"
- RecommendedAction:"擴展磁碟區或將工作負載移轉至其他磁碟區。"
FaultType: Microsoft.Health.FaultType.Volume.Capacity
- 嚴重性:重大
- 原因:"磁碟區的可用空間不足。"
- RecommendedAction:"擴展磁碟區或將工作負載移轉至其他磁碟區。"
伺服器 (3)
FaultType: Microsoft.Health.FaultType.Server.Down
- 嚴重性:重大
- 原因:"無法連線到伺服器。"
- RecommendedAction:"啟動或更換伺服器。"
FaultType: Microsoft.Health.FaultType.Server.Isolated
- 嚴重性:重大
- 原因:"伺服器因連線能力問題而與叢集隔離。"
- RecommendedAction:"如果持續隔離,請檢查網路或將工作負載移轉至其他節點。"
FaultType: Microsoft.Health.FaultType.Server.Quarantined
- 嚴重性:重大
- 原因:"伺服器因反覆故障而遭到叢集隔離。"
- RecommendedAction:"請更換伺服器或修正網路。"
叢集 (1)
FaultType: Microsoft.Health.FaultType.ClusterQuorumWitness.Error
- 嚴重性:重大
- 原因:"叢集再有一個伺服器故障就會關機。"
- RecommendedAction:"請檢查見證資源,並視需要重新啟動。啟動或更換故障的伺服器。"
網路介面卡/介面 (4)
FaultType: Microsoft.Health.FaultType.NetworkAdapter.Disconnected
- 嚴重性: 警告
- 原因:"網路介面已中斷連線。"
- RecommendedAction:"重新連接網路線。"
FaultType: Microsoft.Health.FaultType.NetworkInterface.Missing
- 嚴重性: 警告
- 原因:"伺服器 {server} 連線到叢集網路 {cluster network} 的網路介面卡遺失。"
- RecommendedAction:"請將伺服器連線至遺失的叢集網路。"
FaultType: Microsoft.Health.FaultType.NetworkAdapter.Hardware
- 嚴重性: 警告
- 原因:"網路介面發生硬體故障。"
- RecommendedAction:"請更換網路介面卡。"
FaultType: Microsoft.Health.FaultType.NetworkAdapter.Disabled
- 嚴重性: 警告
- 原因:"尚未啟用且未使用網路介面 {network interface}。"
- RecommendedAction:"啟用網路介面。"
機箱 (6)
FaultType: Microsoft.Health.FaultType.StorageEnclosure.LostCommunication
- 嚴重性: 警告
- 原因:"存放裝置機箱已中斷通訊。"
- RecommendedAction:"啟動或更換存放裝置機箱。"
FaultType: Microsoft.Health.FaultType.StorageEnclosure.FanError
- 嚴重性: 警告
- 原因:"在存放裝置機箱位置 {position} 的風扇故障。"
- RecommendedAction:"更換存放裝置機箱中的風扇。"
FaultType: Microsoft.Health.FaultType.StorageEnclosure.CurrentSensorError
- 嚴重性: 警告
- 原因:"在存放裝置機箱位置 {position} 的電流感應器故障。"
- RecommendedAction:"更換存放裝置機箱中的電流感應器。"
FaultType: Microsoft.Health.FaultType.StorageEnclosure.VoltageSensorError
- 嚴重性: 警告
- 原因:"在存放裝置機箱位置 {position} 的電壓感應器故障。"
- RecommendedAction:"更換存放裝置機箱中的電壓感應器。"
FaultType: Microsoft.Health.FaultType.StorageEnclosure.IoControllerError
- 嚴重性: 警告
- 原因:"在存放裝置機箱位置 {position} 的 IO 控制器故障。"
- RecommendedAction:"更換在存放裝置機箱中的 IO 控制器。"
FaultType: Microsoft.Health.FaultType.StorageEnclosure.TemperatureSensorError
- 嚴重性: 警告
- 原因:"在存放裝置機箱位置 {position} 的溫度感應器故障。"
- RecommendedAction:"更換存放裝置機箱中的溫度感應器。"
韌體推出 (3)
FaultType: Microsoft.Health.FaultType.FaultDomain.FailedMaintenanceMode
- 嚴重性: 警告
- 原因:"目前無法在執行韌體推出時取得進展。"
- RecommendedAction:"驗證所有儲存空間全都狀況良好,且目前無容錯網域在維護模式下。"
FaultType: Microsoft.Health.FaultType.FaultDomain.FirmwareVerifyVersionFaile
- 嚴重性: 警告
- 原因:"韌體推出因在套用韌體更新後無法讀取或未預期的韌體版本資訊而遭到取消。"
- RecommendedAction:"在解決韌體問題後重新啟動韌體推出。"
FaultType: Microsoft.Health.FaultType.FaultDomain.TooManyFailedUpdates
- 嚴重性: 警告
- 原因:"韌體推出因過多實體磁碟嘗試韌體更新失敗而遭到取消。"
- RecommendedAction:"在解決韌體問題後重新啟動韌體推出。"
存放裝置 QoS (3)2
FaultType: Microsoft.Health.FaultType.StorQos.InsufficientThroughput
- 嚴重性: 警告
- 原因:"儲存體輸送量不足以滿足保留容量。"
- RecommendedAction:"重新設定存放裝置 QoS 原則。"
FaultType: Microsoft.Health.FaultType.StorQos.LostCommunication
- 嚴重性: 警告
- 原因:"存放裝置 QoS 原則管理員已中斷與磁碟區的通訊。"
- RecommendedAction:"請重新啟動節點 {nodes}"
FaultType: Microsoft.Health.FaultType.StorQos.MisconfiguredFlow
- 嚴重性: 警告
- 原因:"一個或更多儲存空間取用者 (通常是虛擬機器) 正在使用不存在的原則,ID 為 {id}。"
- RecommendedAction:"重新建立任何遺失的存放裝置 QoS 原則。"
1 表示磁碟區使用量已達到 80% (次要嚴重性) 或 90% (重大嚴重性)。 2 表示磁碟區上的某些 .vhd 在 24 小時的循環時間間隔內,有 10% (次要)、30% (重大)、或 50% (嚴重) 以上的時間未達其 IOPS 最小值。
注意
存放裝置機箱組件 (如風扇、電源供應器和感應器) 的健康情況是衍生自 SCSI 機箱服務 (SES)。 如果您的廠商沒有提供這項資訊,「健全狀況服務」就無法顯示它。