Получение журнала производительности кластера
Применимо к: Локальные версии Azure, версии 23H2 и 22H2; Windows Server 2022, Windows Server 2019
Служба работоспособности сокращает работу, необходимую для получения сведений о производительности и емкости из кластера Локальные дисковые пространства. Один командлет предоставляет проверенный список основных метрик, которые собираются эффективно и агрегируются динамически на разных узлах с встроенной логикой для обнаружения членства в кластере. Все значения предоставляются только в режиме реального времени по состоянию на конкретный момент.
Использование в PowerShell
Используйте следующий командлет, чтобы получить метрики для всего кластера Локальные дисковые пространства:
Get-ClusterPerformanceHistory
Совет
Используйте псевдоним Get-ClusterPerf для сохранения некоторых нажатий клавиш.
Можно также получить метрики для одного конкретного тома или сервера:
Get-Volume -FileSystemLabel <Label> | Get-ClusterPerformanceHistory
Get-StorageNode -Name <Name> | Get-ClusterPerformanceHistory
Использование в .NET и C#
В этом разделе показано, как подключиться к служба работоспособности, использовать объекты обнаружения и реализовать наблюдатель для начала потоковой передачи метрик.
Connect
Чтобы запросить служба работоспособности, необходимо установить CimSession с кластером. Для этого вам потребуются некоторые вещи, доступные только в полной версии Microsoft .NET, то есть вы не можете сделать это непосредственно из веб-приложения или мобильного приложения. Примеры кода в этом разделе используют C#, самый простой выбор для этого уровня доступа к данным.
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;
}
Предоставленное имя пользователя должно быть локальным администратором целевого компьютера.
Рекомендуется создать пароль SecureString непосредственно из ввода пользователем в режиме реального времени, чтобы пароль никогда не храним в памяти в виде ясного текста. Это помогает устранить различные проблемы безопасности. Но на практике построение его, как описано выше, распространено для прототипирования целей.
Обнаружение объектов
Установив CimSession, вы можете запросить инструментарий управления Windows (WMI) в кластере.
Прежде чем получить ошибки или метрики, необходимо получить экземпляры нескольких соответствующих объектов. Сначала получите MSFT_StorageSubSystem, представляющую Локальные дисковые пространства в кластере. С помощью этого можно получить все MSFT_StorageNode в кластере и каждый MSFT_Volume томов данных. Наконец, необходимо получить MSCluster_ClusterHealthService, сам служба работоспособности.
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();
}
Это те же объекты, которые вы получаете в PowerShell с помощью командлетов Get-StorageSubSystem, Get-StorageNode и Get-Volume.
Вы можете получить доступ ко всем тем же свойствам, которые описаны в классах API управления хранилищами.
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());
}
Вызовите GetMetric, чтобы начать потоковую передачу примеров экспертного курированного списка основных метрик на основе предоставленных имен метрик из параметра MetricName, которые собираются эффективно и агрегируются динамически между узлами с встроенной логикой для обнаружения членства в кластере. Примеры поступают на основе предоставленного интервала времени из параметра StreamName .
Полный список доступных метрик см. в журнале производительности для Локальные дисковые пространства.
IObserver.OnNext()
Этот пример кода использует шаблон конструктора наблюдателя для реализации наблюдателя, метод OnNext() вызывается при поступлении каждого нового образца метрик. Метод OnCompleted() вызывается при завершении потоковой передачи. Например, вы можете использовать его для повторного инициации потоковой передачи, чтобы он продолжался бесконечно.
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
}
}
Начало потоковой передачи
Определив наблюдателя, можно начать потоковую передачу.
Укажите целевой CimInstance , для которого требуется область метрик. Это может быть кластер, любой узел или любой том.
Параметр count — это количество выборок до окончания потоковой передачи.
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);
}
Эти метрики можно визуализировать, хранить в базе данных или использовать в любом случае.