SignalR Performansı
Patrick Fletcher tarafından
Uyarı
Bu belgeler SignalR'nin en son sürümüne yönelik değildir. SignalR ASP.NET Core göz atın.
Bu konu başlığında SignalR uygulamasında performansın nasıl tasarlandığı, ölçüldiği ve artırıldığı açıklanmaktadır.
Bu konuda kullanılan yazılım sürümleri
- Visual Studio 2013
- .NET 4.5
- SignalR sürüm 2
Bu konunun önceki sürümleri
SignalR'nin önceki sürümleri hakkında bilgi için bkz. SignalR Eski Sürümleri.
Sorular ve yorumlar
Lütfen bu öğreticiyi nasıl beğendiğiniz ve sayfanın altındaki yorumlarda neleri geliştirebileceğimiz hakkında geri bildirim bırakın. Öğreticiyle doğrudan ilgili olmayan sorularınız varsa bunları ASP.NET SignalR forumunu veya StackOverflow.com gönderebilirsiniz.
SignalR performansı ve ölçeklendirmesi hakkında en son 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 engellenmemesini sağlamak 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ç iletiden fazlasını 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 (hem istemci hem de sunucudan) kısıtlayan örnek bir uygulama için bkz. SignalR ile Yüksek Frekanslı Gerçek Zamanlı.
İleti boyutunu küçültme
Seri hale getirilmiş nesnelerinizin boyutunu küçülterek SignalR iletisinin boyutunu küçültebilirsiniz. Sunucu kodunda, aktarılması gerekmeyen özellikler içeren bir nesne gönderiyorsanız, özniteliği kullanılarak bu özelliklerin JsonIgnore
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 gösteren .NET sunucu kodu ve ileti boyutunu küçültmek için JsonProperty özniteliği
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 insan dostu 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şmeyi 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ı insanlar tarafından okunabilir 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 öğesinin 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 azaltmak 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. bir ASP.NET uygulamasında performansı geliş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 bellekte 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österir:Varsayılan ileti arabelleği boyutunu azaltmak için Startup.cs dosyasında .NET sunucu kodu
public class Startup { public void Configuration(IAppBuilder app) { // Any connection or hub wire up and configuration should go here GlobalHost.Configuration.DefaultMessageBufferSize = 500; app.MapSignalR(); } }
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ılabilecek 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
ApplicationPool QueueLength: Bu, uygulama havuzu için kuyrukları Http.sys en fazla istek sayısıdır. Kuyruk dolu olduğunda yeni istekler 503 "Hizmet Kullanılamıyor" yanıtı alır. Varsayılan değer 1000'dir.
Uygulamanızı barındıran uygulama havuzunda çalışan işlemi için kuyruk uzunluğunu kısaltmak bellek kaynaklarını korur. Daha fazla bilgi için bkz. Uygulama Havuzlarını Yönetme, Ayarlama ve Yapılandırma.
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ı hafifletebilir. 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
aşağıdaki yapılandırma ayarını ekleyin (yerineaspnet.config
):<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 taşımanın kullanıldığını belirlemek için tarayıcı geliştirici araçlarını kullanabilir ve bağlantı için hangi taşımanı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'a
<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ıların Bağlantısı Kesildi
- 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
- Toplam Yayımlanan İleti Veri Yolu İletileri
- Yayımlanan İleti Veri Yolu İletileri/Sn
- İleti Veri Yolu Aboneleri Güncel
- İleti Veri Yolu Abonelerinin Toplamı
- İleti Veri Yolu Aboneleri/Sn
- İleti Veri Yolu Ayrılan Çalışanları
- İleti Veri Yolu Meşgul Çalışanları
- İleti Veri Yolu Konuları Geçerli
Hata ölçümleri
Aşağıdaki ölçümler SignalR ileti trafiği tarafından oluşturulan hataları ölçer. Hub veya hub yöntemi çözümlenemediğinde Hub Çözümleme hataları 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çeği 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. Her akış sıralı okuma ve yazma işlemleri sağlar; tek bir akış olası bir ölçek sorunu olduğundan, bu performans sorununu azaltmaya yardımcı olmak için akış sayısı artırılabilir. Birden çok akış kullanılırsa SignalR, belirli bir bağlantıdan gönderilen iletilerin sıralı olmasını sağlayacak şekilde iletileri bu akışlar arasında otomatik olarak dağıtır (parça).
MaxQueueLength ayarı SignalR tarafından tutulan ölçek genişletme gönderme kuyruğunun uzunluğunu denetler. Bunu 0'dan büyük bir değere ayarlamak, tüm iletileri yapılandırılan mesajlaşma arka planına birer birer gönderilmek üzere bir gönderme kuyruğuna yerleştirir. Kuyruğun boyutu yapılandırılan uzunluğun üzerine çıkarsa, kuyruktaki iletilerin sayısı yeniden ayardan az olana kadar gönderilecek sonraki çağrılar InvalidOperationException ile hemen başarısız olur. Uygulanan arka düzlemler genellikle kendi kuyruğa alma veya akış denetimine sahip olduğundan, kuyruğa alma varsayılan olarak devre dışıdır. SQL Server durumunda bağlantı havuzu, herhangi bir anda devam eden gönderme sayısını etkili bir şekilde sınırlar.
Varsayılan olarak, SQL Server ve Redis için yalnızca bir akış kullanılır, Service Bus için beş akış kullanılır ve kuyruğa alma devre dışı bırakılır, ancak bu ayarlar SQL Server ve Service Bus'ta yapılandırma yoluyla değiştirilebilir:
SQL Server arka düzlem için tablo sayısını ve kuyruk uzunluğunu yapılandırmaya yönelik .NET Sunucu Kodu
var connectionString = "(your connection string)";
var config = new SqlScaleoutConfiguration(connectionString) {
TableCount = 3,
MaxQueueLength = 50 };
GlobalHost.DependencyResolver.UseSqlServer(config);
Service Bus arka planı için konu sayısını ve kuyruk uzunluğunu yapılandırmak için .NET Sunucu Kodu
string connectionString = "(your connection string)";
var config = new ServiceBusScaleoutConfiguration(connectionString, "YourAppName") {
TopicCount = 3,
MaxQueueLength = 50 };
GlobalHost.DependencyResolver.UseServiceBus(config);
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 Gönder Uzunluğu, gönderilmiş ancak henüz gönderilmemiş ileti sayısıdır.
- Alınan Genişleme İleti Veri Yolu İletileri/Sn
- Ölçeği Genişletme Akışları Toplamı
- Ölçeği Genişletme Akışları Açık
- Ölçek Genişletme Akışlarını Arabelleğe Alma
- Ölçeği Genişletme Hataları Toplamı
- Genişleme 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\# bayt sayısı (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/Bağlantılar Kuruldu
- TCPv4/Bağlantılar Kuruldu
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 Kilitleri Ve İş Parçacıkları\#
- Geçerli fiziksel İş Parçacıklarının .NET CLR Kilitleri Ve İş 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