Sdílet prostřednictvím


Výkon aplikace SignalR (SignalR 1.x)

Patrick Fletcher

Upozornění

Tato dokumentace není určená pro nejnovější verzi služby SignalR. Podívejte se na ASP.NET Core SignalR.

Toto téma popisuje, jak navrhovat, měřit a vylepšovat výkon v aplikaci SignalR.

Nedávnou prezentaci týkající se výkonu a škálování služby SignalR najdete v tématu Škálování webu v reálném čase pomocí ASP.NET SignalR.

Toto téma obsahuje následující oddíly:

Na co dát pozor při navrhování

Tato část popisuje vzory, které je možné implementovat při návrhu aplikace SignalR, aby se zajistilo, že generování zbytečného síťového provozu nebude bránit výkonu.

Frekvence zpráv o omezování

Dokonce i v aplikaci, která odesílá zprávy s vysokou frekvencí (například herní aplikace v reálném čase), většina aplikací nemusí posílat více než několik zpráv za sekundu. Aby se snížil objem provozu, který každý klient generuje, může být implementována smyčka zpráv, která fronty a posílá zprávy ne častěji, než je pevná rychlost (to znamená, že až určitý počet zpráv bude odeslán každou sekundu, pokud existují zprávy v daném časovém intervalu, které mají být odeslány). Ukázkovou aplikaci, která omezuje zprávy na určitou rychlost (z klienta i serveru), najdete v tématu Vysokofrekvenční realtime s využitím SignalR.

Zmenšení velikosti zprávy

Velikost zprávy SignalR můžete zmenšit zmenšením velikosti serializovaných objektů. Pokud v kódu serveru odesíláte objekt, který obsahuje vlastnosti, které není nutné přenášet, zabráníte serializaci těchto vlastností pomocí atributu JsonIgnore . Názvy vlastností jsou také uloženy ve zprávě; Názvy vlastností lze zkrátit pomocí atributu .JsonProperty Následující ukázka kódu ukazuje, jak vyloučit vlastnost z odesílání do klienta a jak zkrátit názvy vlastností:

Kód serveru .NET, který demonstruje atribut JsonIgnore pro vyloučení dat z odesílání do klienta a atribut JsonProperty pro zmenšení velikosti zprávy

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; }
}

Aby se zachovala čitelnost a udržovatelnost v klientském kódu, je možné po přijetí zprávy přemapovat zkrácené názvy vlastností na uživatelsky přívětivé názvy. Následující ukázka kódu ukazuje jeden z možných způsobů, jak přemapovat zkrácené názvy na delší, a to definováním kontraktu zprávy (mapování) a použitím reMap funkce pro použití kontraktu na optimalizovanou třídu zpráv:

Kód JavaScriptu na straně klienta, který přemapuje zkrácené názvy vlastností na názvy čitelné pro člověka

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
};

Stejným způsobem se dají zkrátit i názvy ve zprávách od klienta na server.

Snížení nároků na paměť (tj. množství paměti využité pro zprávu) objektu zprávy může také zlepšit výkon. Pokud například není potřeba short úplný rozsah , int můžete místo toho použít nebo byte .

Vzhledem k tomu, že se zprávy ukládají ve sběrnici zpráv v paměti serveru, může snížení velikosti zpráv také vyřešit problémy s pamětí serveru.

Optimalizace výkonu serveru SignalR

Následující nastavení konfigurace můžete použít k vyladění serveru za účelem zajištění lepšího výkonu v aplikaci SignalR. Obecné informace o tom, jak zvýšit výkon v aplikaci ASP.NET, najdete v tématu Zlepšení výkonu ASP.NET.

Nastavení konfigurace služby SignalR

  • DefaultMessageBufferSize: Ve výchozím nastavení uchovává SignalR v paměti 1000 zpráv na rozbočovač a připojení. Pokud se používají velké zprávy, může to vyvolat problémy s pamětí, které lze zmírnit snížením této hodnoty. Toto nastavení lze nastavit v obslužné Application_Start rutině události v aplikaci ASP.NET nebo v Configuration metodě třídy spouštění OWIN v místní aplikaci. Následující ukázka ukazuje, jak tuto hodnotu snížit, aby se snížily nároky na paměť vaší aplikace, aby se snížila velikost využité paměti serveru:

    Kód serveru .NET v souboru Global.asax pro snížení výchozí velikosti vyrovnávací paměti zpráv

    protected void Application_Start(object sender, EventArgs e)
    {
        GlobalHost.Configuration.DefaultMessageBufferSize = 500;
    }
    

Nastavení konfigurace služby IIS

  • Maximální počet souběžných požadavků na aplikaci: Zvýšením počtu souběžných požadavků služby IIS se zvýší počet serverových prostředků dostupných pro obsluhu požadavků. Výchozí hodnota je 5000; Pokud chcete toto nastavení zvýšit, spusťte na příkazovém řádku se zvýšenými oprávněními následující příkazy:

    cd %windir%\System32\inetsrv\
    appcmd.exe set config /section:system.webserver/serverRuntime 
            /appConcurrentRequestLimit:10000
    

nastavení konfigurace ASP.NET

Tato část obsahuje konfigurační nastavení, která se dají nastavit v aspnet.config souboru. Tento soubor se nachází na jednom ze dvou umístění v závislosti na platformě:

  • %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet.config
  • %windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet.config

ASP.NET nastavení, která mohou zlepšit výkon služby SignalR, zahrnují následující:

  • Maximální počet souběžných požadavků na procesor: Zvýšením tohoto nastavení můžete zmírnit kritické body výkonu. Pokud chcete toto nastavení zvýšit, přidejte do aspnet.config souboru následující nastavení konfigurace:

    <?xml version="1.0" encoding="UTF-8" ?>
    <configuration>
        <system.web>
            <applicationPool maxConcurrentRequestsPerCPU="20000" />
        </system.web>
    </configuration>
    
  • Limit fronty požadavků: Pokud celkový počet připojení překročí maxConcurrentRequestsPerCPU nastavení, ASP.NET začne omezovat požadavky pomocí fronty. Pokud chcete zvětšit velikost fronty, můžete nastavení zvětšit requestQueueLimit . Chcete-li to provést, přidejte následující nastavení konfigurace do processModel uzlu v config/machine.config (místo aspnet.config):

    <processModel autoConfig="false" requestQueueLimit="250000" />
    

Řešení potíží s výkonem

Tato část popisuje způsoby, jak ve vaší aplikaci najít kritické body výkonu.

Ověření, že se používá protokol WebSocket

I když SignalR může pro komunikaci mezi klientem a serverem používat různé přenosy, protokol WebSocket nabízí významnou výkonnostní výhodu a měl by se použít, pokud ji klient a server podporují. Pokud chcete zjistit, jestli váš klient a server splňují požadavky na protokol WebSocket, přečtěte si téma Přenosy a záložní operace. Pokud chcete zjistit, jaký přenos se používá ve vaší aplikaci, můžete použít vývojářské nástroje prohlížeče a prozkoumat protokoly a zjistit, jaký přenos se používá pro připojení. Informace o používání nástrojů pro vývoj prohlížečů v Internet Exploreru a Chromu najdete v tématu Přenosy a záložní řešení.

Použití čítačů výkonu SignalR

Tato část popisuje, jak povolit a používat čítače výkonu Microsoft.AspNet.SignalR.Utils SignalR, které najdete v balíčku.

Instalace signalr.exe

Čítače výkonu lze na server přidat pomocí nástroje s názvem SignalR.exe. Chcete-li nainstalovat tento nástroj, postupujte takto:

  1. V sadě Visual Studio vyberte Nástroje> Správce >balíčků NuGetSpravovat balíčky NuGet pro řešení.

  2. Vyhledejte signalr.utils a vyberte Nainstalovat.

    Snímek obrazovky znázorňující zvýrazněné nástroje příkazového řádku Microsoft A S P dot NET Signal R Utilities pro A S P dot NET Signal R

  3. Přijměte licenční smlouvu pro instalaci balíčku.

  4. SignalR.exe se nainstaluje do <project folder>/packages/Microsoft.AspNet.SignalR.Utils.<version>/tools.

Instalace čítačů výkonu pomocí SignalR.exe

Pokud chcete nainstalovat čítače výkonu SignalR, spusťte SignalR.exe na příkazovém řádku se zvýšenými oprávněními s následujícím parametrem:

SignalR.exe ipc

Pokud chcete odebrat čítače výkonu SignalR, spusťte SignalR.exe na příkazovém řádku se zvýšenými oprávněními s následujícím parametrem:

SignalR.exe upc

Čítače výkonu SignalR

Balíček nástrojů nainstaluje následující čítače výkonu. Čítače Celkem měří počet událostí od posledního restartování fondu aplikací nebo serveru.

Metriky připojení

Následující metriky měří události doby života připojení, ke kterým dochází. Další informace najdete v tématu Vysvětlení a zpracování událostí doby života připojení.

  • Připojená připojení
  • Znovu připojená připojení
  • Odpojená připojení
  • Připojení – aktuální

Metriky zpráv

Následující metriky měří provoz zpráv vygenerovaný službou SignalR.

  • Počet přijatých zpráv připojení
  • Počet odeslaných zpráv připojení
  • Přijaté zprávy připojení za sekundu
  • Odeslané zprávy připojení za sekundu

Metriky sběrnice zpráv

Následující metriky měří provoz přes interní sběrnici zpráv Služby SignalR, což je fronta, ve které jsou umístěny všechny příchozí a odchozí zprávy služby SignalR. Zpráva se publikuje při odeslání nebo vysílání. Odběratel v tomto kontextu je odběr na sběrnici zpráv; to by se mělo rovnat počtu klientů plus samotnému serveru. Přidělený pracovní proces je komponenta, která odesílá data do aktivních připojení; Zaneprázdněný pracovní proces je ten, který aktivně odesílá zprávu.

  • Celkový počet přijatých zpráv ve sběrnici zpráv
  • Přijaté zprávy sběrnice zpráv za sekundu
  • Počet publikovaných zpráv ve sběrnici zpráv
  • Publikované zprávy sběrnice zpráv/s
  • Aktuální odběratelé sběrnice zpráv
  • Celkový počet odběratelů sběrnice zpráv
  • Odběratelé sběrnice zpráv/s
  • Přidělení pracovníci služby Message Bus
  • Zaneprázdnění pracovníci služby Message Bus
  • Aktuální témata sběrnice zpráv

Metriky chyb

Následující metriky měří chyby generované provozem zpráv SignalR. K chybám řešení centra dochází v případě, že nejde vyřešit metodu rozbočovače nebo rozbočovače. Chyby volání centra jsou výjimky vyvolané při vyvolání metody centra. Chyby přenosu jsou chyby připojení vyvolané během požadavku HTTP nebo odpovědi.

  • Chyby: All Total
  • Chyby: Vše/s
  • Chyby: Řešení centra celkem
  • Chyby: Řešení rozbočovače za sekundu
  • Chyby: Celkový počet volání centra
  • Chyby: Vyvolání centra za sekundu
  • Chyby: Celkový přenos
  • Chyby: Přenos za sekundu

Metriky škálování na více instancí

Následující metriky měří provoz a chyby generované poskytovatelem škálování. Stream v tomto kontextu je jednotka škálování používaná poskytovatelem škálování; toto je tabulka, pokud se používá SQL Server, téma, pokud se používá Service Bus, a předplatné, pokud se používá Redis. Ve výchozím nastavení se používá jenom jeden datový proud, ale to se dá zvýšit konfigurací na SQL Server a Service Bus. Vyrovnávací datový proud je ten, který vstoupil do chybného stavu; pokud je datový proud ve stavu selhání, všechny zprávy odeslané do backplane okamžitě selžou, dokud datový proud už nebude chybný. Délka fronty odeslání je počet zpráv, které byly publikovány, ale ještě nebyly odeslány.

  • Přijaté zprávy sběrnice zpráv se škálováním na více instancí/s
  • Horizontální navýšení kapacity datových proudů celkem
  • Horizontální navýšení kapacity datových proudů – otevřené
  • Ukládání datových proudů na více instancí do vyrovnávací paměti
  • Celkový počet chyb škálování na více instancí
  • Chyby horizontálního navýšení kapacity za sekundu
  • Škálování na délku fronty odeslání

Další informace o tom, co tyto čítače měří, najdete v tématu Škálování služby SignalR s Azure Service Bus.

Použití jiných čítačů výkonu

Následující čítače výkonu můžou být užitečné také při monitorování výkonu aplikace.

Memory (Paměť)

  • .NET CLR Memory# v bajtech ve všech haldách (pro w3wp)

ASP.NET

  • ASP.NET\Requests Current
  • ASP.NET\Ve frontě
  • ASP.NET\Zamítnuto

Procesor

  • Informace o procesoru\Čas procesoru

TCP/IP

  • TCPv6 / Vytvořená připojení
  • TCPv4 / Vytvořená připojení

Webová služba

  • Webová služba\Aktuální připojení
  • Webová služba\Maximální počet připojení

Dělení na vlákna

  • .NET CLR LocksAndThreads # aktuálních logických vláken
  • Zámky .NET CLRA # vláken aktuálních fyzických vláken

Další prostředky

Další informace o monitorování výkonu a ladění ASP.NET najdete v následujících tématech: