运行状况服务报故障
适用于: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;
}
提供的用户名应为目标计算机的本地管理员。
建议你直接基于用户输入实时构造密码 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 中使用 cmdlet(如 Get-StorageSubSystem、Get-StorageNode 和 Get-Volume)得到的相同对象。
你可以访问记录在存储管理 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),稍后可使用这些属性来关联更新、移除通知或在出于任何原因多次检测到同一故障时删除重复故障。
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 |
Reason | “卷的可用空间不足。” |
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 |
Reason | “卷的可用空间不足。” |
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
- Severity:严重
- Reason:“卷无法访问。某些数据可能丢失。”
- RecommendedAction:“检查所有存储设备的物理和/或网络连接。你可能需要从备份中还原。”
池容量 (1)
故障类型:Microsoft.Health.FaultType.StoragePool.InsufficientReserveCapacityFault
- 严重性:警告
- 原因:“存储池没有建议的最小预留容量。这可能会限制你在驱动器发生故障时还原数据复原能力的能力。”
- 建议的操作:“将额外的容量添加到存储池,或者释放容量。建议的最小预留量因部署而异,但大约为 2 个驱动器的容量。”
卷容量 (2)1
FaultType:Microsoft.Health.FaultType.Volume.Capacity
- 严重性:警告
- Reason:“卷的可用空间不足。”
- RecommendedAction:“扩展卷或将工作负载迁移到其他卷。”
FaultType:Microsoft.Health.FaultType.Volume.Capacity
- 严重性:关键
- Reason:“卷的可用空间不足。”
- RecommendedAction:“扩展卷或将工作负载迁移到其他卷。”
服务器 (3)
FaultType:Microsoft.Health.FaultType.Server.Down
- Severity:严重
- Reason:“无法访问服务器。”
- RecommendedAction:“启动或更换服务器。”
FaultType:Microsoft.Health.FaultType.Server.Isolated
- Severity:严重
- Reason:“由于连接问题,服务器已与群集相隔离。”
- RecommendedAction:“如果隔离仍然存在,请检查网络或将工作负载迁移到其他节点。”
FaultType:Microsoft.Health.FaultType.Server.Quarantined
- Severity:严重
- Reason:“由于反复出现故障,服务器被群集隔离。”
- RecommendedAction:“更换服务器或修复网络。”
群集 (1)
FaultType:Microsoft.Health.FaultType.ClusterQuorumWitness.Error
- Severity:严重
- Reason:“群集只要出现一个服务器故障就会关闭。”
- 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:“验证是否所有存储空间都正常,并且当前没有容错域处于维护模式。”
故障类型: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:“一个或多个存储使用者(通常是虚拟机)正在使用 id 为 {id} 的不存在的策略。”
- RecommendedAction:“重新创建任何丢失的存储 QoS 策略。”
1 指示卷 80% 已满(次要严重性)或 90% 已满(主要严重性)。 2 指示卷上的某些 .vhd 尚未达到其最小 IOPS,超过 24 小时滚动时段的 10%(次要)、30%(主要)或 50%(严重)。
注意
存储机箱组件(如风扇、电源和传感器)的运行状况派生自 SCSI 机箱服务 (SES)。 如果你的供应商不提供此信息,运行状况服务不能对其进行显示。