Obter o histórico de desempenho do cluster
Aplica-se a: Azure Stack HCI, versões 23H2 e 22H2; Windows Server 2022, Windows Server 2019
O Serviço de Estado de Funcionamento reduz o trabalho necessário para obter informações de desempenho e capacidade em direto do cluster de Espaços de Armazenamento Direto. Um cmdlet fornece uma lista organizada de métricas essenciais, que são recolhidas de forma eficiente e agregada dinamicamente entre nós, com lógica incorporada para detetar a associação ao cluster. Todos os valores são apenas em tempo real e de ponto no tempo.
Utilização no PowerShell
Utilize o seguinte cmdlet para obter métricas para todo o cluster de Espaços de Armazenamento Direto:
Get-ClusterPerformanceHistory
Dica
Utilize o alias de Get-ClusterPerf para guardar alguns batimentos de 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 ao Serviço de Estado de Funcionamento, utilizar objetos de deteção e implementar um Observador para iniciar a transmissão em fluxo de métricas.
Ligar
Para consultar o Serviço de Estado de Funcionamento, estabeleça uma CimSession com o cluster. Para tal, precisa de algumas coisas que só estão disponíveis no Microsoft .NET completo, o que significa que não pode fazê-lo diretamente a partir de uma aplicação Web ou móvel. Os exemplos 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 de destino.
Recomendamos a construção do SecureString de Palavra-passe 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í-lo como acima é comum para fins de prototipagem.
Descobrir objetos
Com a CimSession estabelecida, pode consultar o Windows Management Instrumentation (WMI) no cluster.
Antes de obter falhas ou métricas, tem de obter instâncias de vários objetos relevantes. Primeiro, obtenha o MSFT_StorageSubSystem que representa Espaços de Armazenamento Direto no cluster. Com isso, pode obter todas as MSFT_StorageNode no cluster e cada MSFT_Volume dos volumes de dados. Por fim, tem de obter o MSCluster_ClusterHealthService, o próprio Serviço de Estado de Funcionamento.
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 com cmdlets como Get-StorageSubSystem, Get-StorageNode e Get-Volume.
Pode aceder a todas as mesmas propriedades, documentadas em Classes 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());
}
Invoque GetMetric para começar a transmitir amostras de uma lista de métricas essenciais organizada por especialistas com base nos nomes de métricas fornecidos do parâmetro MetricName , que são recolhidos de forma eficiente e agregada dinamicamente entre nós, com lógica incorporada para detetar a associação ao cluster. Os exemplos chegam com base no período de tempo fornecido do parâmetro StreamName .
Para obter a lista completa das métricas disponíveis, veja Histórico de desempenho para Espaços de Armazenamento Direto.
IObserver.OnNext()
Este código de exemplo utiliza o Padrão de Estrutura do Observador para implementar um Observador cujo método OnNext() é invocado quando cada nova amostra de métricas chega. O método OnCompleted() é denominado se/quando a transmissão em fluxo termina. Por exemplo, pode utilizá-lo para reiniciar a transmissão em fluxo, 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
}
}
Iniciar transmissão em fluxo
Com o Observador definido, pode começar a transmitir em fluxo.
Especifique o CimInstance de destino ao qual pretende que as métricas sejam confinadas. Pode ser o cluster, qualquer nó ou qualquer volume.
O parâmetro de contagem é o número de amostras antes de a transmissão em fluxo terminar.
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 utilizadas da forma que achar adequada.