Eu quero preencher um link de 10Gbps com pacotes udp muito pequenos (64B).
Eu uso o seguinte comando
for i in 1 2 3 4 5 6 7 8; do netperf -H 192.168.56.2 -p 12865 -t UDP_STREAM -l 60 -C -c -- -m 64 -s 16M -S 16M -R 1 & done
Mas não consigo mais do que 250Mbps de taxa de transferência. Para pequenas mensagens, vi que um segmento chamado ksoftirqd está usando 100% de um núcleo da CPU no receptor. Então minha pergunta é
Configuração atual: Eu tenho duas máquinas Ubuntu (8 núcleos e 16 núcleos) com NICs Intel X520-T2 e kernel 3.11 conectado com um switch Juniper 10G. Estas são as mudanças que eu tenho para o sysctlcfg.conf
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 0
net.core.rmem_max = 268435456
net.core.wmem_max = 268435456
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.core.netdev_max_backlog = 250000
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.tcp_congestion_control = htcp
Também aumentei o tamanho do txqueue do NIC
/sbin/ifconfig eth0 txqueuelen 10000
Eu procurei a coalescência de interrupção usando o parâmetro rx-usecs, mas aumentando o agravamento da taxa de transferência.