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

StackOverflow https://stackoverflow.com/questions/123387

質問

あらゆる種類のポートが閉じられ、あらゆる種類のファイアウォールの内側に世界中に分散しているサーバーから、対話型メッセージを取得する必要があるクライアントがあります。信頼できるのは HTTP ポート 80 (および HTTPS 443) だけです。

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

まあ、理論的には。

実際に何が起こっているのかというと、まず、IIS は約 100 件を超える同時リクエストを処理できません。他のリクエストはすべてキューに入れられており、「接続」されてから IIS がクライアントの呼び出しを認識するまでに数分の遅れが生じる可能性があります。次に、約半分の時間でクライアントがサーバーからの応答なしにタイムアウトします (クライアントのタイムアウトはサーバーのタイムアウトより 5 分長くなります)。

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

不足している構成オプションはありますか、それともこれに対処するために他に検討すべき点はありますか?

ありがとう。

役に立ちましたか?

解決

IIS の制限ではなく、ASP.NET のスレッド プールの制限に達していると思います。非同期 HTTP ハンドラーの作成を検討してください (IHttpAsyncHandler) ブロック/待機するときにスレッド プールを拘束しないのと同様です (代わりに完了ポートを使用します)。

アップデート:最近、私の考えと一致するようなものを見つけました。 コードプロジェクト:ASP.NETと組み合わせたスケーラブルなCOMET

他のヒント

IIS が要件を満たさない場合は、次のような別の Web サーバーを選択する必要があります。 アパッチ (と モッドモノ) または ライトTPD.

ところで、次を使用して HTTP 経由で XMPP をトンネリングできます。 BOSH 上の XMPP. 。カスタム プロトコルを作成する必要はありません。

箱から出した状態では、Windows には多少の調整が必要です。asp.net に Comet サーバーを実装する必要があったのですが、いくつかのばかげたデフォルトに遭遇しました。これらのリンクを読んだ後:

Windows 2k8 サーバーに次の変更を加えました。

  • reg add HKLM\System\CurrentControlSet\Services\HTTP\Parameters /v MaxConnections /t REG_DWORD /d 1000000 /f
  • reg add HKLM\System\CurrentControlSet\Services cpIp\Parameters /v TcpTimedWaitDelay /t REG_DWORD /d 30 /f
  • reg add HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 /v MaxConcurrentThreadsPerCPU /t REG_DWORD /d 0 /f
  • reg add HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0 /v MaxConcurrentRequestsPerCPU /t REG_DWORD /d 30000 /f
  • appcmd.exe set apppool "[アプリ プール名]" /queueLength:65535
  • appcmd.exe 設定 /section:serverRuntime /appConcurrentRequestLimit:100000
  • reg add HKLM\System\CurrentControlSet\Services cpIp\Parameters /v MaxUserPort /t REG_DWORD /d 65534 /f
  • reg add HKLM\System\CurrentControlSet\Services cpIp\Parameters /v MaxFreeTcbs /t REG_DWORD /d 2000 /f
  • reg add 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 /f
  • appcmd set config /section:processModel /requestQueueLimit:100000 /commit:MACHINE

すべての変更が必要だったのか、最適だったのかはわかりませんが、テスト サーバーに対するいくつかの簡単なテストにより、1 秒あたり 30,000 を超える接続実行と 5,000 リクエストを達成しました。テストを実行するクライアント マシンがなくなったため、これ以上先に進むことができませんでした。

XMPP は決して高性能アプリケーション向けに設計されたものではありません。メッセージはスタック全体を通過してアプリケーション層まで到達する必要があり、大量の XML 解析が行われます。XMPP 以外の他の標準の使用を検討しましたか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top