Obtención del historial de rendimiento de un clúster

Se aplica a: Azure Stack HCI, versiones 23H2 y 22H2; Windows Server 2022, Windows Server 2019

El Servicio de mantenimiento reduce el trabajo necesario para obtener información sobre la capacidad y el rendimiento en vivo desde el clúster de Espacios de almacenamiento directo. Un cmdlet proporciona una lista de las métricas esenciales, que se recopilan de forma eficaz y se agregan dinámicamente a los nodos, con lógica integrada para detectar la pertenencia al clúster. Todos los valores son en tiempo real y únicamente en un momento dado.

Uso en PowerShell

Use el siguiente cmdlet a fin de obtener métricas para todo el clúster de Espacios de almacenamiento directo:

Get-ClusterPerformanceHistory

Sugerencia

Use el alias Get-ClusterPerf para guardar algunas pulsaciones de tecla.

También puede obtener métricas de un volumen o servidor específico:

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

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

Uso en .NET y C#

En esta sección se muestra cómo conectarse al Servicio de mantenimiento, usar la detección de objetos e implementar un observador para iniciar el streaming de las métricas.

Conectar

Para consultar el Servicio de mantenimiento, establezca el valor de CimSession con el clúster. Para ello, necesita algunos elementos que solo están disponibles en Microsoft .NET, lo que significa que no puede hacerlo directamente desde una aplicación móvil o web. Los ejemplos de código de esta sección usan C#, la opción más sencilla para esta capa de acceso a datos.

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

El nombre de usuario proporcionado debe ser un administrador local del equipo de destino.

Se recomienda construir Password SecureString directamente a partir de la entrada del usuario en tiempo real, para que la contraseña no se almacene nunca en la memoria en forma de texto no cifrado. Esto ayuda a mitigar diversos problemas de seguridad. Pero, en la práctica, construirlo tal como se ha mencionado anteriormente es algo frecuente para la creación de prototipos.

Detectar objetos

Una vez establecido CimSession, puede consultar Instrumental de administración de Windows (WMI) en el clúster.

Para poder obtener errores o métricas, debe obtener instancias de varios objetos pertinentes. En primer lugar, obtenga la clase MSFT_StorageSubSystem que representa Espacios de almacenamiento directo en el clúster. Con ella, puede obtener cada clase MSFT_StorageNode del clúster y cada MSFT_Volume de los volúmenes de datos. Por último, debe obtener la clase MSCluster_ClusterHealthService, el Servicio de mantenimiento en sí mismo.

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

Estos son los mismos objetos que se obtienen en PowerShell mediante cmdlets como Get-StorageSubSystem, Get-StorageNode y Get-Volume.

Puede acceder a todas las propiedades, documentadas en Clases de la API de administración de almacenamiento.

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

Invoque GetMetric para iniciar el streaming de las muestras de una lista de métricas esenciales, elaborada por expertos, según los nombres de métrica proporcionados desde el parámetro MetricName, que se recopilan de forma eficaz y se agregan dinámicamente entre nodos, con lógica integrada para detectar la pertenencia al clúster. Las muestras llegan en función del período de tiempo proporcionado desde el parámetro StreamName.

Para obtener la lista completa de métricas disponibles, consulte Historial de rendimiento de Espacios de almacenamiento directo.

IObserver.OnNext()

Este código de ejemplo utiliza el modelo de diseño de observador para implementar un observador cuyo método OnNext() se invoque cada vez que llegue una nueva muestra de métricas. Se llama a su método OnCompleted() si o cuando finaliza el streaming. Por ejemplo, puede usarlo para reiniciar el streaming, de modo que continúe 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
    }
}

Inicio del streaming

Una vez definido el observador, puede iniciar el streaming.

Especifique el elemento CimInstance de destino en el que desea establecer el ámbito de las métricas. Puede ser el clúster, cualquier nodo o volumen.

El parámetro count es el número de muestras antes de que finalice el 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 se pueden visualizar, almacenar en una base de datos o utilizar de la forma que considere oportuna.

Referencias adicionales