GNU/Linux >> Linux の 問題 >  >> Linux

TCP_NODELAY と TCP_CORK をいつ使用する必要がありますか?

これは最適化です。他の最適化と同様に:

<オール>
  • 使用しないでください
  • パフォーマンスが問題になるまで待ってから、ソケットの遅延が間違いなく問題の原因であると判断し、これで間違いなく問題が解決することがテストで証明されたら、これが最も簡単な修正方法です。実行してください。
  • 基本的には、sendfile() とその仲間を使用して、単一のフレームを使用できる複数のフレームを送信する必要がないようにすることを目的としています。

    たとえば、Web サーバーでは、ヘッダーに続いてファイルの内容を送信します。ヘッダーはメモリ内で組み立てられ、ファイルはカーネルによって直接送信されます。 TCP_CORK を使用すると、最初のチャンクがすぐに送信される TCP_NODELAY を使用しても、ヘッダーとファイルの先頭を 1 つのフレームで送信できます。

    TCP_NODELAY

    Nagle のアルゴリズムを無効にして、TCP/IP ネットワークを改善し、以前に送信されたデータの確認応答が受信されるまで待機して蓄積されたパケットを送信することにより、パケット数を減らすために使用されます。

    //tcp(7) マニュアルより:

    TCP_CORK (または TCP_NOPUSH FreeBSD で)

    設定されている場合、部分フレームを送信しません。オプションが再びクリアされると、キューに入れられたすべての部分フレームが送信されます。これは sendfile(2) を呼び出す前にヘッダを追加するのに便利です 、またはスループットの最適化のために。現在実装されているように、200 ミリ秒の上限があります。 出力が TCP_CORK によってコルクされる時間について . この上限に達すると、キューに入れられたデータが自動的に送信されます .このオプションは TCP_NODELAY と組み合わせることができます Linux 2.5.71 以降のみ。このオプションは、移植性を意図したコードでは使用しないでください。


    まず第一に、それらの両方が Nagle のアルゴリズムを無効にするわけではありません。

    Nagle のアルゴリズムは、ワイヤ内の小さなネットワーク パケットの数を減らすためのものです。アルゴリズムは次のとおりです。データが制限 (通常は MSS) より小さい場合、以前に送信されたパケットの ACK を受信するまで待機し、その間にユーザーからのデータを蓄積します。その後、蓄積されたデータを送信してください。

    if [ data > MSS ]
        send(data)
    else
        wait until ACK for previously sent data and accumulate data in send buffer (data)
        And after receiving the ACK send(data)
    

    これは、telnet などのアプリケーションで役立ちます。ただし、ACK を待機すると、ストリーミング データを送信するときにレイテンシが増加する可能性があります。さらに、受信側が「遅延 ACK ポリシー」を実装している場合、一時的なデッドロック状態が発生します。このような場合、Nagle のアルゴリズムを無効にする方が適切です。

    そのため、Nagle のアルゴリズムを無効にするために TCP_NODELAY が使用されます。

    TCP_CORK は積極的にデータを蓄積します。ソケットで TCP_CORK が有効になっている場合、バッファが一定の制限に達するまでデータは送信されません。 Nagle のアルゴリズムと同様に、これもユーザーからのデータを蓄積しますが、ACK を受信するまでではなく、バッファが固定制限に達するまで蓄積します。これは、複数のデータ ブロックを送信するときに役立ちます。ただし、TCP_CORK を使用するときはより注意する必要があります。

    2.6 カーネルまでは、これらのオプションは両方とも相互に排他的です。しかし、後のカーネルでは、両方が共存できます。そのような場合、TCP_CORK がより優先されます。

    参照:

    • http://baus.net/on-tcp_cork/
    • http://ccr.sigcomm.org/archive/2001/jan01/ccr-200101-mogul.pdf

    Linux
    1. キャッシュとしてのRedis:その仕組みと使用理由

    2. Linux上のアンチウイルス:実際に使用する必要がありますか?使用する場合、いつ必要ですか?

    3. ディレクトリで末尾のスラッシュを使用する必要があるのはいつですか?

    1. Nohupをいつ使用するのですか?

    2. いつソースからコンパイルしてインストールする必要がありますか?

    3. いつ、なぜApt-get Updateを使用する必要がありますか?

    1. 専用サーバーを使用する場合

    2. Linuxでいつpthread_exit()を使用し、いつpthread_join()を使用するのですか?

    3. いつ Bash を使用し、いつ Perl/Python/Ruby を使用するか?