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.