XMPPのようなプロトコルを実装しようとするとIISのパフォーマンス上の問題が発生する


3

私たちはあらゆる種類のファイアウォールの背後にある世界中のクライアントから、あらゆる種類のポートを閉じた状態で、サーバーから対話型メッセージを受け取る必要があるクライアントを持っています。私たちが信頼できるのは、HTTPポート80(とHTTPS 443)のみです。

デザインは基本的に、クライアントとIISを使用してXMPP(Jabberプロトコル)の後にモデル化されています。クライアントはGET要求を.NETハンドラに発行します。ハンドラはメッセージを探している間にリクエストを開いたままにします。メッセージが到着した場合は、すぐにクライアントに送信されます。そうでない場合、タイムアウトの後、接続は「データなし」応答で閉じられる。クライアントはすぐに通信を再開します。

まあ、理論的には。

実際に起こっているのは、IISが約100件を超える同時リクエストを処理できないことです。他のものはすべてキューイングされており、クライアントが呼ばれたことを認識した「接続済み」とIISの間に数分の遅延があります。クライアントのタイムアウト時間の約半分は、サーバーからの応答なしでタイムアウトします(クライアントのタイムアウトはサーバーのタイムアウトよりも5分長くなります)。

POSTは常に動作します。同じWebサーバー上で提供される他のデータが機能します。同じサーバー上のWebサービスが機能します。これは、Windows 2K3 Server上での既定のインストールです。

私たちには欠けている設定オプションがありますか、これに対処するために何か別のものがありますか?

ありがとうございました。

3

私はあなたがIISのものではなくASP.NETのスレッドプールの制限を打つと思います。非同期HTTPハンドラ(IHttpAsyncHandler)の作成は、スレッドプールを縛っていない(完了ポートを代わりに使用する)ブロック/待機時に見てください。

更新は:CodeProject: Scalable COMET Combined with ASP.NET


1

IISが要件に合わない場合は、ApacheMod_mono)またはLightTPDなどの別のWebサーバーを選択する必要があります。

ところで、XMPP Over BOSHを使用してHTTP経由でXMPPをトンネルできます。カスタムプロトコルを発明する必要はありません。


0

XMPPは、高性能アプリケーション向けに設計されていませんでした。私の考えに同意しているようだという最近、この出くわしました。メッセージは、スタック全体をアプリケーションレイヤーまでトラバースする必要があり、多くのXML解析が行われます。あなたはXMPP以外のいくつかの標準を使用することを検討しましたか?

+2

"XMPPは、高性能アプリケーション向けに設計されたことはありませんでした。私はあなたが「高性能」という意味を理解していませんが、チャットのために設計されており、OPが求めていることは非常にうまくいきます。たとえば、ejabberdは数十万の同時リクエストを処理できます。 21 1月. 112011-01-21 16:33:38


1

箱の外では、窓にはピンセットが必要です。私はasp.netで彗星サーバーを実装しなければならず、いくつかの愚かなデフォルトに遭遇しました。これらのリンクを読んだ後:

私は、Windows 2k8サーバーに加えられた以下の変更を思いつきました。

  • REG HKLM \システム\ CURRENTCONTROLSET \ Servicesの\ HTTP \パラメータ/ VのMaxConnectionsをを追加/トンREG_DWORD/dの1000000/F
  • regが/ HKLM \システム\ CURRENTCONTROLSET \ Servicesの\ TCPIP \パラメータ/ VのTcpTimedWaitDelayのを追加しますトンREG_DWORD/dの30/
  • F REG HKLM \ SOFTWARE \マイクロソフト\ ASP.NET \ 2.0.50727.0/Vを追加MaxConcurrentThreadsPerCPU /トンREG_DWORD/dの0/F
  • REGは、HKLM \ SOFTWARE \マイクロソフト\ ASP.NETを追加\ 2.0.50727.0/v MaxConcurrentRequestsPerCPU/t REG_DWORD/d 30000/f
  • appcmd.exeの設定apppool "[アプリケーションプール名]"/queueLeng目:65535
  • Appcmd.exeのセットの設定/セクション:のServerRuntime/appConcurrentRequestLimit:100000
  • regが\ CURRENTCONTROLSET \ Servicesの\ TCPIP \パラメータ/ V MaxUserPort /トンREG_DWORD/dの65534/
  • F REG HKLM \システムを追加しますHKLM¥System¥CurrentControlSet¥Services¥TcpIp¥Parameters¥v MaxFreeTcbs/t REG_DWORD/d 2000/f
  • 追加HKLM¥System¥CurrentControlSet¥Services¥TcpIp¥Parameters/v MaxHashTableSize/t REG_DWORD/d 2048/fを追加します。 reg add HKLM¥System¥CurrentControlSet¥Services¥InetInfo¥Parameters/v MaxPoolThreads/t REG_DWORD/d 80/f
  • appcmd設定/セクション:processMode L/requestQueueLimit:100000 /コミット:MACHINE

すべての変更が必要か、最適であった場合、私は知らないが、テストサーバーに対していくつかのQUIK tesingで、我々は30K以上の実行接続および毎秒5K要求をachived 。テストを実行するためにクライアントマシンが不足していたため、さらに進めませんでした。