Tamanhos de buffer TCP e ligação Ethernet

3

(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:

  1. 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:

  1. Por que o valor da teoria não resulta no melhor rendimento (117 MB / s)?
  2. Por que o melhor resultado (51.5 MB / s) ainda não é tão bom quanto o resultado do auto-ajuste do kernel (117 MB / s)?
  3. Por que um buffer maior resulta em uma taxa de transferência ruim?

Obrigado antecipadamente.

    
por user2595776 08.12.2015 / 02:02

0 respostas