Conectei diretamente dois crossovers PowerEdge 6950 (usando linhas retas) em dois adaptadores PCIe diferentes.
Eu recebo um link de gigabit em cada uma dessas linhas (1000 MBit, full duplex, controle de fluxo nas duas direções).
Agora, estou tentando vincular essas interfaces ao bond0 usando o algoritmo rr dos dois lados (quero obter 2000 MBit para uma única sessão IP).
Quando testei a taxa de transferência transferindo / dev / zero para / dev / null usando dd bs = 1M e netcat no modo tcp, recebo uma taxa de transferência de 70 MB / s - não - conforme o esperado, mais de 150 MB / s.
Quando uso as linhas únicas, obtenho cerca de 98 MB / s em cada linha, se eu tiver usado uma direção diferente para cada linha. Quando uso as linhas únicas, obtenho 70 MB / se 90 MB / s na linha, se o tráfego for na mesma direção.
Depois de ler o bonding-readme (/usr/src/linux/Documentation/networking/bonding.txt), achei a seguinte seção útil: (13.1.1 Seleção do modo de ligação MT para topologia de comutador único)
balance-rr: esse modo é o único modo que permitirá que uma única conexão TCP / IP distribua o tráfego por várias interfaces. Portanto, é o único modo que permitirá que um único fluxo TCP / IP utilize mais do que uma interface de taxa de transferência. Porém, isso tem um custo: a distribuição geralmente resulta em sistemas pares recebendo pacotes fora de ordem, fazendo com que o sistema de controle de congestionamento do TCP / IP seja ativado, geralmente retransmitindo segmentos.
It is possible to adjust TCP/IP's congestion limits by altering the net.ipv4.tcp_reordering sysctl parameter. The usual default value is 3, and the maximum useful value is 127. For a four interface balance-rr bond, expect that a single TCP/IP stream will utilize no more than approximately 2.3 interface's worth of throughput, even after adjusting tcp_reordering. Note that this out of order delivery occurs when both the sending and receiving systems are utilizing a multiple interface bond. Consider a configuration in which a balance-rr bond feeds into a single higher capacity network channel (e.g., multiple 100Mb/sec ethernets feeding a single gigabit ethernet via an etherchannel capable switch). In this configuration, traffic sent from the multiple 100Mb devices to a destination connected to the gigabit device will not see packets out of order. However, traffic sent from the gigabit device to the multiple 100Mb devices may or may not see traffic out of order, depending upon the balance policy of the switch. Many switches do not support any modes that stripe traffic (instead choosing a port based upon IP or MAC level addresses); for those devices, traffic flowing from the gigabit device to the many 100Mb devices will only utilize one interface.
Agora mudei esse parâmetro nos dois servidores conectados em todas as linhas (4) de 3 para 127.
Após a ligação novamente, recebo cerca de 100 MB / s, mas ainda não é mais do que isso.
Alguma idéia do porquê?
Atualização: detalhes de hardware de lspci -v
:
24:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
Subsystem: Intel Corporation PRO/1000 PT Dual Port Server Adapter
Flags: bus master, fast devsel, latency 0, IRQ 24
Memory at dfe80000 (32-bit, non-prefetchable) [size=128K]
Memory at dfea0000 (32-bit, non-prefetchable) [size=128K]
I/O ports at dcc0 [size=32]
Capabilities: [c8] Power Management version 2
Capabilities: [d0] MSI: Mask- 64bit+ Count=1/1 Enable-
Capabilities: [e0] Express Endpoint, MSI 00
Kernel driver in use: e1000
Kernel modules: e1000
Atualize os resultados finais:
8589934592 bytes (8,6 GB) copiados, 35,8489 segundos, 240 MB / s
Alterei muitas opções de tcp / ip e driver de baixo nível. Isso inclui a ampliação dos buffers de rede. É por isso que dd
agora mostra números maiores que 200 MB / s: o dd termina enquanto ainda há saída aguardando transferência (nos buffers de envio).
Atualização 2011-08-05: Configurações que foram alteradas para atingir a meta ( /etc/sysctl.conf ):
# See http://www-didc.lbl.gov/TCP-tuning/linux.html
# raise TCP max buffer size to 16 MB. default: 131071
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# raise autotuninmg TCP buffer limits
# min, default and max number of bytes to use
# Defaults:
#net.ipv4.tcp_rmem = 4096 87380 174760
#net.ipv4.tcp_wmem = 4096 16384 131072
# Tuning:
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Default: Backlog 300
net.core.netdev_max_backlog = 2500
#
# Oracle-DB settings:
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
kernel.shmmax = 2147659776
kernel.sem = 1250 256000 100 1024
net.core.rmem_default = 262144
net.core.wmem_default = 262144
#
# Tuning for network-bonding according to bonding.txt:
net.ipv4.tcp_reordering=127
Configurações especiais para o dispositivo bond (SLES: / etc / sysconfig / network / ifcfg-bond0 ):
MTU='9216'
LINK_OPTIONS='txqueuelen 10000'
Observe que definir a maior MTU possível foi a chave da solução.
Ajuste dos buffers rx / tx das placas de rede envolvidas:
/usr/sbin/ethtool -G eth2 rx 2048 tx 2048
/usr/sbin/ethtool -G eth4 rx 2048 tx 2048
nuttcp
. Teste conexões simples ou múltiplas com facilidade.
/proc/net/bonding/bond0
se está realmente sendo definido para balance-rr ? Você viu a observação de que a documentação que você colou sobre um vínculo de 4 interfaces oferece apenas 2,3 interfaces de rendimento? Dada essa nota, parece altamente improvável que você chegue perto dos 2000mb / s que deseja.