Bagikan melalui


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.

Referensi tambahan