Obtenha o histórico de desempenho do cluster

Aplica-se a: Azure Stack HCI, versões 21H2 e 20H2; Windows Server 2022, Windows Server 2019

O Serviço de Estado de Funcionamento reduz o trabalho necessário para obter informações de desempenho ao vivo e de capacidade do seu cluster Espaços de Armazenamento Direct. Um cmdlet fornece uma lista curada de métricas essenciais, que são recolhidas de forma eficiente e agregada dinamicamente através de nós, com lógica incorporada para detetar a adesão ao cluster. Todos os valores são apenas em tempo real e de ponto no tempo.

Utilização em PowerShell

Utilize o seguinte cmdlet para obter métricas para todo o cluster Espaços de Armazenamento Direct:

Get-ClusterPerformanceHistory

Dica

Use o pseudónimo Get-ClusterPerf para guardar algumas teclas.

Também pode obter métricas para um volume ou servidor específico:

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

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

Utilização em .NET e C #

Estas secções mostram como ligar-se ao Serviço de Estado de Funcionamento, utilizar objetos de descoberta e implementar um Observador para iniciar métricas de streaming.

Ligar

Para consultar o Serviço de Estado de Funcionamento, estabelece-se uma CimSession com o cluster. Para tal, precisa de algumas coisas que só estão disponíveis em pleno Microsoft .NET, o que significa que não pode fazê-lo diretamente a partir de uma web ou aplicação móvel. As amostras de código nesta secção utilizam C#, a escolha mais simples para esta camada de acesso a dados.

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

O nome de utilizador fornecido deve ser um administrador local do computador-alvo.

Recomendamos a construção da Palavra-Passe SecureString diretamente a partir da entrada do utilizador em tempo real, para que a palavra-passe nunca seja armazenada na memória em texto claro. Isto ajuda a mitigar uma variedade de preocupações de segurança. Mas, na prática, construí-la como acima é comum para fins de prototipagem.

Descubra objetos

Com a CimSession estabelecida, pode consultar Windows Instrumentação de Gestão (WMI) no cluster.

Antes de obter falhas ou métricas, precisa de obter casos de vários objetos relevantes. Primeiro, obtenha o MSFT_StorageSubSystem que representa Espaços de Armazenamento Direto no cluster. Usando isso, você pode obter todos os MSFT_StorageNode no cluster, e cada MSFT_Volume dos volumes de dados. Finalmente, é preciso ter o MSCluster_ClusterHealthService,o Serviço de Estado de Funcionamento si mesmo.

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

Estes são os mesmos objetos que obtém no PowerShell usando cmdlets como Get-StorageSubSystem,Get-StorageNodee Get-Volume.

Pode aceder a todas as mesmas propriedades, documentadas nas Aulas de API de Gestão de Armazenamento.

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

Invocar a GetMetric para começar a transmitir amostras de uma lista de métricas essenciais com curadoria de especialistas com base em nomes métricos fornecidos do parâmetro MetricName, que são recolhidos de forma eficiente e agregada dinamicamente através de nós, com lógica incorporada para detetar a adesão ao cluster. As amostras chegam com base no prazo fornecido a partir do parâmetro StreamName.

Para obter a lista completa das métricas disponíveis, consulte o histórico de desempenho para Espaços de Armazenamento Direct.

IObserver.OnNext()

Este código de amostra utiliza o Padrão de Design do Observador para implementar um Observador cujo método OnNext é invocado quando cada nova amostra de métricas chega. O seu método OnCompleted() chama-se se/quando o streaming termina. Por exemplo, pode usá-lo para reiniciar o streaming, para que continue indefinidamente.

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

Começar a transmitir

Com o Observador definido, pode começar a ser transmitido.

Especifique o objetivo CimInstance ao qual deseja que as métricas sejam traçadas. Pode ser o aglomerado, qualquer nó, ou qualquer volume.

O parâmetro da contagem é o número de amostras antes do fim do streaming.

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

Estas métricas podem ser visualizadas, armazenadas numa base de dados, ou usadas da forma que entenderem.

Referências adicionais