(Esta questão foi originalmente publicada em estouro de pilha ; Andy me contou que eu poderia obter ajuda mais rápida aqui, então é re-postado aqui agora.)
Estou experimentando o ajuste do tamanho do buffer TCP no Linux, mas vários resultados me deixam confuso.
Os programas de teste incluem um servidor e um cliente. O servidor simplesmente escuta em uma porta, esperando que o cliente envie dados de um arquivo mmaped. Os dados recebidos são copiados para um buffer de aplicativo usando recv
e depois descartados. Ao enviar dados, o cliente usa send
com o tamanho total do buffer mmap como o argumento inicial.
Os programas são executados em dois nós de dois datacenters diferentes, o tempo de resposta do ping entre eles é de aproximadamente 9 ms. Ambos os nós estão instalados em dois controladores ethernet Gigabit. A taxa de transferência máxima é de 256 MB / s, e uma configuração adequada de tamanhos de buffer de envio / recebimento deve ser de aproximadamente 256 MB / s * 0,09 s ~ 2415919 bytes.
Eu fiz vários experimentos.
Na primeira execução, executei uma instância do servidor e uma instância do cliente. Eu não configurei o tamanho do buffer de envio ou do buffer de recebimento, deixando o kernel autotune-os. O objetivo deste caso é estabelecer uma linha de base de outros experimentos.
O rendimento real nessa configuração foi de cerca de 117 MB / s. Um único par de servidor e cliente fez uso de apenas um controlador de eithernet neste caso. Verificando com ifconfig
, vi que a maioria dos pacotes passava por uma única interface entre eth0
e eth1
.
Então eu tentei dois servidores e dois clientes, desta vez o throughput foi movido para cerca de 225 MB / s, muito mais próximo do throughput máximo ideal.
Este é o primeiro problema que me confunde:
Por que preciso de mais de um processo para usar a largura de banda? FWIW, abaixo é parte de /proc/net/bonding/bond0
:
Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer3+4 (1)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Então eu tentei várias combinações de tamanhos de buffer send / recv para um único par de servidor e cliente. A tabela a seguir resume os resultados:
| send buf size | recv buf size | throughput | comment |
| (client) | (server) | (MB/s) | |
| 1048576 | - | 51.5 | |
| 2621400 | - | 48.6 | server uses autotuning |
| 524288 | - | 43.3 | |
| 8388608 | - | 36.3 | |
| 2621400 | 2621400 | 33.0 | somewhat the theory value |
| - | 2621400 | 30.4 | client uses autotuning |
| 4194304 | - | 30.3 | |
| 262144 | - | 29.1 | |
| - | 1048576 | 27.9 | |
| 6291456 | 6291456 | 26.5 | |
| 8388608 | 8388608 | 23.9 | |
| 6291456 | - | 22.2 | |
| - | 4194304 | 20.8 | |
| 1048576 | 1048576 | 19.8 | |
| 4194304 | 4194304 | 19.3 | |
| - | 8388608 | 19.3 | |
| - | 6291456 | 13.8 | |
Aqui estão várias outras questões levantadas na tabela acima:
Obrigado antecipadamente.
Tags tcp linux-kernel