ASP.NETのサイトで、「SignalR Performance」ってサイトがあるので、そこに書かれてあることを見て見ましょう。
メッセージ頻度を制限する
メッセージの送信数が多くなりすぎないように、コードで制限をかけておきましょう。
通常は、毎秒メッセージ送信をしないといけないシステムはあまりありません。
その為、一度メッセージ送信後、次に送信するまで多少のWaitを入れちゃいましょう。
サンプルコードが、ここで提供されています。
setInterval(updateServerModel, updateRate);
メッセージサイズを減らす
シリアライズオブジェクトのサイズを減らすことでSignalRメッセージサイズを減らせます。
サーバーサイドでは、送信する必要がないプロパティは送信しないようにします。例えば、JsonIgnore属性を指定します。
プロパティ名を短くします。たとえば、JsonProperty属性を指定します。「Name」というプロパティを「N」で送信するなどです。
クライアントサイドでは、サイズを減らすためにNなどの一文字で送信されてきたものを、ミスしないように人が読みやすい名前に再マッピングしてもいいかもしれません。
var shapeModelContract = { l: "left", t: "top" };
DefaultMessageBufferSizeを設定する(SignalRの設定)
既定では、Hub毎コネクション毎に1000メッセージまでメモリに保持します。
大きなメッセージを扱う場合は、メモリ問題が発生するかもしれないので、この数字を減らしたほうが良いかもしれません。
この設定は、ASP.NETアプリケーションのApplication_Startイベントハンドラーで設定するか、OWINスタートアップクラスのConfigurationメソッドで定義します。
以下のコードは、メモリ使用量を減らすために値を変更したサンプルです。
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の設定)
コマンドプロンプトでMax concurrent requests per applicationを設定します。既定値は5000です。
cd %windir%\System32\inetsrv\ appcmd.exe set config /section:system.webserver/serverRuntime /appConcurrentRequestLimit:10000
アプリケーションプールのキューサイズ(IISの設定)
HTTP.sysが処理できるリクエスト数ApplicationPool QueueLengthの最大数を設定します。
キューが満杯になると、新しいリクエストには503 Service Unavailavleレスポンスを返します。既定値は1000です。この値は、サーバーのメモリ量と密接な関係があるのいで、メモリ量と相談して設定します。(参考:アプリケーションプールのチューニング)
CPUごとの最大同時リクエスト数の設定(ASP.NETの設定)
ASP.NETの設定は、aspnet.configを使用します。
このファイルは以下の場所に配置されています。
- %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet.config
- %windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet.config
この値がパフォーマンスボトルネックになる可能性があるので、値をあげることで緩和できます。
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<system.web>
<applicationPool maxConcurrentRequestsPerCPU="20000" />
</system.web>
</configuration>
リクエストキュー制限(ASP.NETの設定)
maxConcurrentRequestsPerCPU数を最大接続数が超えると、キューを使用してリクエストを制限します。キュー数を増やすには、requestQueueLimit 設定を使用します。
設定は、config/machine.configのprocessModelノードに設定を追加します。
<processModel autoConfig="false" requestQueueLimit="250000" />
SignalRのパフォーマンスカウンターを使う
Microsoft.AspNet.SignalR.Utilsパッケージに含まれているSignalRパフォーマンスカウンタの使用方法について説明します。
Visual StudioのNugetで、signal.utilをインストールする。
パッケージをインストールする。SignalR.exeは、<project folder>/packages/Microsoft.AspNet.SignalR.Utils.<version>/toolsにインストールされます。
SignalRパフォーマンスカウンターをインストールするために、コマンドプロンプトを管理者特権で起動し、次のコマンドを実行します。
SignalR.exe ipc
カウンターを削除したいときには次のコマンドを実行します。
SignalR.exe upc
カウンターの発生タイミングは、コネクションライフタイムイベントに紐づいています。Understanding and Handling Connection Lifetime Events in SignalRを参照してください。
次のカウンターは、SigalRがメッセージトラフィックを生成したときに計測されます。
- Connection Messages Received Total
- Connection Messages Sent Total
- Connection Messages Received/Sec
- Connection Messages Sent/Sec
次のカウンターは、内部SignalRメッセージパスを通るトラフィックを計測したものです。Publsihaはメッセージを送信、ブロードキャストした時です。Subscriberは、メッセージバス上のサブスクリプションです。Allocated Workerはアクティブコネクションにデータ送信しているコンポーネントです。Busy Workerはアクティブにメッセージ送信しているWorker数です。
- Message Bus Messages Received Total
- Message Bus Messages Received/Sec
- Message Bus Messages Published Total
- 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
エラーカウンター
- Errors: All Total
- Errors: All/Sec
- Errors: Hub Resolution Total
- Errors: Hub Resolution/Sec
- Errors: Hub Invocation Total
- Errors: Hub Invocation/Sec
- Errors: Transport Total
- Errors: Transport/Sec
SignalRのカウンターを取得するには、アプリケーションプールの実行ユーザーをPerformance Monitor Usersグループに登録する必要があります。