LinuxではTCP PACINGはデフォルトで有効になっていますか?

LinuxではTCP PACINGはデフォルトで有効になっていますか?

基本的な質問をしたいです。 LinuxではTCP PACINGはデフォルトで有効になっていますか?現在、Ubuntu、カーネル4.4.0を使用しています。

TC-FQを使用して有効/無効にすることができますが、デフォルトではTCを介してのみ有効になりますか、それともデフォルトで無効になりますか?

答え1

短い答え:カーネル4.4.0以降、TCP PACINGはデフォルトで有効になっており、ソケットあたり〜34.36 Gb / sに設定されています。カーネル4.13.0-rc1以降、TCP PACINGはデフォルトで無効になっています。どちらの場合も、TSO がイネーブルであるため、ペーシング速度がデフォルト値に設定されている場合、TCP PACING は何の影響もありません。

sock_setsockopt() 関数 (net/core/sock.c) を使用してソケットの TCP PACING を設定します。そのためのフラグはSO_MAX_PACING_RATEで、処理コードは次のとおりです。

case SO_MAX_PACING_RATE:
        sk->sk_max_pacing_rate = val;
        sk->sk_pacing_rate = min(sk->sk_pacing_rate,
                     sk->sk_max_pacing_rate);
        break;

ソケットが作成されると、 sock_init_data()(net/core/sock.c) で関連フィールドが ~0U に設定されます。

sk->sk_max_pacing_rate = ~0U;
sk->sk_pacing_rate = ~0U;

したがって、ペーシング速度と最大ペーシング速度のデフォルト値は、最大unsigned int値(2 ^ 32 - 1)または1秒あたり4,294,967,295バイト(34.36 Gb / s)です。

ただし、TCP Segmentation Offload(TSO)を使用すると、単一のソケットでもより高い速度を達成できます。 TSOは速度速度を考慮しますが、実際には基本速度によって制限されません。 tcp_tso_autosize() 関数 (net/ipv4/tcp_output.c) で pacing rate により TSO セッションのサイズが縮小することができますが、デフォルト値は約 4.3GB なので、右に 10 移動してもまだ約 4MB が出ます。 、通常のTSOセッションよりはるかに大きいです。

static u32 tcp_tso_autosize(const struct sock *sk, unsigned int mss_now)
{
    u32 bytes, segs;

    bytes = min(sk->sk_pacing_rate >> 10,
            sk->sk_gso_max_size - 1 - MAX_TCP_HEADER);

    /* Goal is to send at least one packet per ms,
     * not one big TSO packet every 100 ms.
     * This preserves ACK clocking and is consistent
     * with tcp_tso_should_defer() heuristic.
     */
    segs = max_t(u32, bytes / mss_now, sysctl_tcp_min_tso_segs);

    return min_t(u32, segs, sk->sk_gso_max_segs);
}

実際には34Gb / sの制限に達しようとしましたが、残念ながらTX側のTSO CPUの利用がない場合、単一のソケットBWは〜23 Gb / sに制限されます。

Eric Dumazetのパッチtcp: ケイデンスの内部実装カーネル4.13.0-rc1に導入されました。このパッチは TCP PACING 機能を改善します。今回はTC-FQを使用せずにペーシングを許可します。また、sk_pacing_rateフィールドが0または〜0U(デフォルト)に設定されている場合は、ペーシングを完全に無効にします。詳しくは、パッチの表紙とコードをご覧ください。

関連情報