15

コマンドラインからそれを行う方法はありますか? man tcp は、tcp_nodelay=1 を設定する必要があることを通知しますが、/proc/sys/net/ipv4 の下に tcp_nodelay ファイルを作成できません。Linux で Nagle を無効にする方法があれば教えてください。

4

1 に答える 1

39

このフラグ ( TCP_NODELAY) は、ソケットごとに有効にできるオプションであり、TCP ソケットの作成時に適用されます。これには目的があります。Nagle のアルゴリズムは一般的に有用であり、ネットワークの輻輳を処理するのに役立ちます。あなたのシステムはおそらくこの非アクティブ化に苦しむので、システム全体で無効にしたいとは思いません。

特定のソケットに対して無効にするには、こことC で説明TCP_NODELAYされているようにオプションを適用できます。

int flag = 1;
int result = setsockopt(sock,            /* socket affected */
                        IPPROTO_TCP,     /* set option at TCP level */
                        TCP_NODELAY,     /* name of option */
                        (char *) &flag,  /* the cast is historical cruft */
                        sizeof(int));    /* length of option value */
 if (result < 0)
    ... handle the error ...

プログラミング言語に適応する必要があるかもしれませんが、基本的にTCP_NODELAYflag オプションを socketに設定しsock、実質的に Nagle のアルゴリズムを無効にします。これは、TCP 標準をサポートするソケットを備えたすべての OS で有効です。

Nagle のアルゴリズムをシステム全体で無効にしたい場合は、2 つのオプションを利用できます。まず、対応するフラグを使用してカーネルを再コンパイルできます (これについては、配布マニュアルを参照してください)。2 番目のオプションは、このコードTCP_NODELAYのように、既存のすべての接続にフラグを設定するソフトウェアを作成することです。後者のオプションは、システムで新しい TCP 接続が作成されるたびに実行する必要があります。

TCP の低遅延モードを有効にすると、少しすっきりします。

echo 1 > /proc/sys/net/ipv4/tcp_low_latency

更新: tcp_low_latency はカーネル v4.14 以降で削除されました。

これにより、レイテンシを下げるためにどの決定を下すかについてのヒントがTCPスタックに与えられます(これは、Nagleのアルゴリズムを無効にすることで達成しようとしているものだと思います)。デフォルトでは、帯域幅を最適化するように設定されています ( からは「0」が読み取られます/proc/sys/net/ipv4/tcp_low_latency)。

于 2013-07-24T19:34:31.407 に答える