第11章 RHEL for Real Time のソケットオプション
リアルタイムソケットは、UNIX ドメインやループバックデバイスなどの同じシステム、またはネットワークソケットなどの異なるシステム上の 2 つのプロセス間の双方向のデータ転送メカニズムです。
伝送制御プロトコル (TCP) は最も一般的なトランスポートプロトコルであり、一定の通信を必要とするサービスの一貫した低遅延を実現するため、または優先度の低い制限された環境でソケットをコルクするためによく使用されます。
新しいアプリケーション、ハードウェア機能、およびカーネルアーキテクチャーの最適化により、TCP は変更を効果的に処理するための新しいアプローチを導入する必要があります。新しいアプローチは、不安定なプログラム動作を引き起こす可能性があります。基盤となるオペレーティングシステムコンポーネントを変更するとプログラムの動作も変更となるため、慎重に扱う必要があります。
TCP でのこのような動作の一例は、小さなバッファーの送信の遅延です。これにより、それらを 1 つのネットワークパケットとして送信できます。TCP への小さな書き込みのバッファーを行い一度に送信することは一般的に適切に機能しますが、レイテンシーを生み出す可能性もあります。リアルタイムアプリケーションの場合、TCP_NODELAY ソケットオプションは遅延を無効にし、準備ができ次第小さな書き込みを送信します。
データ転送に関連するソケットオプションは、TCP_NODELAY および TCP_CORK です。
11.1. TCP_NODELAY ソケットオプション リンクのコピーリンクがクリップボードにコピーされました!
TCP_NODELAY ソケットオプションは、Nagle のアルゴリズムを無効にします。setsockopt ソケット API 関数を使用して TCP_NODELAY を設定すると、準備が整うとすぐに、複数の小さなバッファー書き込みが個別のパケットとして送信されます。
送信前に連続したパケットを作成することにより、論理的に関連する複数のバッファーを単一のパケットとして送信すると、遅延およびパフォーマンスが向上します。または、メモリーバッファーが論理的に関連しているが連続していない場合は、I/O ベクトルを作成し、TCP_NODELAY が有効になっているソケットで writev を使用してカーネルに渡すことができます。
次の例は、setsockopt ソケット API を介して TCP_NODELAY を有効にする方法を示しています。
int one = 1; setsockopt(descriptor, SOL_TCP, TCP_NODELAY, &one, sizeof(one));
int one = 1;
setsockopt(descriptor, SOL_TCP, TCP_NODELAY, &one, sizeof(one));
TCP_NODELAY を効果的に使用するには、論理的に関連する小さなバッファー書き込みを回避します。TCP_NODELAY を使用すると、小さな書き込みにより、TCP が複数のバッファーを個別のパケットとして送信するため、全体的なパフォーマンスが低下する可能性があります。