SignalR Performansı (SignalR 1.x)
Tarafından Patrick Fletcher
Uyarı
Bu belgeler SignalR'nin en son sürümüne yönelik değildir. ASP.NET Core SignalR'ye göz atın.
Bu konu, SignalR uygulamasında performansın nasıl tasarlandığı, ölçüldiği ve geliştirilip geliştirilecağı açıklanmaktadır.
SignalR performansı ve ölçeklendirmesi hakkında yeni bir sunu için bkz. ASP.NET SignalR ile Gerçek Zamanlı Web'i ölçeklendirme.
Bu konu aşağıdaki bölümleri içermektedir:
- Tasarım konusunda dikkat edilmesi gerekenler
- SignalR sunucunuzu performans için ayarlama
- Performans sorunlarını giderme
- SignalR performans sayaçlarını kullanma
- Diğer performans sayaçlarını kullanma
- Diğer kaynaklar
Tasarım konusunda dikkat edilmesi gerekenler
Bu bölümde, gereksiz ağ trafiği oluşturarak performansın engellenmediğinden emin olmak için SignalR uygulamasının tasarımı sırasında uygulanabilecek desenler açıklanmaktadır.
İleti sıklığını azaltma
İletileri yüksek sıklıkta (gerçek zamanlı oyun uygulaması gibi) gönderen bir uygulamada bile çoğu uygulamanın saniyede birkaç ileti göndermesi gerekmez. Her istemcinin oluşturduğu trafik miktarını azaltmak için, iletileri sabit bir hızdan daha sık kuyruğa alan ve gönderen bir ileti döngüsü uygulanabilir (yani, bu zaman aralığında iletiler varsa, her saniye belirli sayıda ileti gönderilir). İletileri belirli bir hıza (istemci ve sunucudan) kısıtlayan örnek bir uygulama için bkz. SignalR ile Yüksek Frekanslı Gerçek Zamanlı.
İleti boyutunu küçültme
Serileştirilmiş nesnelerinizin boyutunu küçülterek SignalR iletisinin boyutunu küçültebilirsiniz. Sunucu kodunda, iletilmesi gerekmeyen özellikler içeren bir nesne gönderiyorsanız, özniteliğini kullanarak JsonIgnore
bu özelliklerin seri hale getirilmesini önleyin. Özelliklerin adları da iletide depolanır; özelliklerin adları özniteliği kullanılarak JsonProperty
kısaltılabilir. Aşağıdaki kod örneği, bir özelliğin istemciye gönderilmesini nasıl dışlamanın ve özellik adlarının nasıl kısaltıldığını gösterir:
verileri istemciye gönderilmekten dışlamak için JsonIgnore özniteliğini ve ileti boyutunu küçültmek için JsonProperty özniteliğini gösteren .NET sunucu kodu
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; }
}
İstemci kodunda okunabilirliği/sürdürülebilirliği korumak için, kısaltılmış özellik adları ileti alındıktan sonra kolay adlara yeniden eşlenebilir. Aşağıdaki kod örneği, bir ileti sözleşmesi tanımlayarak (eşleme) ve iyileştirilmiş ileti sınıfına sözleşme uygulamak için işlevini kullanarak reMap
kısaltılmış adları daha uzun adlara yeniden eşlemenin olası bir yolunu gösterir:
Kısaltılmış özellik adlarını insan tarafından okunabilen adlarla yeniden eşleyen istemci tarafı JavaScript kodu
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
};
Adlar, istemciden sunucuya iletilerde de aynı yöntem kullanılarak kısaltılabilir.
İleti nesnesinin bellek ayak izini (yani ileti için kullanılan bellek miktarını) azaltmak da performansı artırabilir. Örneğin, bir aralığının int
tam aralığı gerekli değilse, bunun yerine veya short
byte
kullanılabilir.
İletiler ileti veri yolu içinde sunucu belleğinde depolandığından, iletilerin boyutunu küçültmek sunucu belleği sorunlarını da giderebilir.
SignalR sunucunuzu performans için ayarlama
SignalR uygulamasında daha iyi performans için sunucunuzu ayarlamak için aşağıdaki yapılandırma ayarları kullanılabilir. ASP.NET bir uygulamada performansı iyileştirme hakkında genel bilgi için bkz. ASP.NET Performansını Geliştirme.
SignalR yapılandırma ayarları
DefaultMessageBufferSize: SignalR varsayılan olarak bağlantı başına hub başına 1000 ileti tutar. Büyük iletiler kullanılıyorsa, bu değer azaltılarak azaltılabilecek bellek sorunlarına neden olabilir. Bu ayar, bir ASP.NET uygulamasındaki olay işleyicisinde veya şirket içinde barındırılan
Configuration
bir uygulamada OWIN başlangıç sınıfının yönteminde ayarlanabilirApplication_Start
. Aşağıdaki örnek, kullanılan sunucu belleği miktarını azaltmak amacıyla uygulamanızın bellek ayak izini azaltmak için bu değerin nasıl azaltılabileceğini göstermektedir:Varsayılan ileti arabelleği boyutunu azaltmak için Global.asax içindeki .NET sunucu kodu
protected void Application_Start(object sender, EventArgs e) { GlobalHost.Configuration.DefaultMessageBufferSize = 500; }
IIS yapılandırma ayarları
Uygulama başına en fazla eşzamanlı istek: Eşzamanlı IIS isteklerinin sayısının artırılması, isteklerin sunulması için kullanılabilir sunucu kaynaklarını artırır. Varsayılan değer 5000'dir; Bu ayarı artırmak için yükseltilmiş komut isteminde aşağıdaki komutları yürütebilirsiniz:
cd %windir%\System32\inetsrv\ appcmd.exe set config /section:system.webserver/serverRuntime /appConcurrentRequestLimit:10000
yapılandırma ayarlarını ASP.NET
Bu bölüm, dosyada aspnet.config
ayarlanabilen yapılandırma ayarlarını içerir. Bu dosya platforma bağlı olarak iki konumdan birinde bulunur:
%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet.config
%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet.config
SignalR performansını geliştirebilecek ASP.NET ayarları şunlardır:
CPU başına en fazla eşzamanlı istek sayısı: Bu ayarın artırılması performans sorunlarını ortadan kaldırır. Bu ayarı artırmak için dosyaya aşağıdaki yapılandırma ayarını
aspnet.config
ekleyin:<?xml version="1.0" encoding="UTF-8" ?> <configuration> <system.web> <applicationPool maxConcurrentRequestsPerCPU="20000" /> </system.web> </configuration>
İstek Sırası Sınırı: Toplam bağlantı sayısı ayarı aştığında
maxConcurrentRequestsPerCPU
, ASP.NET kuyruk kullanarak istekleri azaltmaya başlar. Kuyruğun boyutunu artırmak için ayarı artırabilirsinizrequestQueueLimit
. Bunu yapmak için düğümüneprocessModel
config/machine.config
(yerine)aspnet.config
aşağıdaki yapılandırma ayarını ekleyin:<processModel autoConfig="false" requestQueueLimit="250000" />
Performans sorunlarını giderme
Bu bölümde, uygulamanızda performans sorunlarını bulmanın yolları açıklanmaktadır.
WebSocket'in kullanıldığını doğrulama
SignalR, istemci ve sunucu arasındaki iletişim için çeşitli aktarımları kullanabilir, ancak WebSocket önemli bir performans avantajı sunar ve istemci ve sunucu destekliyorsa kullanılmalıdır. İstemcinizin ve sunucunuzun WebSocket gereksinimlerini karşılayıp karşılamadığını belirlemek için bkz . Aktarımlar ve Geri Dönüşler. Uygulamanızda hangi aktarımın kullanıldığını belirlemek için tarayıcı geliştirici araçlarını kullanabilir ve bağlantı için hangi aktarımın kullanıldığını görmek için günlükleri inceleyebilirsiniz. Internet Explorer ve Chrome'da tarayıcı geliştirme araçlarını kullanma hakkında bilgi için bkz . Aktarımlar ve Geri Dönüşler.
SignalR performans sayaçlarını kullanma
Bu bölümde, pakette Microsoft.AspNet.SignalR.Utils
bulunan SignalR performans sayaçlarının nasıl etkinleştirileceği ve kullanılacağı açıklanmaktadır.
signalr.exe yükleme
Performans sayaçları, SignalR.exe adlı bir yardımcı program kullanılarak sunucuya eklenebilir. Bu yardımcı programı yüklemek için şu adımları izleyin:
Visual Studio'da Araçlar>NuGet Paket Yöneticisi>Çözüm için NuGet Paketlerini Yönet'i seçin
signalr.utils için arama yapın ve Yükle'yi seçin.
Paketi yüklemek için lisans sözleşmesini kabul edin.
SignalR.exe sürümüne
<project folder>/packages/Microsoft.AspNet.SignalR.Utils.<version>/tools
yüklenir.
SignalR.exe ile performans sayaçlarını yükleme
SignalR performans sayaçlarını yüklemek için, yükseltilmiş komut isteminde aşağıdaki parametreyle SignalR.exe çalıştırın:
SignalR.exe ipc
SignalR performans sayaçlarını kaldırmak için yükseltilmiş komut isteminde aşağıdaki parametreyle SignalR.exe çalıştırın:
SignalR.exe upc
SignalR Performans sayaçları
Yardımcı programlar paketi aşağıdaki performans sayaçlarını yükler. "Toplam" sayaçları, son uygulama havuzundan veya sunucunun yeniden başlatılmasından bu yana gerçekleşen olayların sayısını ölçer.
Bağlantı ölçümleri
Aşağıdaki ölçümler, gerçekleşen bağlantı ömrü olaylarını ölçer. Daha fazla bilgi için bkz. Bağlantı Ömrü Olaylarını Anlama ve İşleme.
- Bağlı Bağlantılar
- Yeniden Bağlanan Bağlantılar
- Bağlantısı Kesilen Bağlantılar
- Geçerli Bağlantılar
İleti ölçümleri
Aşağıdaki ölçümler SignalR tarafından oluşturulan ileti trafiğini ölçer.
- Alınan Toplam Bağlantı İletileri
- Gönderilen Toplam Bağlantı İletileri
- Alınan Bağlantı İletileri/Sn
- Gönderilen Bağlantı İletileri/Sn
İleti veri yolu ölçümleri
Aşağıdaki ölçümler, tüm gelen ve giden SignalR iletilerinin yerleştirildiği kuyruk olan iç SignalR ileti veri yolu üzerinden trafiği ölçer. İleti gönderildiğinde veya yayınlandığında Yayımlanır . Bu bağlamda abone , ileti veri yolu üzerindeki bir aboneliktir; bu, istemci sayısına ve sunucunun kendisine eşit olmalıdır. Ayrılmış Çalışan, etkin bağlantılara veri gönderen bir bileşendir; Meşgul Çalışanı, etkin bir şekilde ileti gönderen çalışandır.
- Alınan İleti Veri Yolu İletileri Toplamı
- Alınan İleti Veri Yolu İletileri/Sn
- İleti Veri Yolu İletileri Yayımlanan Toplam
- Yayımlanan İleti Veri Yolu İletileri/Sn
- İleti Veri Yolu Aboneleri Güncel
- İleti Veri Yolu Aboneleri Toplamı
- İleti Veri Yolu Aboneleri/Sn
- İleti Veri Yolu Ayrılan Çalışanları
- İleti Veri Yolu Meşgul Çalışanları
- İleti Veri Yolu Konuları Güncel
Hata ölçümleri
Aşağıdaki ölçümler SignalR ileti trafiği tarafından oluşturulan hataları ölçer. Hub çözümleme hataları, bir hub veya hub yöntemi çözümlenemediğinde oluşur. Hub Çağırma hataları, hub yöntemi çağrılırken oluşan özel durumlardır. Aktarım hataları, HTTP isteği veya yanıtı sırasında oluşan bağlantı hatalarıdır.
- Hatalar: Tüm Toplam
- Hatalar: Tümü/Sn
- Hatalar: Hub Çözümleme Toplamı
- Hatalar: Hub Çözümlemesi/Sn
- Hatalar: Hub Çağırma Toplamı
- Hatalar: Hub Çağırma/Sn
- Hatalar: Aktarım Toplamı
- Hatalar: Aktarım/Sn
Ölçek genişletme ölçümleri
Aşağıdaki ölçümler, ölçeği genişletme sağlayıcısı tarafından oluşturulan trafiği ve hataları ölçer. Bu bağlamda akış, ölçek genişletme sağlayıcısı tarafından kullanılan bir ölçek birimidir; bu tablo, SQL Server kullanılıyorsa bir tablo, Service Bus kullanılıyorsa Konu başlığı ve Redis kullanılıyorsa Aboneliktir. Varsayılan olarak, yalnızca bir akış kullanılır, ancak bu, SQL Server ve Service Bus'ta yapılandırma yoluyla artırılabilir. Arabelleğe alma akışı, hatalı duruma giren akıştır; akış hatalı durumda olduğunda, akış artık hataya neden olmayana kadar arka plana gönderilen tüm iletiler hemen başarısız olur. Kuyruk Uzunluğu Gönder, gönderilmiş ancak henüz gönderilmemiş ileti sayısıdır.
- Alınan İleti Veri Yolu İletilerinin ÖlçeğiNi Genişletme/Sn
- Ölçeği Genişletme Akışları Toplamı
- Ölçeği Genişletme Akışları Açık
- Ölçek Genişletme Akışları Arabelleğe Alma
- Ölçeği Genişletme Hataları Toplamı
- Ölçek Genişletme Hataları/Sn
- Ölçek Genişletme Gönderme Kuyruğu Uzunluğu
Bu sayaçların neleri ölçteğe ilişkin daha fazla bilgi için bkz. Azure Service Bus ile SignalR ÖlçeğiNi Genişletme.
Diğer performans sayaçlarını kullanma
Aşağıdaki performans sayaçları, uygulamanızın performansını izlemede de yararlı olabilir.
Bellek
- Tüm Yığınlardaki .NET CLR Bellek# baytları (w3wp için)
ASP.NET
- ASP.NET\Geçerli İstekler
- ASP.NET\Kuyruğa Alındı
- ASP.NET\Reddedildi
CPU
- İşlemci Bilgileri\İşlemci Süresi
TCP/IP
- TCPv6/Kurulan Bağlantılar
- TCPv4/Kurulan Bağlantılar
Web Hizmeti
- Web Hizmeti\Geçerli Bağlantılar
- Web Hizmeti\En Fazla Bağlantı Sayısı
İş Parçacığı Oluşturma
- Geçerli mantıksal İş Parçacıklarının .NET CLR LocksAndThreads#
- Geçerli fiziksel İş Parçacıklarının .NET CLR KilitleriVe İş Parçacıkları#
Diğer Kaynaklar
performans izleme ve ayarlama ASP.NET hakkında daha fazla bilgi için aşağıdaki konulara bakın:
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin