第32章 TCP_NODELAY を使用したネットワーク遅延の改善
デフォルトでは、TCP は Nagle のアルゴリズムを使用して、小さな送信パケットを集めて一度に送信します。これにより、レイテンシーの発生率が高くなる可能性があります。
前提条件
- 管理者権限がある。
32.1. TCP_NODELAY の使用による影響 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
送信されるすべてのパケットでレイテンシーを低く保つ必要のあるアプリケーションは、TCP_NODELAY オプションを有効化しているソケットで実行する必要があります。イベントが発生するとすぐに、カーネルにバッファー書き込みを送信します。
- 注記
-
TCP_NODELAYを効果的に使用するには、アプリケーションが小規模な論理的に関連するバッファー書き込みを行わないようにする必要があります。これを行わないと、このような小さい書き込みにより、TCPはこれらの複数のバッファーを個別のパケットとして送信するため、全体的なパフォーマンスが低下します。
論理に関連し、1 つのパケットとして送信する必要があるバッファーがアプリケーションに複数ある場合は、パフォーマンスの低下を回避するために、以下の回避策のいずれかを適用します。
-
メモリー内に連続したパケットを構築し、
TCP_NODELAYで設定したソケット上で論理パケットをTCPに送信する。 -
I/O ベクターを作成し、
TCP_NODELAYで設定したソケット上でwritevコマンドを使用してカーネルに渡す。 -
TCP_CORKオプションを使用する。TCP_CORKは、アプリケーションがコルクを削除するのを待ってからパケットを送信するようにTCPに指示します。このコマンドにより、受信するバッファーが既存のバッファーに追加されます。これにより、アプリケーションはカーネル領域にパケットを構築できます。これは、レイヤーの抽象化を提供する異なるライブラリーを使用する場合は必要です。
アプリケーションのさまざまなコンポーネントにより、論理パケットがカーネルに構築されている場合は、ソケットのコルクを解除する必要があります。これにより、TCP が、累積した論理パケットをすぐに送信できるようになります。