取得叢集效能歷程記錄
適用於:Azure 本機版本 23H2 和 22H2;Windows Server 2022、Windows Server 2019
「健全狀況服務」可減少從「儲存空間直接存取」叢集取得即時效能和容量資訊需執行的工作量。 一個 Cmdlet 提供一份策劃的基本計量清單,這些計量會以有效率且動態方式跨節點收集,並具有內建邏輯來偵測叢集成員資格。 所有的值都是即時且為該時間點的值。
PowerShell 中的使用方式
使用下列 Cmdlet 來取得整個 儲存空間直接存取 叢集的計量:
Get-ClusterPerformanceHistory
提示
使用 Get-ClusterPerf 別名來儲存一些按鍵輸入。
您也可以取得一個特定磁碟區或伺服器的計量:
Get-Volume -FileSystemLabel <Label> | Get-ClusterPerformanceHistory
Get-StorageNode -Name <Name> | Get-ClusterPerformanceHistory
在 .NET 和 C# 中的使用方式
本節說明如何連線到 健全狀況服務、使用探索物件,以及實作 Observer 開始串流計量。
連線
若要查詢 健全狀況服務,您可以使用叢集建立 CimSession。 若要這樣做,您需要一些只有完整Microsoft .NET 提供的專案,這表示您無法直接從 Web 或行動應用程式執行這項操作。 本節中的程式代碼範例會使用 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;
}
提供的使用者名稱應該是目標計算機的本機系統管理員。
建議您直接從使用者輸入即時建構 Password SecureString ,讓密碼永遠不會以純文本儲存在記憶體中。 這有助於減輕各種安全性疑慮。 但在實務上,為了進行原型設計,如上所述建構很常見。
探索物件
建立 CimSession 後,您可以在叢集上查詢 Windows Management Instrumentation (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 等 Cmdlet 取得的相同物件。
您可以存取所有相同屬性,如存放管理 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() 方法會在串流結束時呼叫 if/。 例如,您可以使用它來重新初始化串流,讓它無限期地繼續。
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);
}
這些計量可以可視化、儲存在資料庫中,或以您認為適合的方式使用。