基本的な質問をしたいです。 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(デフォルト)に設定されている場合は、ペーシングを完全に無効にします。詳しくは、パッチの表紙とコードをご覧ください。