Dela via


Hämta klusterprestandahistorik

Gäller för: Azure Stack HCI, versionerna 23H2 och 22H2; Windows Server 2022, Windows Server 2019

Hälsotjänsten minskar det arbete som krävs för att få liveprestanda och kapacitetsinformation från ditt Lagringsdirigering kluster. En cmdlet innehåller en sammanställd lista över viktiga mått som samlas in effektivt och aggregeras dynamiskt mellan noder, med inbyggd logik för att identifiera klustermedlemskap. Alla värden är enbart i realtid och per tidpunkt.

Användning i PowerShell

Använd följande cmdlet för att hämta mått för hela Lagringsdirigering klustret:

Get-ClusterPerformanceHistory

Tips

Använd Get-ClusterPerf alias för att spara några tangenttryckningar.

Du kan också hämta mått för en viss volym eller server:

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

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

Användning i .NET och C#

Det här avsnittet visar hur du ansluter till hälsotjänsten, använder identifieringsobjekt och implementerar en observatör för att börja strömma mått.

Anslut

För att köra frågor mot hälsotjänsten upprättar du en CimSession med klustret. För att göra det behöver du vissa saker som bara är tillgängliga i fullständig Microsoft .NET, vilket innebär att du inte enkelt kan göra detta direkt från en webb- eller mobilapp. Kodexemplen i det här avsnittet använder C#, det enklaste valet för det här dataåtkomstlagret.

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

Det angivna användarnamnet ska vara en lokal administratör för måldatorn.

Vi rekommenderar att du skapar lösenordet SecureString direkt från användarindata i realtid, så att lösenordet aldrig lagras i minnet i klartext. Detta hjälper till att minimera en mängd olika säkerhetsproblem. Men i praktiken är det vanligt att konstruera det som ovan i prototypsyfte.

Identifiera objekt

När CimSession har upprättats kan du fråga Windows Management Instrumentation (WMI) i klustret.

Innan du kan få fel eller mått måste du hämta instanser av flera relevanta objekt. Hämta först MSFT_StorageSubSystem som representerar Lagringsdirigering i klustret. Med det kan du få varje MSFT_StorageNode i klustret och varje MSFT_Volume av datavolymerna. Slutligen måste du hämta MSCluster_ClusterHealthService, själva hälsotjänsten.

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

Det här är samma objekt som du får i PowerShell med hjälp av cmdletar som Get-StorageSubSystem, Get-StorageNode och Get-Volume.

Du kan komma åt samma egenskaper, som dokumenteras i API-klasser för lagringshantering.

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

Anropa GetMetric för att börja strömma exempel på en expertbaserad lista över viktiga mått baserat på angivna måttnamn från MetricName-parametern , som samlas in effektivt och aggregeras dynamiskt mellan noder, med inbyggd logik för att identifiera klustermedlemskap. Exempel kommer baserat på den angivna tidsramen från StreamName-parametern .

En fullständig lista över tillgängliga mått finns i Prestandahistorik för Lagringsdirigering.

IObserver.OnNext()

Den här exempelkoden använder observerdesignmönstret för att implementera en observatör vars OnNext() -metod anropas när varje nytt urval av mått tas emot. Metoden OnCompleted() anropas if/when streaming ends. Du kan till exempel använda den för att initiera direktuppspelning igen, så att den fortsätter på obestämd tid.

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

Börja strömma

När observatören har definierats kan du börja strömma.

Ange den CimInstance-mål som du vill att måtten ska begränsas till. Det kan vara klustret, vilken nod som helst eller vilken volym som helst.

Parametern count är antalet exempel innan direktuppspelningen avslutas.

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

Dessa mått kan visualiseras, lagras i en databas eller användas på det sätt du vill.

Ytterligare referenser