Errores del Servicio de mantenimiento
Se aplica a: Windows Server 2016
¿Qué son los errores?
El Servicio de mantenimiento supervisa constantemente el clúster de Espacios de almacenamiento directo para detectar problemas y generar "errores". Un cmdlet nuevo muestra los errores actuales, lo que le permite comprobar fácilmente el estado de la implementación sin mirar cada una de las entidades o características. Los errores están diseñados para ser precisos, fáciles de entender y accionable.
Cada error contiene cinco campos importantes:
- severity
- Descripción del problema
- Pasos siguientes recomendados para solucionar el problema
- Información de identificación de la entidad con errores
- Su ubicación física (si procede)
Por ejemplo, este es un error habitual:
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
Nota
La ubicación física procede de la configuración del dominio de error. Para obtener más información sobre dominios de error, consulte Dominios de error en Windows Server 2016. Si no proporciona esta información, el campo de ubicación será menos útil, por ejemplo, puede mostrar solo el número de ranura.
Análisis de la causa raíz
El Servicio de mantenimiento puede evaluar la posible causalidad entre entidades con errores para identificar y combinar los errores que son consecuencia del mismo problema subyacente. Al reconocer las cadenas de efectos, habrá menos informes innecesarios. Por ejemplo, si un servidor está fuera de servicio, se espera que las unidades del servidor también estén sin conectividad. Por lo tanto, solo se provocará un único error para la causa principal, en este caso, el servidor.
Uso en PowerShell
Para ver los errores actuales en PowerShell, ejecute este cmdlet:
Get-StorageSubSystem Cluster* | Debug-StorageSubSystem
Se devuelven los errores que afectan al clúster general de Espacios de almacenamiento directo. A menudo, estos errores están relacionados con el hardware o la configuración. Si no hay ningún error, este cmdlet no devolverá nada.
Nota
En un entorno que no sea de producción y bajo su responsabilidad, puede desencadenar errores para experimentar con esta característica, por ejemplo, quitando un disco físico o apagando un nodo. Cuando aparezca el error, vuelva a insertar el disco físico o reinicie el nodo y el error desaparecerá.
También puede ver los errores que afectan solo a volúmenes específicos o a recursos compartidos de archivos con los cmdlets siguientes:
Get-Volume -FileSystemLabel <Label> | Debug-Volume
Get-FileShare -Name <Name> | Debug-FileShare
Esto devuelve los errores que afectan solo al volumen específico o al recurso compartido de archivos. A menudo, estos errores están relacionados con el planeamiento de capacidad, la resistencia de los datos o características como la calidad del servicio de almacenamiento o la réplica de almacenamiento.
Uso en .NET y C#
Conectar
Para consultar el Servicio de mantenimiento, deberá establecer el valor de CimSession con el clúster. Para ello, necesitará algunos elementos que solo están disponibles en la versión completa de .NET, lo que significa que no puede hacerlo directamente desde una aplicación móvil o web. En estos ejemplos de código se usa C#, la opción más sencilla para esta capa de acceso a datos.
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;
}
El nombre de usuario proporcionado debe ser un administrador local del equipo de destino.
Se recomienda construir PasswordSecureString directamente desde la entrada del usuario en tiempo real, para que la contraseña no se almacene nunca en memoria en texto no cifrado. Esto ayuda a mitigar diversos problemas de seguridad. Pero, en la práctica, construirlo tal como se ha mencionado anteriormente es algo frecuente para la creación de prototipos.
Detectar objetos
Una vez establecido CimSession, puede consultar Instrumental de administración de Windows (WMI) en el clúster.
Para poder obtener errores o métricas, primero debe obtener instancias de varios objetos pertinentes. En primer lugar, obtenga el objeto MSFT_StorageSubSystem que representa Espacios de almacenamiento directo en el clúster. Con este objeto, puede obtener cada MSFT_StorageNode del clúster y cada MSFT_Volume (los volúmenes de datos). Por último, también necesitará el objeto MSFT_StorageHealth, que es el propio Servicio de mantenimiento.
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();
}
Estos son los mismos objetos que se obtienen en PowerShell mediante cmdlets como Get-StorageSubSystem, Get-StorageNode y Get-Volume.
Puede acceder a todas las propiedades, documentadas en Clases de la API de administración de almacenamiento.
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());
}
Errores de consulta
Invoque Diagnose para obtener los errores actuales en el ámbito del elemento CimInstance de destino, que puede ser el clúster o cualquier volumen.
La lista completa de errores disponibles en cada ámbito de Windows Server 2016 está documentada más adelante.
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!
}
}
}
Opcional: clase MyFault
Puede que le interese construir y conservar su propia representación de los errores. Por ejemplo, esta clase MyFault almacena varias propiedades clave de errores, incluida FaultId, que se puede usar más adelante para asociar notificaciones de actualización o eliminación, o para realizar una desduplicación en caso de que se detecte el mismo error varias veces por el motivo que sea.
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));
}
La lista completa de propiedades de cada error (DiagnoseResult) está documentada más adelante.
Eventos de error
Cuando se crean, quitan o actualizan errores, el Servicio de mantenimiento genera eventos WMI. Son esenciales para mantener el estado de la aplicación sincronizado sin sondeos frecuentes y pueden ayudar con aspectos como determinar cuándo se envían alertas de correo electrónico, por ejemplo. Para suscribirse a estos eventos, este código de ejemplo usa de nuevo el modelo de diseño de observador.
En primer lugar, suscríbase a los eventos 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);
}
A continuación, implemente un observador cuyo método OnNext() se invoque cada vez que se genere un nuevo evento.
Cada evento contiene el elemento ChangeType, que indica si se crea, quita o actualiza un error, así como el elemento FaultId pertinente.
Además, contiene todas las propiedades de error en sí.
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
}
}
Descripción del ciclo de vida de los errores
Los errores no están diseñados para que el usuario los marque como "vistos" o los resuelva. Se crean cuando el Servicio de mantenimiento observa un problema y se quitan automáticamente solo cuando el Servicio de mantenimiento ya no observa el problema. En general, esto refleja que el problema se ha corregido.
Aun así, en algunos casos, el Servicio de mantenimiento podría volver a detectar errores (por ejemplo, después de una conmutación por error, como resultado de una conectividad intermitente, etc.). Por este motivo, podría tener sentido que conserve su propia representación de los errores, para que pueda realizar una desduplicación fácilmente. Esto es importante sobre todo si envía alertas por correo electrónico o equivalentes.
Propiedades de los errores
En esta tabla se presentan varias propiedades clave del objeto de error. Para ver el esquema completo, inspeccione la clase MSFT_StorageDiagnoseResult en storagewmi.mof.
Propiedad | Ejemplo |
---|---|
FaultId | {12345-12345-12345-12345-12345} |
FaultType | Microsoft.Health.FaultType.Volume.Capacity |
Motivo | "El volumen se está quedando sin espacio disponible." |
PerceivedSeverity | 5 |
FaultingObjectDescription | Contoso XYZ9000 S.N. 123456789 |
FaultingObjectLocation | Rack A06, RU 25, Ranura 11 |
RecommendedActions | {"Expandir el volumen.", "Migrar cargas de trabajo a otros volúmenes."} |
FaultId: único dentro del ámbito de un clúster.
PerceivedSeverity: PerceivedSeverity = { 4, 5, 6 } = { "Informativo", "Advertencia" y "Error" } o colores equivalentes, como azul, amarillo y rojo.
FaultingObjectDescription: información sobre la pieza de hardware, normalmente en blanco para objetos de software.
FaultingObjectLocation: información sobre la ubicación del hardware, normalmente en blanco para objetos de software.
RecommendedActions: lista de acciones recomendadas, que son independientes y no están en un orden determinado. Actualmente, esta lista suele tener una longitud de 1.
Propiedades de los eventos de error
En esta tabla se presentan varias propiedades clave del evento de error. Para ver el esquema completo, inspeccione la clase MSFT_StorageFaultEvent en storagewmi.mof.
Observe el elemento ChangeType, que indica si se crea, quita o actualiza un error, y el elemento FaultId. Un evento también contiene todas las propiedades del error afectado.
Propiedad | Ejemplo |
---|---|
ChangeType | 0 |
FaultId | {12345-12345-12345-12345-12345} |
FaultType | Microsoft.Health.FaultType.Volume.Capacity |
Motivo | "El volumen se está quedando sin espacio disponible." |
PerceivedSeverity | 5 |
FaultingObjectDescription | Contoso XYZ9000 S.N. 123456789 |
FaultingObjectLocation | Rack A06, RU 25, Ranura 11 |
RecommendedActions | {"Expandir el volumen.", "Migrar cargas de trabajo a otros volúmenes."} |
ChangeType ChangeType = { 0, 1, 2 } = { "Crear", "Quitar", "Actualizar" }.
Cobertura
En Windows Server 2016, el Servicio de mantenimiento proporciona la siguiente cobertura del error:
Disco físico (8)
FaultType: Microsoft.Health.FaultType.PhysicalDisk.FailedMedia
- Gravedad: advertencia
- Motivo: "Se produjo un error del disco físico."
- RecommendedAction: "Reemplazar el disco físico."
FaultType: Microsoft.Health.FaultType.PhysicalDisk.LostCommunication
- Gravedad: advertencia
- Motivo: "Se perdió la conectividad con el disco físico."
- RecommendedAction: "Comprobar que el disco físico funciona y está conectado correctamente."
FaultType: Microsoft.Health.FaultType.PhysicalDisk.Unresponsive
- Gravedad: advertencia
- Motivo: "El disco físico muestra falta de respuesta periódicamente."
- RecommendedAction: "Reemplazar el disco físico."
FaultType: Microsoft.Health.FaultType.PhysicalDisk.PredictiveFailure
- Gravedad: advertencia
- Motivo: "Es muy probable que se produzca un error del disco físico en poco tiempo."
- RecommendedAction: "Reemplazar el disco físico."
FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnsupportedHardware
- Gravedad: advertencia
- Motivo: "El disco físico está en cuarentena porque no es compatible con el proveedor de soluciones."
- RecommendedAction: "Reemplazar el disco físico por el hardware compatible."
FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnsupportedFirmware
- Gravedad: advertencia
- Motivo: "El disco físico está en cuarentena porque la versión de firmware no es compatible con el proveedor de soluciones."
- RecommendedAction: "Actualizar el firmware del disco físico a la versión de destino."
FaultType: Microsoft.Health.FaultType.PhysicalDisk.UnrecognizedMetadata
- Gravedad: advertencia
- Motivo: "El disco físico tiene metadatos no reconocidos."
- RecommendedAction: "Este disco puede contener datos de un grupo de almacenamiento desconocido. Asegurarse primero de que no haya ningún dato útil en este disco y, después, restablecer el disco."
FaultType: Microsoft.Health.FaultType.PhysicalDisk.FailedFirmwareUpdate
- Gravedad: advertencia
- Motivo: "Error al intentar actualizar el firmware en el disco físico."
- RecommendedAction: "Intentar usar un binario de firmware diferente."
Disco virtual (2)
FaultType: Microsoft.Health.FaultType.VirtualDisks.NeedsRepair
- Gravedad: informativo
- Motivo: "Algunos datos de este volumen no son totalmente resistentes y siguen siendo accesibles."
- RecommendedAction: "Restaurar la resistencia de los datos."
FaultType: Microsoft.Health.FaultType.VirtualDisks.Detached
- Gravedad: Crítico
- Motivo: "El volumen no es accesible. Es posible que se hayan perdido datos."
- RecommendedAction: "Comprobar la conectividad física o de red de todos los dispositivos de almacenamiento. Es posible que se tenga que restaurar desde la copia de seguridad."
Capacidad del grupo (1)
FaultType: Microsoft.Health.FaultType.StoragePool.InsufficientReserveCapacityFault
- Gravedad: advertencia
- Motivo: "El bloque de almacenamiento no tiene la capacidad de reserva mínima recomendada. Esto puede limitar su capacidad para restaurar la resistencia de datos en caso de errores de la unidad".
- Acción recomendada: "Agregue capacidad adicional al grupo de almacenamiento o libere capacidad. La reserva mínima recomendada varía según la implementación, pero se necesita aproximadamente la capacidad de 2 unidades".
Capacidad del volumen (2)1
FaultType: Microsoft.Health.FaultType.Volume.Capacity
- Gravedad: advertencia
- Motivo: "El volumen se está quedando sin espacio disponible."
- RecommendedAction: "Expandir el volumen o migrar las cargas de trabajo a otros volúmenes."
FaultType: Microsoft.Health.FaultType.Volume.Capacity
- Gravedad: Crítico
- Motivo: "El volumen se está quedando sin espacio disponible."
- RecommendedAction: "Expandir el volumen o migrar las cargas de trabajo a otros volúmenes."
Servidor (3)
FaultType: Microsoft.Health.FaultType.Server.Down
- Gravedad: Crítico
- Motivo: "No se puede acceder al servidor."
- RecommendedAction: "Iniciar o reemplazar el servidor."
FaultType: Microsoft.Health.FaultType.Server.Isolated
- Gravedad: Crítico
- Motivo: "El servidor está aislado del clúster debido a problemas de conectividad."
- RecommendedAction: "Si el aislamiento persiste, comprobar las redes o migrar las cargas de trabajo a otros nodos."
FaultType: Microsoft.Health.FaultType.Server.Quarantined
- Gravedad: Crítico
- Motivo: "El clúster pone el servidor en cuarentena debido a errores periódicos."
- RecommendedAction: "Reemplazar el servidor o corregir la red."
Clúster (1)
FaultType: Microsoft.Health.FaultType.ClusterQuorumWitness.Error
- Gravedad: Crítico
- Motivo: "Solo falta un error de servidor para que el clúster quede inactivo."
- RecommendedAction: "Comprobar el recurso de testigo y reiniciar según sea necesario. Iniciar o reemplazar los servidores con errores."
Adaptador de red/interfaz (4)
FaultType: Microsoft.Health.FaultType.NetworkAdapter.Disconnected
- Gravedad: advertencia
- Motivo: "La interfaz de red se ha desconectado."
- RecommendedAction: "Volver a conectar el cable de red."
FaultType: Microsoft.Health.FaultType.NetworkInterface.Missing
- Gravedad: advertencia
- Motivo: "El servidor {servidor} no tiene adaptadores de red conectados a la red de clúster {red de clúster}."
- RecommendedAction: "Conectar el servidor a la red de clúster que falta."
FaultType: Microsoft.Health.FaultType.NetworkAdapter.Hardware
- Gravedad: advertencia
- Motivo: "La interfaz de red ha tenido un error de hardware."
- RecommendedAction: "Reemplazar el adaptador de interfaz de red."
FaultType: Microsoft.Health.FaultType.NetworkAdapter.Disabled
- Gravedad: advertencia
- Motivo: "La interfaz de red {interfaz de red} no está habilitada y no se está utilizando."
- RecommendedAction: "Habilitar la interfaz de red."
Contenedor (6)
FaultType: Microsoft.Health.FaultType.StorageEnclosure.LostCommunication
- Gravedad: advertencia
- Motivo: "Se ha perdido la comunicación con el contenedor de almacenamiento."
- RecommendedAction: "Iniciar o reemplazar el contenedor de almacenamiento."
FaultType: Microsoft.Health.FaultType.StorageEnclosure.FanError
- Gravedad: advertencia
- Motivo: "Error de ventilador en la posición {posición} del contenedor de almacenamiento."
- RecommendedAction: "Reemplazar el ventilador del contenedor de almacenamiento."
FaultType: Microsoft.Health.FaultType.StorageEnclosure.CurrentSensorError
- Gravedad: advertencia
- Motivo: "Error de sensor de corriente en la posición {posición} del contenedor de almacenamiento."
- RecommendedAction: "Reemplazar un sensor de corriente del contenedor de almacenamiento."
FaultType: Microsoft.Health.FaultType.StorageEnclosure.VoltageSensorError
- Gravedad: advertencia
- Motivo: "Error de sensor de voltaje en la posición {posición} del contenedor de almacenamiento."
- RecommendedAction: "Reemplazar un sensor de voltaje del contenedor de almacenamiento."
FaultType: Microsoft.Health.FaultType.StorageEnclosure.IoControllerError
- Gravedad: advertencia
- Motivo: "Error de controlador de E/S en la posición {posición} del contenedor de almacenamiento."
- RecommendedAction: "Reemplazar un controlador de E/S del contenedor de almacenamiento."
FaultType: Microsoft.Health.FaultType.StorageEnclosure.TemperatureSensorError
- Gravedad: advertencia
- Motivo: "Error de sensor de temperatura en la posición {posición} del contenedor de almacenamiento."
- RecommendedAction: "Reemplazar un sensor de temperatura del contenedor de almacenamiento."
Lanzamiento de firmware (3)
FaultType: Microsoft.Health.FaultType.FaultDomain.FailedMaintenanceMode
- Gravedad: advertencia
- Motivo: "No se puede seguir adelante en estos momentos mientras se realiza el lanzamiento del firmware."
- RecommendedAction: "Comprobar que todos los espacios de almacenamiento estén en buen estado y que ningún dominio de error esté actualmente en el modo de mantenimiento."
FaultType: Microsoft.Health.FaultType.FaultDomain.FirmwareVerifyVersionFaile
- Gravedad: advertencia
- Motivo: "La implementación del firmware se canceló debido a información de versión de firmware ilegible o inesperada después de aplicar una actualización de firmware."
- RecommendedAction: "Reiniciar el lanzamiento del firmware una vez resuelto el problema de firmware."
FaultType: Microsoft.Health.FaultType.FaultDomain.TooManyFailedUpdates
- Gravedad: advertencia
- Motivo: "La implementación del firmware se canceló debido a que hay demasiados discos físicos que no pueden actualizar el firmware."
- RecommendedAction: "Reiniciar el lanzamiento del firmware una vez resuelto el problema de firmware."
QoS de almacenamiento (3)2
FaultType: Microsoft.Health.FaultType.StorQos.InsufficientThroughput
- Gravedad: advertencia
- Motivo: "El rendimiento de almacenamiento no es suficiente para satisfacer las reservas."
- RecommendedAction: "Reconfigurar las directivas de QoS de almacenamiento."
FaultType: Microsoft.Health.FaultType.StorQos.LostCommunication
- Gravedad: advertencia
- Motivo: "El administrador de directivas de QoS de almacenamiento perdió la comunicación con el volumen."
- RecommendedAction: "Reiniciar los nodos {nodos}"
FaultType: Microsoft.Health.FaultType.StorQos.MisconfiguredFlow
- Gravedad: advertencia
- Motivo: "Uno o varios consumidores de almacenamiento (normalmente las máquinas virtuales) están usando una directiva con el identificador {identificador} que no existe."
- RecommendedAction: "Volver a crear las directivas de QoS de almacenamiento faltantes."
1 Indica que se ha alcanzado el volumen total de 80 % (gravedad menor) o del 90 % (gravedad mayor). 2 Indica que algunos archivos .vhd en el volumen no cumplen sus IOPS mínimos sobre el 10 % (menor), 30 % (principal) o 50 % (crítico) de la ventana de 24 horas continua.
Nota
El mantenimiento de los componentes de contenedor de almacenamiento como ventiladores, fuentes de alimentación y sensores proviene de SCSI Enclosure Services (SES). Si el proveedor no proporciona esta información, el servicio de mantenimiento no puede mostrarla.