O TCP PACING está habilitado por padrão no linux?

3

Eu quero fazer uma pergunta básica: O TCP PACING está habilitado por padrão no Linux? Estou usando o Ubuntu agora, kernel 4.4.0.

Eu vi que ele pode ser ativado / desativado usando o TC-FQ, mas ele está habilitado por padrão usando somente TC, ou o padrão está desabilitado?

    
por Blufter 14.01.2017 / 23:51

1 resposta

4

Resposta curta : para o kernel 4.4.0 O TCP PACING está ativado por padrão e está configurado para ~ 34.36Gb / s por soquete. Desde o kernel 4.13.0-rc1, o TCP PACING está desabilitado por padrão. Em ambos os casos, desde que o TSO esteja ativado, o TCP PACING não terá efeito quando a taxa de estimulação for definida para o valor padrão.

TCP PACING é definido para um soquete usando a função sock_setsockopt () (net / core / sock.c). O sinalizador para isso é SO_MAX_PACING_RATE, e o código de manipulação é o seguinte:

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;

Na criação de soquete, os campos relevantes são definidos como ~ 0U em sock_init_data () (net / core / sock.c):

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

Assim, os valores padrão para a taxa de estimulação e a taxa máxima de estimulação é o valor max unsigned int, que é (2 ^ 32 - 1), ou 4.294.967.295 bytes por segundo, que são 34,36Gb / s.

É possível, no entanto, obter taxas mais altas, mesmo com um único soquete, usando o TSO (TCP segmentation offload). O TSO leva em consideração a taxa de estimulação, mas não é limitado pela taxa padrão. Na função tcp_tso_autosize () (net / ipv4 / tcp_output.c) a taxa de estimulação pode reduzir o tamanho da sessão do TSO, mas como o valor padrão é ~ 4.3GB e mesmo depois de deslocar para a direita por 10 você ainda obtém ~ 4MB, muito maior do que a sessão típica do 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);
}

Eu tentei realmente atingir a limitação de 34Gb / s, mas infelizmente, sem a utilização da CPU do TSO no lado TX, limito o BW de soquete único para ~ 23Gb / s.

Um patch de Eric Dumazet tcp: implementação interna para o ritmo foi introduzido no kernel 4.13.0-rc1. Este patch aprimora as habilidades do TCP PACING. Por uma vez, permite o ritmo sem usar o TC-FQ. Também desativa o ritmo se o campo sk_pacing_rate estiver definido como 0 ou ~ 0U (padrão). Veja a capa do patch e o código para mais detalhes.

Espero que isso ajude.

    
por 30.07.2017 / 22:36

Tags