TCP_NODELAY ではなく、TCP_QUICKACK を使用してください
<ブロック引用>TCP_NODELAY をオンにすると同様の効果がありますが、小さな書き込みのスループットが悪化する可能性があります。 "write()" で数バイト (最悪の場合、1 バイト) をソケットに送信するループを記述し、TCP_NODELAY で Nagle アルゴリズムを無効にすると、各書き込みが 1 つの IP パケットになります。これにより、トラフィックが 40 倍に増加し、ペイロードごとに IP ヘッダーと TCP ヘッダーが使用されます。 Tinygram 防止では、最大サイズのパケットを満たすのに十分なデータがない限り、飛行中のパケットがある場合、2 番目のパケットを送信できません。 1 回のラウンドトリップ時間でバイトを蓄積し、キュー内のすべてを送信します。それはほとんどの場合、あなたが望むものです。 TCP_NODELAY を設定している場合は、バッファリングとフラッシュの問題にもっと注意する必要があります。これは、今日のほとんどが HTTP である一括一方向転送では問題になりません。 (これが SSL ハンドシェークに与える影響については、私は見たことがありません。問題になる可能性があります。) ショートバージョン:TCP_QUICKACK を設定します。それが事態を悪化させるケースを見つけたら、私に知らせてください。ジョン・ネーグル
https://news.ycombinator.com/item?id=10608356
これら 2 つのオプションの間に直接的な関係はありません。目的が異なるだけです。
TCP_NODELAY セグメントのバッファリングを無効/有効にして、データをピアにできるだけ早く送信できるようにすることを目的としているため、通常、これはネットワークの使用率を向上させるために使用されます。 TCP_QUICKACK プロトコルレベルの交換で遅延するよりもできるだけ早く確認を送信するために使用され、安定/永続的ではなく、後続のTCPトランザクション(内部で発生する可能性があります)は、実際のプロトコルレベルの処理または実際の不一致に応じて、このオプションを無視できますユーザー設定とスタック動作の間。
注意 TCP_NODELAY
TCP_QUICKACK
の間は移植可能です そうではありません (Linux 2.4.4 以降でのみ動作します)。
TCP_QUICKACK
そして TCP_NODELAY
TCP のさまざまな操作に影響を与えます。 tcp(7)
man ページでは、TCP のどのソケット オプションが相互に干渉するかについて説明しています。 TCP_CORK
と TCP_NODELAY
.
短い答え
- Nagle のバッファリング アルゴリズムを無効にするには、TCP_NODELAY ソケット オプションを使用します。
- 遅延 ACK を無効にするには、TCP_QUICKACK ソケット オプションを使用します。
詳細strong>
-
Nagle のアルゴリズム
- 作成者のジョン・ネーグルにちなんで名付けられたネーグルのアルゴリズムは、ネットワーク上で送信される小さなパケットの数を減らすことで TCP の効率を改善するメカニズムの 1 つです。
- 目標は、アプリケーションがデータをソケットにかなりゆっくりと配信する場合に、ノードが多くの小さなパケットを送信するのを防ぐことでした.
- プロセスによって多数の小さなパケットが送信されている場合は、過度のネットワーク輻輳が発生している可能性があります。これは、パケットのペイロードが TCP ヘッダー データより小さい場合に特に当てはまります。
-
遅延ACK
- TCP 遅延確認応答または遅延 ACK は、ネットワーク パフォーマンスを向上させ、輻輳を軽減するために、TCP の一部の実装で使用される別の手法です。
- 遅延 ACK は、セグメントの確認に必要な ACK の数を減らし、プロトコルのオーバーヘッドを削減するために考案されました。
- 遅延 ACK は、TCP が受信したすべての TCP セグメントをすぐに確認しないことを意味します。複数の ACK 応答を 1 つの応答にまとめて、プロトコルのオーバーヘッドを削減できます。
-
Nagle のアルゴリズムと遅延 ACK は、TCP/IP ネットワークではうまく機能しません
- 遅延 ACK は、可能であればセグメントごとにより多くのデータを送信しようとします。しかし、Nagle のアルゴリズムの一部は、ACK に依存してデータを送信します。
- Nagle のアルゴリズムが ACK の受信を待機している間に、遅延 ACK が ACK の送信を待機しているため、Nagle のアルゴリズムと遅延 ACK が一緒になって問題を引き起こします
-
Nagle のアルゴリズムと遅延 ACK によって引き起こされる問題を解決するにはどうすればよいですか
- TCP_NODELAY を有効にして、サーバーのグローバル ソケット オプションを介して Nagle のアルゴリズムを無効にします
- プロキシ サーバーとロード バランサーのプロファイルを微調整する:これは、非常にインタラクティブなトラフィックとチャットの多いプロトコルを時々しか使用しないアプリケーションまたは環境を実行している場合に特に重要です。ロード バランサ レベルで Nagle のアルゴリズムと TCP_NODELAY のオンとオフを動的に切り替えることで、非常に異種のトラフィックが混在していても、最適な状態で実行し続けることができます。
- サーバーとロード バランサの遅延 ACK タイマーを減らします。この種の最適化は、アプリケーション レベルのソフトウェアで処理されることもありますが、そうでない場合でも、サーバーまたはロード バランサー レベルで ACK タイマーを動的に管理できる場合があります。
- これらの変更を行っている間は、ネットワーク トラフィックを注意深く監視し、各調整が輻輳にどのように影響するかを確認してください。
詳しくはこちらをご覧ください