SignalR パフォーマンス (SignalR 1.x)SignalR Performance (SignalR 1.x)

提供者: Patrick Fletcherby Patrick Fletcher


この記事では、ASP.NET SignalR を指します。This article refers to ASP.NET SignalR. SignalR を使用して、Java、Node.js、またはサーバーレス シナリオでは、リアルタイムのシナリオを有効にする方法と思う場合を見てASP.NET Core SignalRします。If you're thinking about using SignalR to enable real-time scenarios with Java, Node.js, or in a serverless scenario, take a look at ASP.NET Core SignalR. 既に ASP.NET SignalR を使用した場合を見て、のバージョンの違いバージョンの違いと ASP.NET Core SignalR での機能強化を理解するページ。If you've already used ASP.NET SignalR, take a look at the version differences page to understand the differences in the versions and the improvements in ASP.NET Core SignalR. 最後に、Microsoft Azure でリアルタイム アプリを実行することがわかっている場合を見て、 Azure SignalR サービスなど、アプリを必要とすると、クラウド ベースのスケール アウトを提供します。Finally, if you know you'll be running your real-time apps in Microsoft Azure, take a look at the Azure SignalR Service, as it provides cloud-based scale-out once your apps need it.

このトピックでは、ための設計、計測、および SignalR アプリケーションのパフォーマンスを向上する方法について説明します。This topic describes how to design for, measure, and improve performance in a SignalR application.

SignalR パフォーマンスとスケーリングに最近行ったプレゼンテーションは、次を参照してください。 ASP.NET SignalR によるリアルタイムの Web スケールします。For a recent presentation on SignalR performance and scaling, see Scaling the Real-time Web with ASP.NET SignalR.

このトピックは、次のセクションで構成されています。This topic contains the following sections:

設計に関する考慮事項Design considerations

このセクションでは、不要なネットワーク トラフィックを生成することによってパフォーマンスが低下しないことを確認するには SignalR アプリケーションのデザイン時に実装できるパターンについて説明します。This section describes patterns that can be implemented during the design of a SignalR application, to ensure that performance is not being hindered by generating unnecessary network traffic.

メッセージの頻度を調整Throttling message frequency

を (リアルタイムのゲーム アプリケーションの場合) などの高頻度でメッセージを送信するアプリケーションであっても、ほとんどのアプリケーションは、1 秒間に複数のメッセージを送信する必要はありません。Even in an application that sends out messages at a high frequency (such as a realtime gaming application), most applications don't need to send more than a few messages a second. 各クライアントを生成するトラフィックの量を減らすためには、メッセージ ループを実装するキューおよび送信メッセージありませんより固定レートよりも頻繁に (つまり、メッセージ数まで送信されます 1 秒ごとに、その時点でのメッセージがある場合terval 送信する)。To reduce the amount of traffic that each client generates, a message loop can be implemented that queues and sends out messages no more frequently than a fixed rate (that is, up to a certain number of messages will be sent every second, if there are messages in that time interval to be sent). メッセージを (クライアントとサーバーの両方) から、一定のレートを調整するサンプル アプリケーションの場合、次を参照してください。 SignalR による高頻度リアルタイム メッセージングします。For a sample application that throttles messages to a certain rate (from both client and server), see High-Frequency Realtime with SignalR.

メッセージのサイズを縮小します。Reducing message size

SignalR メッセージのサイズを小さくには、シリアル化されたオブジェクトのサイズを小さきます。You can reduce the size of a SignalR message by reducing the size of your serialized objects. サーバー コードでは、転送する必要がないプロパティを格納しているオブジェクトを送信する場合は妨げられるこれらのプロパティを使用してシリアル化される、JsonIgnore属性。In server code, if you're sending an object that contains properties that don't need to be transmitted, prevent those properties from being serialized by using the JsonIgnore attribute. プロパティの名前がメッセージにも格納されています。使用してプロパティの名前を短縮できます、JsonProperty属性。The names of properties are also stored in the message; the names of properties can be shortened using the JsonProperty attribute. 次のコード サンプルでは、プロパティ名を短縮する方法と、クライアントに送信されてからプロパティを除外する方法を示しています。The following code sample demonstrates how to exclude a property from being sent to the client, and how to shorten property names:

.NET サーバー コードから、クライアントに送信されるデータを除外する JsonIgnore 属性とメッセージのサイズを小さく JsonProperty 属性を説明します。.NET server code that demonstrates the JsonIgnore attribute to exclude data from being sent to the client, and the JsonProperty attribute to reduce message size

using Newtonsoft.Json; 
using System; 
public class ShapeModel
    public double Left { get; set; }
    public double Top { get; set; }
    // We don't want the client to get the "LastUpdatedBy" property
    public string LastUpdatedBy { get; set; }

読みやすさを維持するために、クライアント コードで保守性、プロパティの省略名は、わかりやすいにマップが変更された名、メッセージが受信されるとします。In order to retain readability/ maintainability in the client code, the abbreviated property names can be remapped to human-friendly names after the message is received. 次のコード サンプルに示します (マッピング) のメッセージ コントラクトを定義することより長いものを使用する簡略名を再マップの方法の 1 つを使用して、reMap最適化されたメッセージ クラスに、コントラクトを適用する関数。The following code sample demonstrates one possible way of remapping shortened names to longer ones, by defining a message contract (mapping), and using the reMap function to apply the contract to the optimized message class:

クライアント側の JavaScript コードを再配置するには、人間が判読できる名前のプロパティ名を短縮します。Client-side JavaScript code that remaps shortened property names to human-readable names

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

名前は、同じメソッドを使用しても、サーバーに、クライアントからのメッセージで短縮できます。Names can be shortened in messages from the client to the server as well, using the same method.

(つまり、メッセージに使用されるメモリ量) のメモリ使用量の削減、メッセージのオブジェクトもパフォーマンスが向上します。Reducing the memory footprint (that is, the amount of memory used for the message) of the message object can also improve performance. たとえば場合は、さまざまな、intは必要ありません、shortまたはbyte代わりに使用できます。For example, if the full range of an int is not needed, a short or byte can be used instead.

メッセージがメッセージのサイズを減らし、サーバーのメモリにメッセージ バス内で格納されるためは、サーバー メモリの問題を解決でこともできます。Since messages are stored in the message bus in server memory, reducing the size of messages can also address server memory issues.

SignalR サーバーのパフォーマンスのチューニングTuning your SignalR server for performance

SignalR アプリケーションでパフォーマンスの向上のため、サーバーをチューニングするは、次の構成設定を使用できます。The following configuration settings can be used to tune your server for better performance in a SignalR application. ASP.NET アプリケーションのパフォーマンスを向上させる方法の概要については、次を参照してください。 ASP.NET パフォーマンスの向上します。For general information on how to improve performance in an ASP.NET application, see Improving ASP.NET Performance.

SignalR の構成設定SignalR configuration settings

  • DefaultMessageBufferSize:既定では、SignalR は 1000 メッセージごとの接続のハブあたりのメモリに保持されます。DefaultMessageBufferSize: By default, SignalR retains 1000 messages in memory per hub per connection. サイズの大きいメッセージを使用している場合は、この値を減らすことで緩和できるメモリの問題を作成この可能性があります。If large messages are being used, this may create memory issues which can be alleviated by reducing this value. この設定を設定することができます、Application_Startまたは ASP.NET アプリケーションでのイベント ハンドラー、Configurationで自己ホスト型アプリケーションの OWIN startup クラスのメソッド。This setting can be set in the Application_Start event handler in an ASP.NET application, or in the Configuration method of an OWIN startup class in a self-hosted application. 次の例では、サーバーのメモリ使用量を削減するために、アプリケーションのメモリ使用量を減らすためにこの値を小さく方法を示しています。The following sample demonstrates how to reduce this value in order to reduce the memory footprint of your application in order to reduce the amount of server memory used:

    既定のメッセージ バッファーのサイズを減らすため、Global.asax で .NET サーバー コード.NET server code in Global.asax for decreasing default message buffer size

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

IIS の構成設定IIS configuration settings

  • アプリケーションごとの最大同時要求:IIS の同時実行の数を増やす要求の要求の処理の使用可能なサーバー リソースが増加します。Max concurrent requests per application: Increasing the number of concurrent IIS requests will increase server resources available for serving requests. 既定値は 5000 です。この設定を向上させるのに管理者特権でコマンド プロンプトで、次のコマンドを実行します。The default value is 5000; to increase this setting, execute the following commands in an elevated command prompt:

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

ASP.NET 構成の設定ASP.NET configuration settings

このセクションにはで設定できる構成設定が含まれています、aspnet.configファイル。This section includes configuration settings that can be set in the aspnet.config file. このファイルはプラットフォームに応じて、2 つの場所のいずれかであります。This file is found in one of two locations, depending on platform:

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

SignalR パフォーマンスを向上させることがあります ASP.NET の設定を以下に示します。ASP.NET settings that may improve SignalR performance include the following:

  • CPU ごとの同時要求の最大:この設定を増やすとパフォーマンスのボトルネックを軽減することがあります。Maximum concurrent requests per CPU: Increasing this setting may alleviate performance bottlenecks. この設定を大きくには、次の構成設定を追加、aspnet.configファイル。To increase this setting, add the following configuration setting to the aspnet.config file:

    <?xml version="1.0" encoding="UTF-8" ?>
            <applicationPool maxConcurrentRequestsPerCPU="20000" />
  • 要求キューの制限:接続の合計数を超える場合、maxConcurrentRequestsPerCPU設定すると、ASP.NET は開始キューを使用して要求を調整します。Request Queue Limit: When the total number of connections exceeds the maxConcurrentRequestsPerCPU setting, ASP.NET will start throttling requests using a queue. キューのサイズを増やすを増やすことができます、requestQueueLimit設定します。To increase the size of the queue, you can increase the requestQueueLimit setting. これを行うには、次の構成設定を追加、processModelノードconfig/machine.config(なくaspnet.config)。To do this, add the following configuration setting to the processModel node in config/machine.config (rather than aspnet.config):

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

パフォーマンスの問題のトラブルシューティングTroubleshooting performance issues

このセクションでは、アプリケーションのパフォーマンスのボトルネックを見つける方法について説明します。This section describes ways to find performance bottlenecks in your application.

WebSocket が使用されていることを確認します。Verifying that WebSocket is being used

SignalR は、さまざまなトランスポートを使用して、クライアントとサーバー間の通信、WebSocket は、パフォーマンスに大きなメリットが提供し、クライアントとサーバーがサポートしている場合に使用する必要があります。While SignalR can use a variety of transports for communication between client and server, WebSocket offers a significant performance advantage, and should be used if the client and server support it. 調べるには、クライアントとサーバーが WebSocket の要件を満たしているかどうかは、次を参照してください。トランスポートとフォールバックします。To determine if your client and server meet the requirements for WebSocket, see Transports and Fallbacks. どのようなトランスポートは、アプリケーションで使用されているを確認するのには、ブラウザー開発者ツールを使用し、トランスポートが接続に使用されているログを調べてできます。To determine what transport is being used in your application, you can use the browser developer tools, and examine the logs to see what transport is being used for the connection. Internet Explorer と Chrome ブラウザーの開発ツールを使用する方法の詳細については、次を参照してください。トランスポートとフォールバックします。For information on using the browser development tools in Internet Explorer and Chrome, see Transports and Fallbacks.

SignalR パフォーマンス カウンターの使用Using SignalR performance counters

有効にして、SignalR パフォーマンス カウンターを使用する方法を説明にある、Microsoft.AspNet.SignalR.Utilsパッケージ。This section describes how to enable and use SignalR performance counters, found in the Microsoft.AspNet.SignalR.Utils package.

Signalr.exe をインストールします。Installing signalr.exe

SignalR.exe というユーティリティを使用してサーバーには、パフォーマンス カウンターを追加できます。Performance counters can be added to the server using a utility called SignalR.exe. このユーティリティをインストールするには、次の手順を実行します。To install this utility, follow these steps:

  1. Visual Studio で、次のように選択しますツール > NuGet パッケージ マネージャー > ソリューションの NuGet パッケージの管理。In Visual Studio, select Tools > NuGet Package Manager > Manage NuGet Packages for Solution

  2. 検索signalr.utilsインストールを選択します。Search for signalr.utils, and select Install.

  3. パッケージをインストールするライセンス条項に同意します。Accept the license agreement to install the package.

  4. SignalR.exe にインストールされる<project folder>/packages/Microsoft.AspNet.SignalR.Utils.<version>/toolsします。SignalR.exe will be installed to <project folder>/packages/Microsoft.AspNet.SignalR.Utils.<version>/tools.

SignalR.exe でパフォーマンス カウンターをインストールします。Installing performance counters with SignalR.exe

SignalR パフォーマンス カウンターをインストールするには、次のパラメーターを使用して、管理者特権でコマンド プロンプトで SignalR.exe を実行します。To install SignalR performance counters, run SignalR.exe in an elevated command prompt with the following parameter:

SignalR.exe ipc

SignalR パフォーマンス カウンターを削除するには、次のパラメーターを使用して、管理者特権でコマンド プロンプトで SignalR.exe を実行します。To remove SignalR performance counters, run SignalR.exe in an elevated command prompt with the following parameter:

SignalR.exe upc

SignalR パフォーマンス カウンターSignalR Performance counters

ユーティリティ パッケージは、次のパフォーマンス カウンターをインストールします。The utilities package installs the following performance counters. "Total"カウンターは、最後のアプリケーション プールまたはサーバーを再起動するために、イベントの数を計測します。The "Total" counters measure the number of events since the last application pool or server restart.

接続メトリックConnection metrics

次のメトリックは、発生する接続の有効期間イベントを測定します。The following metrics measure the connection lifetime events that occur. 詳細については、次を参照してください。接続の有効期間イベントの処理と理解します。For more information, see Understanding and Handling Connection Lifetime Events.

  • 接続されている接続Connections Connected
  • 接続の再接続Connections Reconnected
  • 接続の切断Connections Disconnected
  • 現在の接続Connections Current

メッセージ メトリックスMessage metrics

次のメトリックは、SignalR によって生成されるメッセージ トラフィックを測定します。The following metrics measure the message traffic generated by SignalR.

  • 接続メッセージの受信した合計Connection Messages Received Total
  • 合計送信接続メッセージConnection Messages Sent Total
  • 接続を受信メッセージ数/秒Connection Messages Received/Sec
  • 接続が送信メッセージ/秒Connection Messages Sent/Sec

メッセージ バスのメトリックMessage bus metrics

次のメトリックは、内部の SignalR メッセージ バス、すべての受信および送信の SignalR メッセージの配置のキューを通過するトラフィックを測定します。The following metrics measure traffic through the internal SignalR message bus, the queue in which all incoming and outgoing SignalR messages are placed. メッセージがPublishedが送信またはブロードキャストします。A message is Published when it is sent or broadcast. Aサブスクライバーメッセージ バス上のサブスクリプションは、このコンテキストでは、クライアントとサーバー自体の数と等しくなります。A Subscriber in this context is a subscription on the message bus; this should equal the number of clients plus the server itself. 割り当てられたワーカー ; のアクティブな接続にデータを送信するコンポーネントをビジー状態の Workerがアクティブにメッセージを送信する 1 つです。An Allocated Worker is a component that sends data to active connections; a Busy Worker is one that is actively sending a message.

  • メッセージ バス メッセージの受信の合計数Message Bus Messages Received Total
  • メッセージ バス メッセージの受信/秒Message Bus Messages Received/Sec
  • メッセージ バスのメッセージの合計を発行します。Message Bus Messages Published Total
  • メッセージ バス メッセージの 1 秒あたりの発行Message Bus Messages Published/Sec
  • メッセージ バスのサブスクライバーの現在Message Bus Subscribers Current
  • メッセージ バスのサブスクライバーの合計Message Bus Subscribers Total
  • メッセージ バスのサブスクライバー/秒Message Bus Subscribers/Sec
  • メッセージ バスには、ワーカーが割り当てられています。Message Bus Allocated Workers
  • メッセージ バスのビジー状態のワーカーMessage Bus Busy Workers
  • メッセージ バスのトピックの現在Message Bus Topics Current

誤差のメトリックError metrics

次のメトリックは、SignalR メッセージ トラフィックによって生成されたエラーを測定します。The following metrics measure errors generated by SignalR message traffic. ハブの解決ハブまたはハブのメソッドは解決できない場合にエラーが発生します。Hub Resolution errors occur when a hub or hub method cannot be resolved. ハブ呼び出しエラーは、ハブ メソッドの呼び出し中にスローされる例外。Hub Invocation errors are exceptions thrown while invoking a hub method. トランスポートエラーは、接続エラーの HTTP 要求または応答時にスローされます。Transport errors are connection errors thrown during an HTTP request or response.

  • エラー:すべての合計Errors: All Total
  • エラー:1 秒あたりのすべてErrors: All/Sec
  • エラー:ハブの解像度の合計Errors: Hub Resolution Total
  • エラー:ハブの解像度/秒Errors: Hub Resolution/Sec
  • エラー:ハブ呼び出し合計Errors: Hub Invocation Total
  • エラー:ハブ呼び出し数/秒Errors: Hub Invocation/Sec
  • エラー:トランスポートの合計Errors: Transport Total
  • エラー:1 秒あたりのトランスポートErrors: Transport/Sec

スケール アウトのメトリックScaleout metrics

次のメトリックは、トラフィックと、スケール アウト プロバイダーによって生成されたエラーを測定します。The following metrics measure traffic and errors generated by the scaleout provider. A Streamこのコンテキストでは、スケール ユニットはスケール アウト プロバイダーで使用される。 これは SQL Server を使用する場合は、テーブル、Service Bus を使用する場合は、トピックとサブスクリプション Redis を使用する場合。A Stream in this context is a scale unit used by the scaleout provider; this is a table if SQL Server is used, a Topic if Service Bus is used, and a Subscription if Redis is used. 既定では、1 つのみのストリームを使用するが、これは、SQL サーバーと Service Bus の構成を増やすことができます。By default, only one stream is used, but this can be increased through configuration on SQL Server and Service Bus. Aバッファリングストリームが途中終了状態に入った 1 つ。 ストリームが不要になったエラーになるまでにすぐにバック プレーンに送信されるすべてのメッセージはエラー ストリームが途中終了状態のときは、にします。A Buffering stream is one that has entered a faulted state; when the stream is in the faulted state, all messages sent to the backplane will fail immediately until the stream is no longer faulting. Send Queue Lengthは送信されているが、まだ送信されるメッセージの数です。The Send Queue Length is the number of messages that have been posted but not yet sent.

  • スケール アウト メッセージ バス メッセージの受信/秒Scaleout Message Bus Messages Received/Sec
  • スケール アウトのストリームの合計Scaleout Streams Total
  • スケール アウトのストリームを開くScaleout Streams Open
  • スケール アウト ストリームのバッファリングScaleout Streams Buffering
  • スケール アウト エラーの合計Scaleout Errors Total
  • スケール アウト エラー/秒Scaleout Errors/Sec
  • スケール アウト送信キューの長さScaleout Send Queue Length

これらのカウンターの測定の詳細については、次を参照してください。 Azure Service Bus による SignalR スケール アウトします。For more information on what these counters are measuring, see SignalR Scaleout with Azure Service Bus.

その他のパフォーマンス カウンターの使用Using other performance counters

次のパフォーマンス カウンターも、アプリケーションのパフォーマンスの監視に役立つ場合があります。The following performance counters may also be useful in monitoring your application's performance.


  • .NET CLR メモリとヒープ (w3wp) のすべてのバイト数.NET CLR Memory# bytes in all Heaps (for w3wp)


  • ASP.NET\Requests CurrentASP.NET\Requests Current
  • ASP.NET\QueuedASP.NET\Queued
  • ASP.NET\RejectedASP.NET\Rejected


  • プロセッサ時間の Information\ProcessorProcessor Information\Processor Time


  • TCPv6/接続の確立TCPv6/Connections Established
  • TCPv4/接続の確立TCPv4/Connections Established

Web サービスWeb Service

  • Web service \current ConnectionsWeb Service\Current Connections
  • Web Service\Maximum 接続Web Service\Maximum Connections


  • .NET CLR LocksAndThreads#の現在の論理スレッド.NET CLR LocksAndThreads# of current logical Threads
  • .NET CLR LocksAnd スレッド#物理スレッドの現在の.NET CLR LocksAnd Threads# of current physical Threads

その他の参照情報Other Resources

ASP.NET パフォーマンスの監視とチューニングの詳細については、次のトピックを参照してください。For more information on ASP.NET performance monitoring and tuning, see the following topics: