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

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 shortbyte 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ırabilirsiniz requestQueueLimit . Bunu yapmak için düğümüne processModelconfig/machine.config (yerine) aspnet.configaş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:

  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.

    A S P nokta NET Signal R için Microsoft A S P nokta NET Signal R Yardımcı Programları Komut satırı yardımcı programlarını gösteren ekran görüntüsü vurgulanmış.

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

  4. SignalR.exe sürümüne <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ı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: