IOCP サーバー

高並列接続向けの Windows I/O Completion Ports アクセプターです。sgcWebSockets サーバーを IOCP IOHandler に切り替えることで、接続ごとに 1 スレッドを割り当てる代わりに、小さく固定されたスレッドプールから数千もの接続を処理できます。

IOCP IOHandler

標準の sgcWebSockets サーバー向けの Windows 専用 I/O Completion Ports モードです。IOHandlerOptions から有効にすることで、デフォルトの Indy の接続ごとに 1 スレッドというモデルをはるかに超えてスケールできます。

コンポーネントクラス

TsgcWebSocketServer / TsgcWebSocketHTTPServerIOHandlerOptions 経由で有効化します。

仕組み

Windows I/O Completion Ports(Windows のみ)。

プラットフォーム

Windows

エディション

Enterprise

IOHandler タイプを設定するだけ

IOHandlerOptions プロパティで IOHandler Type に iohIOCP を選択します。スレッド数をゼロのままにすると、CPU 数から自動的にサイズが決定されます。

Server.IOHandlerOptions.IOHandlerType := iohIOCP;
Server.IOHandlerOptions.IOCP.IOCPThreads := 0;
Server.IOHandlerOptions.IOCP.WorkOpThreads := 0;
Server->IOHandlerOptions->IOHandlerType = iohIOCP;
Server->IOHandlerOptions->IOCP->IOCPThreads = 0;
Server->IOHandlerOptions->IOCP->WorkOpThreads = 0;
Server.IOHandlerOptions.IOHandlerType = iohIOCP;
Server.IOHandlerOptions.IOCP.IOCPThreads = 0;
Server.IOHandlerOptions.IOCP.WorkOpThreads = 0;

主な機能

IOCP IOHandler の動作と、そのチューニング方法を解説します。

スレッドプール I/O

Indy がデフォルトで行う接続ごとに 1 スレッドという方式ではなく、限られたスレッドプールから数千もの接続を処理します。

IOCPThreads

IOCP の非同期(オーバーラップ)リクエストに使用するスレッドです。0 にするとプロセッサ数から自動的にサイズが決定されます。Delphi 7 および 2007 では cpucount が利用できないため、デフォルトは 32 です。

WorkOpThreads

必要な場合に接続を同じスレッドに固定します。リクエストは通常プール全体に分散されるため、ある接続への各リクエストは異なるスレッドで実行されることがあります。これが必要な場合にのみゼロより大きい値を設定してください。パフォーマンスとのトレードオフになります。

使いどころ

数千もの接続を処理する必要がある場合に推奨されます。サーバーの上限が同時接続 100 程度であれば、デフォルトの Indy スレッドモデルで十分です。

切断検出

IOCP は書き込み時にのみソケットの切断を検出します。サーバーが切断を認識して OnDisconnect が発生するように、TsgcWebSocketClientCleanDisconnect を有効にするか、サーバー側のハートビートを有効にしてください。

仕様 & 参考資料

このモードが基盤とする仕組みの一次情報源です。

ドキュメント & デモ

機能リファレンスへのディープリンク、すぐに実行できるデモプロジェクト、そして体験版をダウンロードできます。

オンラインヘルプ — IOCP sgcWebSockets サーバーで Windows I/O Completion Ports を有効にするための機能リファレンスです。
デモプロジェクト — Demos\Server すぐに実行できるサンプルプロジェクトです。sgcWebSockets パッケージに同梱されています — 下記から体験版をダウンロードしてください。
ユーザーマニュアル (PDF) ライブラリ内のすべてのコンポーネントを網羅した包括的なマニュアルです。

数千もの接続にスケールする

無料体験版をダウンロードして、Delphi サーバーを Windows IOCP IOHandler に切り替えましょう。