Linux에서는 TCP PACING이 기본적으로 활성화되어 있습니까?

Linux에서는 TCP PACING이 기본적으로 활성화되어 있습니까?

기본적인 질문을 하고 싶습니다. Linux에서는 TCP PACING이 기본적으로 활성화되어 있습니까? 현재 Ubuntu, 커널 4.4.0을 사용하고 있습니다.

TC-FQ를 사용하여 활성화/비활성화할 수 있다고 보는데 기본적으로 TC를 통해서만 활성화됩니까, 아니면 기본적으로 비활성화됩니까?

답변1

짧은 답변: 커널 4.4.0부터 TCP PACING은 기본적으로 활성화되며 소켓당 ~34.36Gb/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) 또는 초당 4,294,967,295바이트(34.36Gb/s)입니다.

그러나 TSO(TCP Segmentation Offload)를 사용하면 단일 소켓으로도 더 높은 속도를 달성할 수 있습니다. 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가 ~23Gb/s로 제한됩니다.

Eric Dumazet의 패치tcp: 케이던스의 내부 구현커널 4.13.0-rc1에 도입되었습니다. 이 패치는 TCP PACING 기능을 향상시킵니다. 이번에는 TC-FQ를 사용하지 않고 페이싱을 허용합니다. 또한 sk_pacing_rate 필드가 0 또는 ~0U(기본값)로 설정된 경우 페이싱을 완전히 비활성화합니다. 자세한 내용은 패치 표지와 코드를 참조하세요.

관련 정보