Abrufen des Clusterleistungsverlaufs
Gilt für: Azure Stack HCI, Versionen 23H2 und 22H2; Windows Server 2022, Windows Server 2019
Der Integritätsdienst verringert den Arbeitsaufwand zum Abrufen aktueller Leistungs- und Kapazitätsinformationen aus Ihrem „Direkte Speicherplätze“-Cluster. Ein einzelnes Cmdlet bietet eine zusammengestellte Liste wichtiger Metriken, die effizient gesammelt und knotenübergreifend dynamisch aggregiert werden, und zwar mithilfe integrierter Logik zum Erkennen der Clustermitgliedschaft. Alle Werte sind in Echtzeit und ausschließlich zeitpunktbezogen.
Verwendung in PowerShell
Verwenden Sie das folgende Cmdlet, um Metriken für den gesamten „Direkte Speicherplätze“-Cluster abzurufen:
Get-ClusterPerformanceHistory
Tipp
Verwenden Sie den Get-ClusterPerf Alias, um sich einige Tastatureingaben zu ersparen.
Sie können auch Metriken für ein bestimmtes Volume oder einen bestimmten Server abrufen:
Get-Volume -FileSystemLabel <Label> | Get-ClusterPerformanceHistory
Get-StorageNode -Name <Name> | Get-ClusterPerformanceHistory
Verwendung in .NET und C#
In diesem Abschnitt wird gezeigt, wie eine Verbindung mit dem Integritätsdienst hergestellt, der Befehl „Objekte ermitteln“ verwendet und ein Beobachter implementiert wird, um mit dem Streaming von Metriken zu beginnen.
Verbinden
Zum Abfragen des Integritätsdiensts richten Sie eine CimSession-Sitzung mit dem Cluster ein. Dazu benötigen Sie einige Funktionen, die nur in der Vollversion von Microsoft .NET zur Verfügung stehen, d. h. Sie können dies nicht ohne Weiteres direkt in einer Web- oder mobilen App tun. In den Codebeispielen in diesem Abschnitt wird C# verwendet, die unkomplizierteste Wahl für diese Datenzugriffsschicht.
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;
}
Der angegebene Benutzer muss ein lokaler Administrator des Zielcomputers sein.
Es wird empfohlen, das Kennwort SecureString direkt aus der Benutzereingabe in Echtzeit zu erstellen, damit das Kennwort niemals als Klartext im Arbeitsspeicher gespeichert wird. Dies trägt dazu bei, eine Reihe von Sicherheitsrisiken zu entschärfen. In der Praxis ist es jedoch üblich, für Prototypen die oben beschriebene Vorgehensweise zu verwenden.
Objekte ermitteln
Sobald die CimSession-Sitzung eingerichtet ist, können Sie Windows-Verwaltungsinstrumentation (WMI) im Cluster abfragen.
Bevor Sie Fehler oder Metriken abrufen können, müssen Sie Instanzen mehrerer relevanter Objekte abrufen. Rufen Sie zuerst MSFT_StorageSubSystem ab, das „Direkte Speicherplätze“ im Cluster darstellt. Damit können Sie jeden MSFT_StorageNode im Cluster und jedes MSFT_Volume der Datenvolumes abrufen. Schließlich müssen Sie MSCluster_ClusterHealthService, den Integritätsdienst selbst, abrufen.
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();
}
Dies sind die gleichen Objekte, die Sie in PowerShell mit Cmdlets wie Get-StorageSubSystem, Get-StorageNode und Get-Volume abrufen.
Sie können auf die gleichen Eigenschaften zugreifen, die unter Klassen der Speicherverwaltungs-API dokumentiert sind.
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());
}
Rufen Sie GetMetric auf, um mit dem Streaming von Beispielen einer von Experten zusammengestellten Liste wesentlicher Metriken zu beginnen, die auf den vom Parameter MetricName bereitgestellten Metriknamen basieren. Diese werden effizient gesammelt und dynamisch knotenübergreifend aggregiert, und zwar mit integrierter Logik zur Erkennung der Clustermitgliedschaft. Beispiele gehen basierend auf dem vom Parameter StreamName angegebenen Zeitrahmen ein.
Die vollständige Liste verfügbarer Metriken finden Sie unter Leistungsverlauf für „Direkte Speicherplätze“.
IObserver.OnNext()
In diesem Codebeispiel wird das Entwurfsmuster für Beobachter verwendet, um einen Beobachter zu implementieren, dessen OnNext() -Methode beim Eingang jeder neuen Stichprobe von Metriken aufgerufen wird. Seine OnCompleted() -Methode wird aufgerufen, wenn das Streaming endet. Sie können damit beispielsweise das Streaming neu starten, damit es auf unbegrenzte Zeit fortgesetzt wird.
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
}
}
Beginnen des Streamings
Wenn der Beobachter festgelegt ist, können Sie mit dem Streaming beginnen.
Geben Sie als Ziel die CimInstance an, auf die die Metriken begrenzt werden sollen. Dies kann der Cluster, ein beliebiger Knoten oder ein beliebiges Volume sein.
Der Parameter „count“ enthält die Anzahl der Stichproben, bevor das Streaming endet.
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);
}
Diese Metriken können visualisiert, in einer Datenbank gespeichert oder wie gewünscht genutzt werden.