Udostępnij za pośrednictwem


Uzyskiwanie historii wydajności klastra

Dotyczy: Azure Stack HCI, wersje 23H2 i 22H2; Windows Server 2022, Windows Server 2019

Usługa kondycji zmniejsza pracę wymaganą do uzyskania informacji o wydajności i pojemności na żywo z klastra Bezpośrednie miejsca do magazynowania. Jedno polecenie cmdlet udostępnia wyselekcjonowaną listę podstawowych metryk, które są zbierane wydajnie i agregowane dynamicznie w węzłach, z wbudowaną logiką 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 pobrać metryki dla całego klastra Bezpośrednie miejsca do magazynowania:

Get-ClusterPerformanceHistory

Porada

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

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

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

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

Użycie na platformie .NET i C#

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

Połącz

Aby wykonać zapytanie dotyczące usługi kondycji, należy ustanowić cimSession z klastrem. W tym celu potrzebne są pewne rzeczy, które są dostępne tylko w pełnej wersji platformy Microsoft .NET, co oznacza, że nie można tego zrobić bezpośrednio z poziomu aplikacji internetowej lub mobilnej. Przykłady kodu w tej sekcji używają języka C#, najprostszego wyboru 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 funkcji SecureString password bezpośrednio z danych wejściowych użytkownika w czasie rzeczywistym, dzięki czemu hasło nigdy nie jest przechowywane w pamięci w postaci zwykłego tekstu. Pomaga to wyeliminować różne problemy związane z zabezpieczeniami. Ale w praktyce konstruowanie go tak jak powyżej jest powszechne w celach prototypowych.

Odnajdywanie obiektów

Po ustanowieniu cimSession można wykonywać zapytania dotyczące instrumentacji zarządzania Windows (WMI) w klastrze.

Aby można było uzyskać błędy lub metryki, należy pobrać wystąpienia kilku odpowiednich obiektów. Najpierw pobierz MSFT_StorageSubSystem, która reprezentuje Bezpośrednie miejsca do magazynowania w klastrze. W tym celu można uzyskać każdy MSFT_StorageNode w klastrze i każdy MSFT_Volume woluminów danych. Na koniec musisz uzyskać MSCluster_ClusterHealthService, samą usługę kondycji.

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 są dostępne w programie PowerShell przy użyciu poleceń cmdlet, takich jak Get-StorageSubSystem, Get-StorageNode i Get-Volume.

Dostęp do wszystkich tych samych właściwości można uzyskać w temacie Klasy interfejsu API zarządzania magazynem.

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 metodę GetMetric , aby rozpocząć przesyłanie strumieniowe przykładów wyselekcjonowanej przez ekspertów listy podstawowych metryk na podstawie podanych nazw metryk z parametru MetricName , które są zbierane wydajnie i agregowane dynamicznie między węzłami z wbudowaną logiką wykrywania członkostwa w klastrze. Przykłady są dostarczane na podstawie podanego przedziału czasu z parametru StreamName .

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

IObserver.OnNext()

Ten przykładowy kod używa wzorca projektowania obserwatora do implementowania obserwatora, którego metoda OnNext() jest wywoływana po nadejściu każdej nowej próbki metryk. Metoda OnCompleted() jest wywoływana , jeśli/po zakończeniu przesyłania strumieniowego. Można na przykład użyć go do ponownego zainicjowania przesyłania strumieniowego, tak aby trwało bezterminowo.

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 zdefiniowaniu obserwatora można rozpocząć przesyłanie strumieniowe.

Określ docelową wartość CimInstance , do której mają być określone metryki. 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, w jaki można je zobaczyć.

Dodatkowa dokumentacja