Indy IOCP サーバー

· 機能

Indy サーバーは 接続ごとに 1 つのスレッド を使用します。つまり、サーバーが 1000 個の同時接続を処理する必要がある場合、1000 個のスレッドが作成されます。しかし 1000 個ではなく 10000 個の接続がある場合、10000 個のスレッドが作成されます…。もちろんこれには指数関数的なハードウェアリソースが必要となり、高負荷サーバーでは使い物になりません。

Windows は、少数のスレッドプールで数千の接続を処理できる API として IOCP を提供しています。 

sgcWebSockets 4.3.3 から、Indy サーバーで IOCP がサポートされます:

設定

 Indy サーバーで IOCP を有効にするには、IOHandlerOptions プロパティに移動し、IOHandler Type として iohIOCP を選択します。

Server.IOHandlerOptions.IOHandlerType := iohIOCP;
Server.IOHandlerOptions.IOCP.IOCPThreads := 8;
Server.IOHandlerOptions.IOCP.WorkOpThreads := 32;

IOCPThreads は IOCP の非同期リクエスト(オーバーラップド操作)に使用されるスレッドで、WorkOpThreads はこれらの非同期リクエスト(バイトの読み書き)の処理に使用されるスレッドです。 WorkOpThreads の最大値は 64 ですが、物理プロセッサー数 × 2 に応じてこの値を調整する必要があります。16 個のプロセッサーを搭載した CPU の場合、WorkOpThreads を 32 に設定します。 Windows サーバーで IOCP を有効にすることが 推奨される のは、数千の接続 を処理する必要がある場合です。サーバーが最大 100 個の同時接続のみを処理する場合は、デフォルトの Indy スレッドモデルのままでも問題ありません。