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


Получение журнала производительности кластера

Область применения: Azure Stack HCI версий 23H2 и 22H2; Windows Server 2022, Windows Server 2019

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

Использование в PowerShell

Используйте следующий командлет, чтобы получить метрики для всего кластера Локальные дисковые пространства:

Get-ClusterPerformanceHistory

Совет

Используйте псевдоним Get-ClusterPerf для сохранения некоторых нажатий клавиш.

Вы также можете получить метрики для одного конкретного тома или сервера:

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

Get-StorageNode -Name <Name> | Get-ClusterPerformanceHistory

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

В этих разделах показано, как подключиться к службе работоспособности, использовать обнаружение объектов и реализовать наблюдатель для запуска потоковой передачи метрик.

Подключение

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

Предоставленное имя пользователя должно быть локальным администратором целевого компьютера.

Рекомендуется создавать Password SecureString непосредственно из введенных пользователем данных в режиме реального времени, чтобы пароль никогда не сохранял в памяти в виде открытого текста. Это помогает устранить различные проблемы безопасности. Но на практике, построение его, как описано выше, является общим для создания прототипов целей.

Обнаружение объектов

Установив CimSession , вы можете запрашивать инструментарий управления Windows (WMI) в кластере.

Перед получением ошибок или метрик необходимо получить экземпляры нескольких соответствующих объектов. Сначала получите MSFT_StorageSubSystem, представляющее Локальные дисковые пространства в кластере. С его помощью можно получить все MSFT_StorageNode в кластере и каждый MSFT_Volume томов данных. Наконец, необходимо получить MSCluster_ClusterHealthService, саму службу работоспособности.

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 MSCluster_ClusterHealthService itself
    HealthService = session.QueryInstances(@"root\MSCluster", "WQL", "SELECT * FROM MSCluster_ClusterHealthService").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());
}

Вызовите GetMetric , чтобы начать потоковую передачу примеров курированного экспертом списка основных метрик на основе предоставленных имен метрик из параметра MetricName , которые собираются эффективно и динамически агрегируются между узлами с помощью встроенной логики для обнаружения членства в кластере. Примеры поступают на основе предоставленного интервала времени из параметра StreamName .

Полный список доступных метрик см. в статье Журнал производительности для Локальные дисковые пространства.

IObserver.OnNext()

В этом примере кода используется шаблон разработки наблюдателя для реализации наблюдателя, чей метод OnNext() вызывается при поступлении каждого нового примера метрик. Его метод OnCompleted() вызывается при завершении потоковой передачи. Например, вы можете использовать его для повторного создания потоковой передачи, так что она будет продолжаться бесконечно.

class MetricsObserver<T> : IObserver<T>
{
    public void OnNext(T Result)
    {
        // Cast
        CimMethodStreamedResult StreamedResult = Result as CimMethodStreamedResult;

        if (StreamedResult != null)
        {
            CimInstance Metric = (CimInstance)StreamedResult.ItemValue;
            Console.WriteLine("MetricName: " + Metric.CimInstanceProperties["MetricId"].Value);
            IEnumerable<CimInstance> Records = (IEnumerable<CimInstance>)Metric.CimInstanceProperties["Records"].Value;

            foreach (CimInstance Record in Records)
            {
                // Each Record has "TimeStamp" and "Value. For Illustration, just print the metric"
                Console.WriteLine(record.CimInstanceProperties["TimeStamp"] + ": " + record.CimInstanceProperties["Value"]);

            }

            // TODO: Whatever you want!
        }
    }
    public void OnError(Exception e)
    {
        // Handle Exceptions
    }
    public void OnCompleted()
    {
        // Reinvoke BeginStreamingMetrics(), defined in the next section
    }
}

Начало потоковой передачи

Определив наблюдатель, можно начать потоковую передачу.

Укажите целевой экземпляр CimInstance , для которого требуется задать область метрики. Это может быть кластер, любой узел или любой том.

Параметр count — это количество выборок до окончания потоковой передачи.

CimInstance Target = Cluster; // From among the objects discovered in DiscoverObjects()

public void BeginStreamingMetrics(CimSession Session, CimInstance HealthService, CimInstance Target)
{
    // Set Parameters
    CimMethodParametersCollection MetricsParams = new CimMethodParametersCollection();
    string[] metricNames = new string[] { "ClusterNode.Cpu.Usage,ClusterNode=RRN44-13-01", "ClusterNode.Cpu.Usage.Host,ClusterNode=RRN44-13-01" };
    MetricsParams.Add(CimMethodParameter.Create("MetricName", metricNames, CimType.StringArray, CimFlags.In));
    MetricsParams.Add(CimMethodParameter.Create("StreamName", "LastHour", CimType.String, CimFlags.In));

    // Enable WMI Streaming
    CimOperationOptions Options = new CimOperationOptions();
    Options.EnableMethodResultStreaming = true;
    // Invoke API
    CimAsyncMultipleResults<CimMethodResultBase> InvokeHandler;
    InvokeHandler = Session.InvokeMethodAsync(
        HealthService.CimSystemProperties.Namespace, HealthService, "GetMetric", MetricsParams, Options
        );
    // Subscribe the Observer
    MetricsObserver<CimMethodResultBase> Observer = new MetricsObserver<CimMethodResultBase>(this);
    IDisposable Disposeable = InvokeHandler.Subscribe(Observer);
}

Эти метрики можно визуализировать, хранить в базе данных или использовать любым способом.

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