Aracılığıyla paylaş


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

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

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 shortbyte 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ırabilirsiniz requestQueueLimit . Bunu yapmak için düğümüne processModelconfig/machine.config aşağıdaki yapılandırma ayarını ekleyin (yerine aspnet.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:

  1. Visual Studio'da Araçlar>NuGet Paket Yöneticisi>Çözüm için NuGet Paketlerini Yönet'i seçin

  2. signalr.utils için arama yapın ve Yükle'yi seçin.

    Microsoft A S S P nokta NET Signal R Yardımcı Programları'nın seçili olduğunu gösteren ekran görüntüsü.

  3. Paketi yüklemek için lisans sözleşmesini kabul edin.

  4. SignalR.exe'a <project folder>/packages/Microsoft.AspNet.SignalR.Utils.<version>/toolsyü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: