Uzyskiwanie historii wydajności klastra
Dotyczy: Azure Local, wersje 23H2 i 22H2; Windows Server 2022, Windows Server 2019
Usługa kondycji zmniejsza pracę wymaganą do uzyskania informacji o wydajności i pojemności na żywo z klastra Miejsca do magazynowania Direct. Jedno polecenie cmdlet udostępnia wyselekcjonowaną listę podstawowych metryk, które są zbierane wydajnie i agregowane dynamicznie w węzłach, z wbudowaną logiką do wykrywania członkostwa w klastrze. Wszystkie wartości są podawane w czasie rzeczywistym i w danym momencie.
Użycie w programie PowerShell
Użyj następującego polecenia cmdlet, aby pobrać metryki dla całego klastra Miejsca do magazynowania Direct:
Get-ClusterPerformanceHistory
Napiwek
Użyj aliasu Get-ClusterPerf, aby zapisać niektóre naciśnięcia.
Możesz również pobrać metryki dla jednego określonego woluminu lub serwera:
Get-Volume -FileSystemLabel <Label> | Get-ClusterPerformanceHistory
Get-StorageNode -Name <Name> | Get-ClusterPerformanceHistory
Użycie na platformie .NET i C#
W tych sekcjach przedstawiono sposób nawiązywania połączenia z Usługa kondycji, używania obiektów odnajdywania i implementowania obserwatora w celu rozpoczęcia przesyłania strumieniowego metryk.
Połącz
Aby wykonać zapytanie dotyczące Usługa kondycji, należy ustanowić cimSession z klastrem. W tym celu potrzebne są pewne elementy, które są dostępne tylko w pełnej wersji platformy Microsoft .NET, co oznacza, że nie można tego zrobić bezpośrednio z poziomu aplikacji internetowej lub mobilnej. Przykłady kodu w tej sekcji używają języka C#, najprostszego wyboru dla tej warstwy dostępu do danych.
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;
}
Podana nazwa użytkownika powinna być administratorem lokalnym komputera docelowego.
Zalecamy konstruowanie funkcji SecureString hasła bezpośrednio z danych wejściowych użytkownika w czasie rzeczywistym, aby hasło nigdy nie było przechowywane w pamięci w postaci zwykłego tekstu. Pomaga to wyeliminować różne problemy związane z bezpieczeństwem. Jednak w praktyce konstruowanie go tak jak powyżej jest powszechne w celach prototypowych.
Odnajdywanie obiektów
Po ustanowieniu cimSession można wykonywać zapytania dotyczące instrumentacji zarządzania Windows (WMI) w klastrze.
Zanim będzie można uzyskać błędy lub metryki, należy pobrać wystąpienia kilku odpowiednich obiektów. Najpierw uzyskaj MSFT_StorageSubSystem reprezentującą Miejsca do magazynowania Direct w klastrze. W tym celu można uzyskać każdy MSFT_StorageNode w klastrze i każdy MSFT_Volume woluminów danych. Na koniec musisz uzyskać MSCluster_ClusterHealthService, sam Usługa kondycji.
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();
}
Są to te same obiekty, które otrzymujesz w programie PowerShell przy użyciu poleceń cmdlet, takich jak Get-StorageSubSystem, Get-StorageNode i Get-Volume.
Dostęp do wszystkich tych samych właściwości można uzyskać w temacie Storage Management API Classes (Klasy interfejsu API zarządzania magazynami).
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());
}
Wywołaj metodę GetMetric , aby rozpocząć przesyłanie strumieniowe próbek wyselekcjonowanej przez ekspertów listy podstawowych metryk na podstawie podanych nazw metryk z parametru MetricName , które są zbierane wydajnie i agregowane dynamicznie w węzłach z wbudowaną logiką do wykrywania członkostwa w klastrze. Przykłady są dostarczane na podstawie podanego przedziału czasu z parametru StreamName .
Aby uzyskać pełną listę dostępnych metryk, zobacz Historia wydajności Miejsca do magazynowania Direct.
IObserver.OnNext()
Ten przykładowy kod używa wzorca projektowego obserwatora do implementowania obserwatora, którego metoda OnNext() jest wywoływana po nadejściu każdej nowej próbki metryk. Metoda OnCompleted() jest wywoływana w przypadku/po zakończeniu przesyłania strumieniowego. Można na przykład użyć go do ponownego zainicjowania przesyłania strumieniowego, aby kontynuować bezterminowo.
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
}
}
Rozpocznij przesyłanie strumieniowe
Po zdefiniowaniu obserwatora można rozpocząć przesyłanie strumieniowe.
Określ docelową wartość CimInstance , do której mają być określone metryki o określonym zakresie. Może to być klaster, dowolny węzeł lub dowolny wolumin.
Parametr count to liczba próbek przed zakończeniem przesyłania strumieniowego.
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);
}
Te metryki można wizualizować, przechowywać w bazie danych lub używać w dowolny sposób.