Bagikan melalui


Performa SignalR (SignalR 1.x)

oleh Patrick Fletcher

Peringatan

Dokumentasi ini bukan untuk versi terbaru SignalR. Lihatlah ASP.NET Core SignalR.

Topik ini menjelaskan cara merancang, mengukur, dan meningkatkan performa dalam aplikasi SignalR.

Untuk presentasi terbaru tentang performa dan penskalaan SignalR, lihat Menskalakan Web Real-time dengan ASP.NET SignalR.

Topik ini berisi bagian berikut:

Mempertimbangkan rancangan

Bagian ini menjelaskan pola yang dapat diimplementasikan selama desain aplikasi SignalR, untuk memastikan bahwa performa tidak terhambat dengan menghasilkan lalu lintas jaringan yang tidak perlu.

Frekuensi pesan pembatasan

Bahkan dalam aplikasi yang mengirim pesan pada frekuensi tinggi (seperti aplikasi game realtime), sebagian besar aplikasi tidak perlu mengirim lebih dari beberapa pesan sedetik. Untuk mengurangi jumlah lalu lintas yang dihasilkan setiap klien, perulangan pesan dapat diimplementasikan bahwa antrean dan mengirim pesan tidak lebih sering daripada tarif tetap (yaitu, hingga sejumlah pesan tertentu akan dikirim setiap detik, jika ada pesan dalam interval waktu tersebut yang akan dikirim). Untuk aplikasi sampel yang membatasi pesan ke tingkat tertentu (dari klien dan server), lihat Realtime Frekuensi Tinggi dengan SignalR.

Mengurangi ukuran pesan

Anda dapat mengurangi ukuran pesan SignalR dengan mengurangi ukuran objek serial Anda. Dalam kode server, jika Anda mengirim objek yang berisi properti yang tidak perlu ditransmisikan, cegah properti tersebut JsonIgnore diserialisasikan dengan menggunakan atribut . Nama properti juga disimpan dalam pesan; nama properti dapat disingkat menggunakan JsonProperty atribut . Contoh kode berikut menunjukkan cara mengecualikan properti agar tidak dikirim ke klien, dan cara mempersingkat nama properti:

Kode server .NET yang menunjukkan atribut JsonIgnore untuk mengecualikan data agar tidak dikirim ke klien, dan atribut JsonProperty untuk mengurangi ukuran pesan

using Newtonsoft.Json; 
using System; 
public class ShapeModel
{
[JsonProperty("l")]
    public double Left { get; set; }
[JsonProperty("t")]
    public double Top { get; set; }
    // We don't want the client to get the "LastUpdatedBy" property
[JsonIgnore]
    public string LastUpdatedBy { get; set; }
}

Untuk mempertahankan keterbacaan/pemeliharaan dalam kode klien, nama properti yang disingkat dapat dipetakan ulang ke nama yang ramah manusia setelah pesan diterima. Sampel kode berikut menunjukkan salah satu cara yang mungkin untuk memetakan ulang nama yang dipersingkat menjadi nama yang lebih panjang, dengan mendefinisikan kontrak pesan (pemetaan), dan menggunakan reMap fungsi untuk menerapkan kontrak ke kelas pesan yang dioptimalkan:

Kode JavaScript sisi klien yang memetakan ulang nama properti yang dipersingkat menjadi nama yang dapat dibaca manusia

function reMap(smallObject, contract) {
    var largeObject = {};
    for (var smallProperty in contract) {
        largeObject[contract[smallProperty]] = smallObject[smallProperty];
    }
    return largeObject;
}
var shapeModelContract = {
    l: "left",
    t: "top"
};
myHub.client.setShape = function (shapeModelSmall) {
    var shapeModel = reMap(shapeModelSmall, shapeModelContract);
    // shapeModelSmall has "l" and "t" properties  but after remapping
    // shapeModel now has "left" and "top" properties
};

Nama juga dapat dipersingkat dalam pesan dari klien ke server, menggunakan metode yang sama.

Mengurangi jejak memori (yaitu, jumlah memori yang digunakan untuk pesan) objek pesan juga dapat meningkatkan performa. Misalnya, jika rentang int penuh tidak diperlukan, short atau byte dapat digunakan sebagai gantinya.

Karena pesan disimpan di bus pesan dalam memori server, mengurangi ukuran pesan juga dapat mengatasi masalah memori server.

Menyetel server SignalR Anda untuk performa

Pengaturan konfigurasi berikut dapat digunakan untuk menyetel server Anda untuk performa yang lebih baik dalam aplikasi SignalR. Untuk informasi umum tentang cara meningkatkan performa dalam aplikasi ASP.NET, lihat Meningkatkan Performa ASP.NET.

Pengaturan konfigurasi SignalR

  • DefaultMessageBufferSize: Secara default, SignalR menyimpan 1000 pesan dalam memori per hub per koneksi. Jika pesan besar sedang digunakan, ini dapat membuat masalah memori yang dapat dikurangi dengan mengurangi nilai ini. Pengaturan ini dapat diatur dalam Application_Start penanganan aktivitas dalam aplikasi ASP.NET, atau dalam Configuration metode kelas startup OWIN dalam aplikasi yang dihost sendiri. Contoh berikut menunjukkan cara mengurangi nilai ini untuk mengurangi jejak memori aplikasi Anda untuk mengurangi jumlah memori server yang digunakan:

    Kode server .NET di Global.asax untuk mengurangi ukuran buffer pesan default

    protected void Application_Start(object sender, EventArgs e)
    {
        GlobalHost.Configuration.DefaultMessageBufferSize = 500;
    }
    

Pengaturan konfigurasi IIS

  • Permintaan bersamaan maksimum per aplikasi: Meningkatkan jumlah permintaan IIS bersamaan akan meningkatkan sumber daya server yang tersedia untuk melayani permintaan. Nilai defaultnya adalah 5000; untuk meningkatkan pengaturan ini, jalankan perintah berikut dalam prompt perintah yang ditingkatkan:

    cd %windir%\System32\inetsrv\
    appcmd.exe set config /section:system.webserver/serverRuntime 
            /appConcurrentRequestLimit:10000
    

ASP.NET pengaturan konfigurasi

Bagian ini mencakup pengaturan konfigurasi yang dapat diatur dalam aspnet.config file. File ini ditemukan di salah satu dari dua lokasi, tergantung pada platform:

  • %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet.config
  • %windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet.config

ASP.NET pengaturan yang dapat meningkatkan performa SignalR meliputi hal-hal berikut:

  • Permintaan bersamaan maksimum per CPU: Meningkatkan pengaturan ini dapat meringankan penyempitan performa. Untuk meningkatkan pengaturan ini, tambahkan pengaturan konfigurasi berikut ke aspnet.config file :

    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
        <system.web>
            <applicationPool maxConcurrentRequestsPerCPU="20000" />
        </system.web>
    </configuration>
    
  • Batas Antrean Permintaan: Ketika jumlah total koneksi melebihi maxConcurrentRequestsPerCPU pengaturan, ASP.NET akan mulai membatasi permintaan menggunakan antrean. Untuk meningkatkan ukuran antrean, Anda dapat meningkatkan requestQueueLimit pengaturan. Untuk melakukan ini, tambahkan pengaturan konfigurasi berikut ke node processModel di config/machine.config (bukan aspnet.config):

    <processModel autoConfig="false" requestQueueLimit="250000" />
    

Memecahkan masalah performa

Bagian ini menjelaskan cara untuk menemukan hambatan performa di aplikasi Anda.

Memverifikasi bahwa WebSocket sedang digunakan

Meskipun SignalR dapat menggunakan berbagai transportasi untuk komunikasi antara klien dan server, WebSocket menawarkan keunggulan performa yang signifikan, dan harus digunakan jika klien dan server mendukungnya. Untuk menentukan apakah klien dan server Anda memenuhi persyaratan untuk WebSocket, lihat Transportasi dan Fallback. Untuk menentukan transportasi apa yang digunakan dalam aplikasi Anda, Anda dapat menggunakan alat pengembang browser, dan memeriksa log untuk melihat transportasi apa yang digunakan untuk koneksi. Untuk informasi tentang menggunakan alat pengembangan browser di Internet Explorer dan Chrome, lihat Transportasi dan Fallback.

Menggunakan penghitung kinerja SignalR

Bagian ini menjelaskan cara mengaktifkan dan menggunakan penghitung kinerja SignalR, yang ditemukan dalam Microsoft.AspNet.SignalR.Utils paket.

Menginstal signalr.exe

Penghitung kinerja dapat ditambahkan ke server menggunakan utilitas yang disebut SignalR.exe. Untuk menginstal utilitas ini, ikuti langkah-langkah berikut:

  1. Di Visual Studio, pilih Alat>NuGet Package Manager>Kelola Paket NuGet untuk Solusi

  2. Cari signalr.utils, dan pilih Instal.

    Cuplikan layar yang memperlihatkan utilitas baris Perintah Microsoft A S P dot NET Signal R utilities untuk A S P dot NET Signal R disorot.

  3. Terima perjanjian lisensi untuk menginstal paket.

  4. SignalR.exe akan diinstal ke <project folder>/packages/Microsoft.AspNet.SignalR.Utils.<version>/tools.

Menginstal penghitung kinerja dengan SignalR.exe

Untuk menginstal penghitung kinerja SignalR, jalankan SignalR.exe dalam prompt perintah yang ditingkatkan dengan parameter berikut:

SignalR.exe ipc

Untuk menghapus penghitung kinerja SignalR, jalankan SignalR.exe di prompt perintah yang ditingkatkan dengan parameter berikut:

SignalR.exe upc

Penghitung Kinerja SignalR

Paket utilitas menginstal penghitung kinerja berikut. Penghitung "Total" mengukur jumlah peristiwa sejak kumpulan aplikasi terakhir atau menghidupkan ulang server.

Metrik koneksi

Metrik berikut mengukur peristiwa seumur hidup koneksi yang terjadi. Untuk informasi selengkapnya, lihat Memahami dan Menangani Peristiwa Seumur Hidup Koneksi.

  • Koneksi Tersambung
  • Koneksi Tersambung Kembali
  • Sambungan Terputus
  • Koneksi Saat Ini

Metrik pesan

Metrik berikut mengukur lalu lintas pesan yang dihasilkan oleh SignalR.

  • Total Pesan Koneksi yang Diterima
  • Total Pesan Koneksi Terkirim
  • Pesan Koneksi Diterima/Detik
  • Pesan Koneksi Terkirim/Detik

Metrik bus pesan

Metrik berikut mengukur lalu lintas melalui bus pesan SignalR internal, antrean tempat semua pesan SignalR masuk dan keluar ditempatkan. Pesan Diterbitkan saat dikirim atau disiarkan. Pelanggan dalam konteks ini adalah langganan di bus pesan; ini harus sama dengan jumlah klien ditambah server itu sendiri. Pekerja yang Dialokasikan adalah komponen yang mengirim data ke koneksi aktif; Pekerja Sibuk adalah pekerja yang secara aktif mengirim pesan.

  • Total Pesan Bus Pesan diterima
  • Pesan Bus Pesan Diterima/Detik
  • Total Pesan Bus Pesan yang Diterbitkan
  • Pesan Bus Pesan Diterbitkan/Detik
  • Pelanggan Bus Pesan Saat Ini
  • Total Pelanggan Bus Pesan
  • Pelanggan Bus Pesan/Detik
  • Pekerja Yang Dialokasikan Bus Pesan
  • Pekerja Sibuk Pesan
  • Topik Bus Pesan Saat Ini

Metrik kesalahan

Metrik berikut mengukur kesalahan yang dihasilkan oleh lalu lintas pesan SignalR. Kesalahan Resolusi Hub terjadi ketika metode hub atau hub tidak dapat diselesaikan. Kesalahan Pemanggilan Hub adalah pengecualian yang dilemparkan saat memanggil metode hub. Kesalahan transportasi adalah kesalahan koneksi yang dilemparkan selama permintaan atau respons HTTP.

  • Kesalahan: Semua Total
  • Kesalahan: Semua/Detik
  • Kesalahan: Total Resolusi Hub
  • Kesalahan: Resolusi Hub/Detik
  • Kesalahan: Total Pemanggilan Hub
  • Kesalahan: Pemanggilan Hub/Detik
  • Kesalahan: Total Transportasi
  • Kesalahan: Transport/Sec

Metrik scaleout

Metrik berikut mengukur lalu lintas dan kesalahan yang dihasilkan oleh penyedia scaleout. Stream dalam konteks ini adalah unit skala yang digunakan oleh penyedia scaleout; ini adalah tabel jika SQL Server digunakan, Topik jika Bus Layanan digunakan, dan Langganan jika Redis digunakan. Secara default, hanya satu aliran yang digunakan, tetapi ini dapat ditingkatkan melalui konfigurasi pada SQL Server dan Azure Service Bus. Aliran Buffering adalah aliran yang telah memasuki status rusak; ketika aliran dalam status rusak, semua pesan yang dikirim ke backplane akan segera gagal sampai aliran tidak lagi rusak. Panjang Kirim Antrean adalah jumlah pesan yang telah diposting tetapi belum dikirim.

  • Pesan Bus Pesan Scaleout Diterima/Detik
  • Total Aliran Scaleout
  • Scaleout Streams Open
  • Penyanggaan Stream Scaleout
  • Total Kesalahan Scaleout
  • Kesalahan Scaleout/Detik
  • Perluasan Skala Kirim Panjang Antrean

Untuk informasi selengkapnya tentang pengukur penghitung ini, lihat SignalR Scaleout dengan Azure Service Bus.

Menggunakan penghitung kinerja lainnya

Penghitung kinerja berikut mungkin juga berguna dalam memantau performa aplikasi Anda.

Memori

  • .NET CLR Memory# byte di semua Heaps (untuk w3wp)

ASP.NET

  • ASP.NET\Requests Current
  • ASP.NET\Antrean
  • ASP.NET\Ditolak

CPU

  • Informasi Prosesor\Waktu Prosesor

TCP/IP

  • TCPv6/Koneksi Dibuat
  • TCPv4/Koneksi Dibuat

Layanan Web

  • Layanan Web\Koneksi Saat Ini
  • Layanan Web\Koneksi Maksimum

Pengaluran

  • .NET CLR LocksAndThreads# dari Thread logis saat ini
  • .NET CLR LocksAnd Threads# dari Thread fisik saat ini

Sumber Daya Lain

Untuk informasi selengkapnya tentang pemantauan dan penyetelan performa ASP.NET, lihat topik berikut: