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
- Menyetel server SignalR Anda untuk performa
- Memecahkan masalah performa
- Menggunakan penghitung kinerja SignalR
- Menggunakan penghitung kinerja lainnya
- Sumber daya lainnya
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 dalamConfiguration
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 meningkatkanrequestQueueLimit
pengaturan. Untuk melakukan ini, tambahkan pengaturan konfigurasi berikut ke nodeprocessModel
diconfig/machine.config
(bukanaspnet.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:
Di Visual Studio, pilih Alat>NuGet Package Manager>Kelola Paket NuGet untuk Solusi
Cari signalr.utils, dan pilih Instal.
Terima perjanjian lisensi untuk menginstal paket.
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:
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk