Uzyskiwanie historii wydajności klastra

Dotyczy: Azure Stack HCI, wersje 21H2 i 20H2; Windows Server 2022, Windows Server 2019

Dzięki Usługa kondycji pracy wymaganej do uzyskania informacji o wydajności i pojemności na żywo z klastra Miejsca do magazynowania Direct. Jedno polecenie cmdlet udostępnia listę najważniejszych metryk, które są skutecznie zbierane i agregowane dynamicznie między węzłami, z wbudowaną logiką do wykrywania członkostwa w klastrze. Wszystkie wartości są podawane w czasie rzeczywistym i w danym momencie.

Użycie w programie PowerShell

Użyj następującego polecenia cmdlet, aby uzyskać metryki dla całego Miejsca do magazynowania klastra bezpośredniego:

Get-ClusterPerformanceHistory

Porada

Użyj aliasu Get-ClusterPerf, aby zapisać kilka naciśnięć klawiszy.

Możesz również uzyskać metryki dla jednego określonego woluminu lub serwera:

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

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

Użycie na .NET i C #

W tych sekcjach przedstawiono sposób nawiązywania połączenia z Usługa kondycji, używania obiektów odnajdywania i implementowania obserwatora w celu rozpoczęcia przesyłania strumieniowego metryk.

Połącz

Aby odpytać Usługa kondycji, należy ustanowić cimSession z klastrem. W tym celu potrzebne są pewne rzeczy, które są dostępne tylko w trybie Microsoft .NET, co oznacza, że nie można tego łatwo zrobić bezpośrednio z aplikacji internetowej lub mobilnej. Przykłady kodu w tej sekcji używają języka C#, który jest najprostszym wyborem dla tej warstwy dostępu do danych.

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

Podana nazwa użytkownika powinna być administratorem lokalnym komputera docelowego.

Zalecamy konstruowanie obiektu Password SecureString bezpośrednio z danych wejściowych użytkownika w czasie rzeczywistym, tak aby hasło nigdy nie było przechowywane w pamięci w postaci zwykłego tekstu. Pomaga to ograniczyć różne problemy z zabezpieczeniami. Jednak w praktyce skonstruowanie go tak jak powyżej jest typowe dla celów tworzenia prototypów.

Odnajdywanie obiektów

Po nawiąźle programu CimSession możesz utworzyć zapytanie dotyczące Windows Management Instrumentation (WMI) w klastrze.

Zanim będzie można uzyskać błędy lub metryki, należy uzyskać wystąpienia kilku odpowiednich obiektów. Najpierw pobierz klaster MSFT_StorageSubSystem reprezentujący Miejsca do magazynowania Direct w klastrze. Dzięki tej funkcji można uzyskać MSFT_StorageNode klastra i MSFT_Volume woluminów danych. Na koniec musisz pobrać MSCluster_ClusterHealthService ,Usługa kondycji samą siebie.

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();
}

Są to te same obiekty, które można uzyskać w programie PowerShell przy użyciu poleceń cmdlet, takich jak Get-StorageSubSystem,Get-StorageNodei Get-Volume.

Dostęp do wszystkich tych samych właściwości można uzyskać, udokumentowane w te Storage interfejs API Zarządzanie Klasy.

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());
}

Wywołaj parametr GetMetric, aby rozpocząć próbki przesyłania strumieniowego z specjalistycznej listy najważniejszych metryk opartych na podanych nazwach metryk z parametru MetricName, które są zbierane wydajnie i dynamicznie agregowane między węzłami, z wbudowaną logiką wykrywania członkostwa klastra. Przykłady są dostarczane na podstawie podanego czasu z parametru StreamName.

Aby uzyskać pełną listę dostępnych metryk, zobacz Historia wydajności dla Miejsca do magazynowania Direct.

IObserver.OnNext()

Ten przykładowy kod używa wzorca projektowego obserwatora do zaimplementowania obserwatora, którego metoda OnNext() jest wywoływana po dotareniu każdej nowej próbki metryk. Jej metoda OnCompleted() jest wywoływana, jeśli/po zakończeniu przesyłania strumieniowego. Na przykład można go użyć do ponownego inituacji przesyłania strumieniowego, tak aby trwało przez czas nieokreślony.

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

Rozpoczynanie przesyłania strumieniowego

Po zdefiniowanym obserwatorze można rozpocząć przesyłanie strumieniowe.

Określ docelową wartość CimInstance, której zakres metryk ma być określony. Może to być klaster, dowolny węzeł lub dowolny wolumin.

Parametr count to liczba próbek przed zakończeniem przesyłania strumieniowego.

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

Te metryki można wizualizować, przechowywać w bazie danych lub używać w dowolny sposób.

Dodatkowa dokumentacja