4.4. TCP_NODELAY と小さなバッファー書き込み
簡単に説明したように、TCP (Transmission Control Protocol)デフォルトでは、TCP は Nagle アルゴリズムを使用して小さな送信パケットを収集し、一度に送信します。レイテンシーに悪影響を与える可能性があります。
手順4.3 TCP_NODELAY と TCP_CORK を使用してネットワーク遅延を改善する
- 送信されるすべてのパケットのレイテンシーを低く抑える必要があるアプリケーションは、TCP_NODELAY が有効になっているソケットで実行する必要があります。これは、ソケット API を使用した
setsockoptコマンドを通じて有効にできます。# int one = 1; # setsockopt(descriptor, SOL_TCP, TCP_NODELAY, &one, sizeof(one)); - これを効果的に使用するには、アプリケーションは、小規模で論理的に関連するバッファー書き込みを実行しないようにする必要があります。TCP_NODELAY が有効になっているため、これらの小さな書き込みにより TCP は複数のバッファーを個別のパケットとして送信することになり、全体的なパフォーマンスが低下する可能性があります。アプリケーションに論理的に関連する複数のバッファーがあり、それらを 1 つのパケットとして送信する場合は、メモリー内に連続したパケットを構築し、その論理パケットを TCP_NODELAY で設定されたソケット上の TCP に送信することが可能です。または、I/O ベクトルを作成し、TCP_NODELAY で設定されたソケットで writev を使用してカーネルに渡します。
- もう 1 つのオプションは TCP_CORK を 使用することです。これは、パケットを送信する前にアプリケーションがコルクを除去するまで TCP に待機するように指示します。このコマンドにより、受信するバッファーが既存のバッファーに追加されます。これにより、アプリケーションはカーネル領域にパケットを構築できます。これは、レイヤーの抽象化を提供する異なるライブラリーを使用する場合は必要です。TCP_CORK を 有効にするには、
setsockoptソケット API を使用して値を1に設定します (これはソケットの閉鎖と呼ばれます)。# int one = 1; # setsockopt(descriptor, SOL_TCP, TCP_CORK, &one, sizeof(one)); - アプリケーションの各種コンポーネントで論理パケットがカーネルにビルドされたら、コードを削除するように TCP に指示します。TCP は、アプリケーションからのパケットをこれ以上待たずに、累積された論理パケットをすぐに送信します。
# int zero = 0; # setsockopt(descriptor, SOL_TCP, TCP_CORK, &zero, sizeof(zero));
関連する man ページ
詳細は、以下の man ページは本セクションに記載の情報に関連しています。
- tcp(7)
- setsockopt(3p)
- setsockopt(2)