Поделиться через


Ошибки службы работоспособности

Область применения: Windows Server 2016

Что такое ошибки

Служба работоспособности постоянно отслеживает кластер Локальные дисковые пространства для обнаружения проблем и создания ошибок. Один новый командлет отображает все текущие ошибки, что позволяет легко проверить работоспособность развертывания, не глядя на каждую сущность или функцию в свою очередь. Все сообщения об ошибках дают точную информацию, которую легко понять и по которой можно выполнить конкретные действия.

Каждая ошибка содержит пять важных полей:

  • Важность
  • Описание проблемы
  • Рекомендуемые действия для устранения проблемы
  • Сведений об идентификации проблемной сущности
  • Физическое расположение (если применимо)

Вот пример распространенной ошибки:

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, выполните следующий командлет:

Get-StorageSubSystem Cluster* | Debug-StorageSubSystem

Это возвращает все ошибки, влияющие на общий кластер Локальные дисковые пространства. Чаще всего эти ошибки связаны с оборудованием или конфигурацией. Если ошибки отсутствуют, этот командлет не вернет ничего.

Примечание.

В нерабородной среде и при собственном риске вы можете экспериментировать с этой функцией, активировав ошибки самостоятельно, например, удалив один физический диск или завершив работу одного узла. После появления сбоя повторно вставьте физический диск или перезапустите узел, и ошибка исчезнет снова.

Кроме того, можно просмотреть ошибки, влияющие только на определенные тома или общие папки с помощью следующих командлетов:

Get-Volume -FileSystemLabel <Label> | Debug-Volume

Get-FileShare -Name <Name> | Debug-FileShare

Это возвращает все ошибки, влияющие только на определенный том или общий файловый ресурс. Чаще всего эти ошибки связаны с планированием емкости, устойчивостью данных или функциями, такими как качество службы хранилища или реплика хранилища.

Использование в .NET и C#

Связь

Чтобы запросить служба работоспособности, необходимо установить CimSession с кластером. Для этого вам потребуется некоторые вещи, доступные только в полной версии .NET, то есть вы не можете сделать это непосредственно из веб-приложения или мобильного приложения. Эти примеры кода будут использовать 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 (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.

Вы можете получить доступ ко всем тем же свойствам, которые описаны в классах 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 , указывающее, создается ли ошибка, удаляется или обновляется, а также соответствующий идентификатор сбоя.

Кроме того, они содержат все свойства самого сбоя.

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
    }
}

Общие сведения о жизненном цикле сбоя

Ошибки не должны быть помечены как "просмотренные" или разрешаются пользователем. Они создаются, когда служба работоспособности наблюдает за проблемой, и они удаляются автоматически и только когда служба работоспособности больше не могут наблюдать за проблемой. Как правило, это отражает, что проблема устранена.

Однако в некоторых случаях ошибки могут быть повторно обнаружены служба работоспособности (например, после отработки отказа или из-за периодических подключений и т. д.). По этой причине может потребоваться сохранить собственное представление ошибок, чтобы можно было легко дедупликировать. Это особенно важно при отправке оповещений электронной почты или эквивалента.

Свойства ошибок

В этой таблице представлено несколько ключевых свойств объекта сбоя. Для полной схемы проверьте класс MSFT_StorageDiagnoseResult в storagewmi.mof.

Свойство Пример
FaultId {12345-12345-12345-12345-12345}
FaultType Microsoft.Health.FaultType.Volume.Capacity
Причина "Том занимает свободное место".
Мнимая разверность 5
ОшибкаObjectDescription Contoso XYZ9000 S.N. 123456789
ОшибкаObjectLocation Стойка A06, RU 25, слот 11
Рекомендуемые действия {"Развернуть том". "Перенос рабочих нагрузок в другие тома".}

FaultId Unique в пределах одного кластера.

PerceivedSeverity PerceivedSeverity = { 4, 5, 6 } = { "Информационный", "Предупреждение" и "Ошибка" }, или эквивалентные цвета, такие как синий, желтый и красный.

Сведения о части faultingObjectDescription для оборудования, как правило, пустые для объектов программного обеспечения.

Сведения о расположении сбояObjectLocation для оборудования, обычно пустые для объектов программного обеспечения.

Список рекомендуемых действий, которые являются независимыми и не зависят от определенного порядка. Сегодня этот список часто имеет длину 1.

Свойства событий сбоя

В этой таблице представлено несколько ключевых свойств события сбоя. Для полной схемы проверьте класс MSFT_StorageFaultEvent в storagewmi.mof.

Обратите внимание на Параметр ChangeType, который указывает, создается ли ошибка, удаляется или обновляется, а также идентификатор сбоя. Событие также содержит все свойства затронутого сбоя.

Свойство Пример
ChangeType 0
FaultId {12345-12345-12345-12345-12345}
FaultType Microsoft.Health.FaultType.Volume.Capacity
Причина "Том занимает свободное место".
Мнимая разверность 5
ОшибкаObjectDescription Contoso XYZ9000 S.N. 123456789
ОшибкаObjectLocation Стойка A06, RU 25, слот 11
Рекомендуемые действия {"Развернуть том". "Перенос рабочих нагрузок в другие тома".}

ChangeType ChangeType = { 0, 1, 2 } = { "Create", "Remove", "Update" }.

Охват

В Windows Server 2016 служба работоспособности обеспечивает следующее покрытие сбоя:

PhysicalDisk (8)

FaultType: Microsoft.Health.FaultType.PhysicalDisk.FailedMedia

  • Серьезность : предупреждение.
  • Причина: "Сбой физического диска".
  • Рекомендуется: "Заменить физический диск".

FaultType: Microsoft.Health.FaultType.PhysicalDisk.LostCommunication

  • Серьезность : предупреждение.
  • Причина: "Подключение было потеряно на физический диск".
  • Рекомендуется: "Убедитесь, что физический диск работает и подключен должным образом".

FaultType: Microsoft.Health.FaultType.PhysicalDisk.Unresponsive

  • Серьезность : предупреждение.
  • Причина: "Физический диск демонстрирует повторяющуюся неответственность".
  • Рекомендуется: "Заменить физический диск".

FaultType: Microsoft.Health.FaultType.PhysicalDisk.PredictiveFailure

  • Серьезность : предупреждение.
  • Причина: "Сбой физического диска прогнозируется в ближайшее время".
  • Рекомендуется: "Заменить физический диск".

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

  • Серьезность : предупреждение.
  • Причина: "Не удалось обновить встроенное ПО на физическом диске".
  • Рекомендуется: "Попробуйте использовать другой двоичный файл встроенного ПО".

Виртуальный диск (2)

FaultType: Microsoft.Health.FaultType.VirtualDisks.NeedsRepair

  • Важность: информационное сообщение
  • Причина: "Некоторые данные по этому тому не полностью устойчивы. Она остается доступной".
  • RecommendedAction: "Восстановление устойчивости данных".

FaultType: Microsoft.Health.FaultType.VirtualDisks.Detached

  • Уровень серьезности: критический
  • Причина: "Том недоступен. Некоторые данные могут быть потеряны".
  • RecommendedAction: "Проверьте физическое и/или сетевое подключение всех устройств хранения. Возможно, потребуется восстановить данные из резервной копии".

Емкость пула (1)

FaultType: Microsoft.Health.FaultType.StoragePool.InsufficientReserveCapacityFault

  • Серьезность : предупреждение.
  • Причина: "Пул носителей не имеет минимально рекомендуемой емкости резервирования. Это может ограничить возможность восстановления устойчивости данных в случае сбоя диска".
  • Рекомендуется: "Добавить дополнительную емкость в пул носителей или освободить емкость. Минимальный рекомендуемый резерв зависит от развертывания, но составляет около 2 дисков.

Емкость тома (2)1

FaultType: Microsoft.Health.FaultType.Volume.Capacity

  • Серьезность : предупреждение.
  • Причина: "Объем выходит из свободного места".
  • Рекомендуется: "Развернуть том или перенести рабочие нагрузки на другие тома".

FaultType: Microsoft.Health.FaultType.Volume.Capacity

  • Уровень серьезности: критический
  • Причина: "Объем выходит из свободного места".
  • Рекомендуется: "Развернуть том или перенести рабочие нагрузки на другие тома".

Сервер (3)

FaultType: Microsoft.Health.FaultType.Server.Down

  • Уровень серьезности: критический
  • Причина: "Не удается достичь сервера".
  • RecommendedAction: "Пуск или замена сервера".

FaultType: Microsoft.Health.FaultType.Server.Isolated

  • Уровень серьезности: критический
  • Причина: "Сервер изолирован от кластера из-за проблем с подключением".
  • Рекомендуется: "Если изоляция сохраняется, проверьте сети или перенесите рабочие нагрузки на другие узлы".

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

  • Серьезность : предупреждение.
  • Причина: "Сетевой интерфейс {сетевой интерфейс} не включен и не используется".
  • RecommendedAction: "Включить сетевой интерфейс".

Корпус (6)

FaultType: Microsoft.Health.FaultType.StorageEnclosure.LostCommunication

  • Серьезность : предупреждение.
  • Причина: "Связь была потеряна в корпусе хранилища".
  • RecommendedAction: "Запуск или замена корпуса хранилища".

FaultType: Microsoft.Health.FaultType.StorageEnclosure.FanError

  • Серьезность : предупреждение.
  • Причина: "Сбой вентилятора в позиции {position} корпуса хранилища".
  • RecommendedAction: "Замените вентилятор в корпусе хранилища".

FaultType: Microsoft.Health.FaultType.StorageEnclosure.CurrentSensorError

  • Серьезность : предупреждение.
  • Причина: "Текущий датчик в позиции {положение} корпуса хранилища завершился сбоем".
  • RecommendedAction: "Замена текущего датчика в корпусе хранилища".

FaultType: Microsoft.Health.FaultType.StorageEnclosure.VoltageSensorError

  • Серьезность : предупреждение.
  • Причина: "Датчик напряжения в позиции {положение} корпуса хранилища завершился сбоем".
  • RecommendedAction: "Замена датчика напряжения в корпусе хранилища".

FaultType: Microsoft.Health.FaultType.StorageEnclosure.IoControllerError

  • Серьезность : предупреждение.
  • Причина: "Сбой контроллера ввода-вывода в позиции {position} корпуса хранилища".
  • RecommendedAction: "Замена контроллера ввода-вывода в корпусе хранилища".

FaultType: Microsoft.Health.FaultType.StorageEnclosure.TemperatureSensorError

  • Серьезность : предупреждение.
  • Причина: "Датчик температуры в позиции {положение} корпуса хранилища завершился сбоем".
  • RecommendedAction: "Замена датчика температуры в корпусе хранилища".

Развертывание встроенного ПО (3)

FaultType: Microsoft.Health.FaultType.FaultDomain.FailedMaintenanceMode

  • Серьезность : предупреждение.
  • Причина: "В настоящее время не удается добиться прогресса при развертывании встроенного ПО".
  • Рекомендуется: "Убедитесь, что все дисковые пространства работоспособны, и что домен сбоя в настоящее время не находится в режиме обслуживания".

FaultType: Microsoft.Health.FaultType.FaultDomain.FirmwareVerifyVersionFaile

  • Серьезность : предупреждение.
  • Причина: "Развертывание встроенного ПО было отменено из-за нечитаемых или непредвиденных сведений о версии встроенного ПО после применения обновления встроенного ПО".
  • Рекомендуется: "Перезапустите встроенное ПО после устранения проблемы встроенного ПО".

FaultType: Microsoft.Health.FaultType.FaultDomain.TooManyFailedUpdates

  • Серьезность : предупреждение.
  • Причина: "Развертывание встроенного ПО было отменено из-за слишком большого количества физических дисков, завершив попытку обновления встроенного ПО".
  • Рекомендуется: "Перезапустите встроенное ПО после устранения проблемы встроенного ПО".

Качество обслуживания хранилища (3)2

FaultType: Microsoft.Health.FaultType.StorQos.InsufficientThroughput

  • Серьезность : предупреждение.
  • Причина: "Пропускная способность хранилища недостаточно для удовлетворения резервов".
  • RecommendedAction: "Перенастройка политик качества обслуживания хранилища".

FaultType: Microsoft.Health.FaultType.StorQos.LostCommunication

  • Серьезность : предупреждение.
  • Причина: "Диспетчер политик качества обслуживания хранилища потерял связь с томом".
  • RecommendedAction: "Перезагрузите узлы {nodes}"

FaultType: Microsoft.Health.FaultType.StorQos.MisconfiguredFlow

  • Серьезность : предупреждение.
  • Причина: "Один или несколько потребителей хранилища (обычно Виртуальные машины) используют неисключаемую политику с идентификатором {id}".
  • RecommendedAction: "Повторно создайте отсутствующие политики качества обслуживания хранилища".

1 Указывает, что объем достиг 80 % полной (незначительный уровень серьезности) или 90 % полный (основной уровень серьезности). 2 Указывает, что некоторые виртуальные жесткие диски на томе не выполнили минимальное число операций ввода-вывода в секунду для более чем 10 % (незначительный), 30 % (основной) или 50 % (критически важный) в 24-часовом окне.

Примечание.

Работоспособность компонентов дисковой полки (вентиляторы, источников питания, датчики и т. п.) определяется по данным SCSI Enclosure Services (SES). Если поставщик не предоставляет эту информацию, служба работоспособности ее не отображает.

Дополнительные справочники