Mendapatkan riwayat performa kluster
Berlaku untuk: Azure Stack HCI, versi 23H2 dan 22H2; Windows Server 2022, Windows Server 2019
Layanan Kesehatan mengurangi pekerjaan yang diperlukan untuk mendapatkan informasi performa dan kapasitas langsung dari kluster Ruang Penyimpanan Langsung Anda. Satu cmdlet menyediakan daftar metrik penting yang dikumpulkan, yang dikumpulkan secara efisien dan diagregasi secara dinamis di seluruh node, dengan logika bawaan untuk mendeteksi keanggotaan kluster. Semua nilai hanya titik waktu tertentu dan real-time.
Penggunaan di PowerShell
Gunakan cmdlet berikut untuk mendapatkan metrik untuk seluruh kluster Ruang Penyimpanan Langsung:
Get-ClusterPerformanceHistory
Tip
Gunakan alias Get-ClusterPerf untuk menyimpan beberapa penekanan tombol.
Anda juga bisa mendapatkan metrik untuk satu volume atau server tertentu:
Get-Volume -FileSystemLabel <Label> | Get-ClusterPerformanceHistory
Get-StorageNode -Name <Name> | Get-ClusterPerformanceHistory
Penggunaan di .NET dan C#
Bagian ini menunjukkan cara tersambung ke Layanan Kesehatan, menggunakan objek temuan, dan menerapkan Pengamat untuk memulai streaming metrik.
Sambungkan
Untuk mengkueri Layanan Kesehatan, Anda membuat CimSession dengan kluster. Untuk melakukannya, Anda memerlukan beberapa hal yang hanya tersedia di .NET Microsoft lengkap, yang berarti Anda tidak dapat dengan mudah melakukan ini langsung dari aplikasi ponsel atau web. Sampel kode di bagian ini menggunakan C#, pilihan paling mudah untuk lapisan akses data ini.
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;
}
Nama pengguna yang disediakan harus menjadi administrator lokal dari komputer target.
Sebaiknya buat Kata Sandi SecureString langsung dari input pengguna secara real-time, sehingga kata sandi tidak pernah tersimpan dalam memori dalam teks biasa. Langkah ini membantu mengurangi berbagai masalah keamanan. Tetapi dalam praktiknya, membuatnya seperti di atas adalah umum untuk tujuan prototyping.
Menemukan objek
Dengan CimSession yang ditetapkan, Anda dapat mengkueri Instrumentasi Manajemen Windows (WMI) pada kluster.
Sebelum bisa mendapatkan kesalahan atau metrik, Anda perlu mendapatkan instans beberapa objek yang relevan. Pertama, dapatkan MSFT_StorageSubSystem yang mewakili Ruang Penyimpanan Langsung pada kluster. Dengan menggunakan itu, Anda bisa mendapatkan setiap MSFT_StorageNode pada kluster, dan setiap MSFT_Volume dari volume data. Terakhir, Anda perlu mendapatkan MSCluster_ClusterHealthService, Layanan Kesehatan itu sendiri.
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();
}
Ini adalah objek yang sama yang Anda dapatkan di PowerShell menggunakan cmdlet seperti Get-StorageSubSystem, Get-StorageNode, dan Get-Volume.
Anda dapat mengakses semua properti yang sama, yang didokumentasikan di Kelas API Manajemen Penyimpanan.
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());
}
Panggil GetMetric untuk memulai streaming sampel daftar metrik penting yang dikumpulkan ahli berdasarkan nama metrik yang disediakan dari parameter MetricName, yang dikumpulkan secara efisien dan diagregasi secara dinamis di seluruh node, dengan logika bawaan untuk mendeteksi keanggotaan kluster. Sampel tiba berdasarkan jangka waktu yang disediakan dari parameter StreamName.
Untuk daftar lengkap metrik yang tersedia, lihat Riwayat performa untuk Ruang Penyimpanan Langsung.
IObserver.OnNext()
Kode sampel ini menggunakan Pola Desain Pengamat untuk menerapkan Pengamat yang metode OnNext() dipanggil saat setiap sampel metrik baru tiba. Metode OnCompleted() dipanggil jika/saat streaming berakhir. Misalnya, Anda mungkin menggunakannya untuk mengaktifkan kembali streaming, sehingga terus berlanjut tanpa batas waktu.
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
}
}
Memulai streaming
Dengan Pengamat yang didefinisikan, Anda dapat memulai streaming.
Tentukan CimInstance target yang Anda inginkan untuk dicakup oleh metrik. Ia bisa berupa kluster, node apa pun, atau volume apa pun.
Parameter hitungan adalah jumlah sampel sebelum streaming berakhir.
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);
}
Metrik ini dapat divisualisasikan, disimpan dalam database, atau digunakan dengan cara apa pun yang Anda inginkan.