¿Por qué mi bono gigabit no entrega al menos 150 MB / s de rendimiento?

17

Conecté directamente dos crossover PowerEdge 6950 (usando líneas rectas) en dos adaptadores PCIe diferentes.

Obtengo un enlace gigabit en cada una de estas líneas (1000 MBit, full duplex, control de flujo en ambas direcciones).

Ahora estoy tratando de vincular estas interfaces en bond0 usando el algoritmo rr en ambos lados (quiero obtener 2000 MBit para una sola sesión IP).

Cuando probé el rendimiento transfiriendo / dev / zero a / dev / null usando dd bs = 1M y netcat en modo tcp, obtuve un rendimiento de 70 MB / s, no, como se esperaba más de 150 MB / s.

Cuando uso las líneas individuales obtengo aproximadamente 98 MB / s en cada línea, si uso una dirección diferente para cada línea. Cuando uso las líneas simples obtengo 70 MB / sy 90 MB / s en la línea, si el tráfico va en la "misma" dirección.

Después de leer el archivo readme (/usr/src/linux/Documentation/networking/bonding.txt) encontré que la siguiente sección es útil: (13.1.1 Selección del modo de enlace MT para topología de interruptor único)

balance-rr: este modo es el único modo que permitirá que una sola conexión TCP / IP distribuya el tráfico a través de múltiples interfaces. Por lo tanto, es el único modo que permitirá que una sola transmisión TCP / IP utilice el rendimiento de más de una interfaz. Sin embargo, esto tiene un costo: el trazado de bandas a menudo da como resultado que los sistemas pares reciban paquetes fuera de servicio, lo que hace que el sistema de control de congestión de TCP / IP se active, a menudo retransmitiendo 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.

Ahora cambié ese parámetro en ambos servidores conectados en todas las líneas (4) de 3 a 127.

Después de volver a vincularme, obtengo unos 100 MB / s, pero aún no más.

Alguna idea de por qué?

Actualización: Detalles 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

Actualizar resultados finales:

8589934592 bytes (8,6 GB) copiados, 35.8489 segundos, 240 MB / s

Cambié muchas opciones de tcp / ip y de controlador de bajo nivel. Esto incluye la ampliación de los buffers de red. Esta es la razón por la que ddahora muestra números superiores a 200 MB / s: dd termina mientras todavía hay salida en espera de ser transferida (en buffers de envío).

Actualización 05/08/2011: configuración que se cambió para lograr el objetivo ( /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

Configuraciones especiales para el dispositivo de enlace (SLES: / etc / sysconfig / network / ifcfg-bond0 ):

MTU='9216'
LINK_OPTIONS='txqueuelen 10000'

Tenga en cuenta que establecer la mayor MTU posible fue la clave de la solución.

Ajuste de las memorias intermedias rx / tx de las tarjetas de red involucradas:

/usr/sbin/ethtool -G eth2 rx 2048 tx 2048
/usr/sbin/ethtool -G eth4 rx 2048 tx 2048
Nils
fuente
¿Ha verificado /proc/net/bonding/bond0para verificar que realmente se está configurando en balance-rr ? ¿Vio la nota n que la documentación que pegó sobre un enlace de 4 interfaces solo le proporciona un rendimiento de 2.3 interfaces? Teniendo en cuenta esa nota, parece muy poco probable que se acerque a los 2000mb / s que desea.
Zoredache
No estoy seguro de que LACP / Bonding pueda dividir una sola sesión TCP en múltiples enlaces físicos.
Kedare
@Kedare, esto no es LACP, este es el propio programador de paquetes round-robin de los módulos de enlace de Linux que puede utilizar múltiples enlaces para una sola sesión TCP.
Larsks
1
Una mejor manera de probar el rendimiento en un enlace es usarlo nuttcp. Pruebe conexiones individuales o múltiples conexiones fácilmente.
MikeyB

Respuestas:

8

Tuve un problema similar al intentar aumentar la velocidad de una sincronización drbd sobre dos enlaces gigabit hace algún tiempo. Al final logré obtener una velocidad de sincronización de aproximadamente 150 MB / seg. Estas fueron las configuraciones que apliqué en ambos nodos:

ifconfig bond0 mtu 9000
ifconfig bond0 txqueuelen 10000
echo 3000 > /proc/sys/net/core/netdev_max_backlog

También puede intentar habilitar la interrupción de la fusión si aún no tiene para sus tarjetas de red (con ethtool --coalesce )

usuario842313
fuente
No lo sé. No fue necesario en mi caso. Establecer esos parámetros fue suficiente. Pero supongo que si lo configuras no dolerá. ¿La tasa de transferencia mejoró?
user842313
1
Actualmente no puedo probar eso, pero lo más probable es que lo haga. Su pista sobre "coalescencia" probablemente da en el blanco. Encontré un artículo interesante (en alemán) sobre la configuración de "Ethernet de alta velocidad". Las tramas gigantes van en la misma dirección: se trata de reducir la cantidad de interrupciones pci necesarias para transferir la carga de trabajo.
Nils
Si está pensando en algún límite de cuello de botella como interrupciones, una herramienta como collectd definitivamente ayudará, aunque requeriría un poco de configuración. Ver, por ejemplo, este gráfico
user842313
0

¿Ha configurado este enlace troncal bidireccional en el conmutador? de lo contrario, no funcionará así, solo funcionará en modo activo / pasivo y solo usará 1 de los enlaces de 1 Gbps.

Chopper3
fuente
No hay ningún dispositivo de red involucrado. Estos son cables cruzados directos.
Nils
55
Ah, entonces no tienes suerte por otra razón completamente diferente; Los enlaces troncales LACP / Etherchannel como este dependen de la varianza en el primer bit (menos significativo y tercero) del MAC de destino para definir qué miembro de enlace troncal se utiliza para comunicarse con ese MAC. Dado que solo tendrá un MAC para el enlace troncal en cada extremo, nunca usarán más de un enlace.
Chopper3
2
no está usando etherchannel / 802.3ad, está usando balance-rr, que, para ser exactos, ni siquiera requiere ningún soporte de conmutador.
the-wabbit
@ Chopper3: ¿Entonces el problema MAC no debería aparecer en RR en su opinión?
Nils
2
No sé lo suficiente como para comentar, ojalá hubieras mencionado esas cosas antes, pero no importa.
Chopper3
0

Parece que el PowerEdge 6950 está limitado a posibles ranuras PCI que superan los 133 MB / s compartidos en todo el bus. Es posible que vea limitaciones de E / S en la arquitectura del bus del sistema en sí.

Además de tener otros sistemas con hardware diferente y arquitecturas de E / S para probar, el cableado también podría entrar en juego. Algunas combinaciones posibles pueden estar en la línea de diferentes clasificaciones (5e vs. 6) así como longitudes (más corto no siempre es mejor).

usuario48838
fuente
Ya obtuve 160 MB / s, usando las líneas simples concurrentes. Pero esto cae a 100 MB / s al unirse. En cada línea obtengo casi 100 MB / s, por lo que los cables tampoco parecen ser el problema.
Nils
No parece haber ningún soporte PCIe para el PowerEdge 6950. ¿Algo "diferente" con su bus PCI? No obstante, puede consultar las especificaciones del bus IO para el PowerEdge 6950.
user48838
Actualicé la pregunta con la salida de lspci. Este no fue el cuello de botella. Ahora obtengo mis 200 MB / s.
Nils
0

Marcos gigantes?

ifconfig <interface> mtu 9000
Julien Vehent
fuente
Esto debería reducir la carga de la CPU, ¿verdad? Me pregunto qué hace la CPU durante estas pruebas.
SpacemanSpiff
1
con una MTU de 9000 en lugar de 1500, reduce la cantidad de paquetes de datos tcp que necesita para transferir la misma cantidad de datos (la carga útil es mayor). Por lo tanto, realiza menos procesamiento de paquetes, en ambos lados y en ambos sentidos, y envía más datos.
Julien Vehent
Parece que vale la pena intentarlo. Las CPU están bastante inactivas durante la transferencia. Pero todavía tengo la sensación de que un enlace físico está esperando un ACK antes de que el núcleo envíe el siguiente paquete en el otro enlace físico.
Nils
Tengo curiosidad por el resultado también. Además, intente vincular cada NIC a un núcleo de CPU. Un kernel reciente debería manejarlo correctamente, pero no estoy seguro de cómo funcionaría con la vinculación. La idea es evitar cambiar de un caché l2 a otro para cada paquete.
Julien Vehent
La carga de la CPU no es un problema. Todas las opciones de descarga están activadas ...
Nils
0

hacer jumbo frames es una ayuda gigantesca, siempre y cuando tu switch y nic lo admitan. si tiene un desviador no administrado, lo más probable es que no vaya a llegar al lugar que desea para el ancho de banda, pero ese no es el caso si está uniendo los puertos en el conmutador. Aquí hay algo que aprendí hace mucho tiempo, el 65% del tiempo, es un problema físico. ¿Estás usando el cable cat6?

Will - TechToolbox
fuente
0

si ha configurado marcos jumbo en sus nics que, por lo que parece, debe asegurarse de haber configurado sus conmutadores para admitir también la MTU alta.

Las tramas gigantes son un gran rendimiento en redes gigabit, pero debe asegurarse de haberlas configurado de extremo a extremo (tanto los servidores de origen como de destino y los conmutadores de red que usan).

ashmere
fuente
No hay dispositivos de red involucrados en este caso especial. (líneas cruzadas directas). Este es también el único caso (real) en el que puede usar el algoritmo RR para compartir la carga en todas las líneas para una sola sesión.
Nils