Ich habe zwei PowerEdge 6950-Frequenzweichen (über gerade Linien) direkt an zwei verschiedene PCIe-Adapter angeschlossen.
Ich erhalte eine Gigabit-Verbindung auf jeder dieser Leitungen (1000 MBit, Vollduplex, Flusskontrolle in beide Richtungen).
Jetzt versuche ich, diese Schnittstellen mit dem rr-Algorithmus auf beiden Seiten mit bond0 zu verbinden (ich möchte 2000 MBit für eine einzelne IP-Sitzung erhalten).
Als ich den Durchsatz getestet habe, indem ich / dev / zero mit dd bs = 1M und netcat im TCP-Modus nach / dev / null übertragen habe, erhalte ich einen Durchsatz von 70 MB / s - nicht - wie erwartet mehr als 150 MB / s.
Wenn ich die einzelnen Zeilen verwende, erhalte ich ungefähr 98 MB / s in jeder Zeile, wenn ich für jede Zeile eine andere Richtung verwende. Wenn ich die einzelnen Leitungen benutze, bekomme ich 70 MB / s und 90 MB / s auf der Leitung, wenn der Verkehr in die "gleiche" Richtung geht.
Nach dem Lesen der Bonding-Readme-Datei (/usr/src/linux/Documentation/networking/bonding.txt) fand ich den folgenden Abschnitt nützlich: (13.1.1 MT Bonding Mode Selection für Single Switch Topology)
balance-rr: Dieser Modus ist der einzige Modus, in dem eine einzelne TCP / IP-Verbindung den Datenverkehr über mehrere Schnittstellen verteilt. Es ist daher der einzige Modus, in dem ein einzelner TCP / IP-Stream den Durchsatz von mehr als einer Schnittstelle nutzen kann. Dies ist jedoch mit Kosten verbunden: Das Striping führt häufig dazu, dass Peer-Systeme Pakete nicht in der richtigen Reihenfolge empfangen und das Überlastungskontrollsystem von TCP / IP aktiviert wird, häufig durch erneutes Senden von Segmenten.
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.
Jetzt habe ich diesen Parameter auf beiden verbundenen Servern in allen Leitungen (4) von 3 auf 127 geändert.
Nach dem erneuten Bonden erhalte ich ungefähr 100 MB / s, aber immer noch nicht mehr.
Irgendwelche Ideen warum?
Update: Hardwaredetails von 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
Endgültige Ergebnisse aktualisieren:
8589934592 Byte (8,6 GB) kopiert, 35,8489 Sekunden, 240 MB / s
Ich habe viele TCP / IP- und Low-Level-Treiberoptionen geändert. Dies schließt die Erweiterung der Netzwerkpuffer ein. Aus diesem Grund werden dd
jetzt Zahlen mit mehr als 200 MB / s angezeigt: dd bricht ab, während die Ausgabe noch auf die Übertragung wartet (in Sendepuffern).
Update 2011-08-05: Einstellungen, die geändert wurden, um das Ziel zu erreichen ( /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
Spezielle Einstellungen für das Bond-Gerät (SLES: / etc / sysconfig / network / ifcfg-bond0 ):
MTU='9216'
LINK_OPTIONS='txqueuelen 10000'
Beachten Sie, dass die Einstellung der größtmöglichen MTU der Schlüssel zur Lösung war.
Tuning der RX / TX-Puffer der beteiligten Netzwerkkarten:
/usr/sbin/ethtool -G eth2 rx 2048 tx 2048
/usr/sbin/ethtool -G eth4 rx 2048 tx 2048
nuttcp
. Testen Sie einfach einzelne Verbindungen oder mehrere Verbindungen.
/proc/net/bonding/bond0
, ob Sie tatsächlich auf balance-rr eingestellt sind ? Haben Sie den Hinweis n gesehen, dass die Dokumentation, die Sie über eine 4-Schnittstellen-Bindung eingefügt haben, nur einen Durchsatz von 2,3 Schnittstellen ergibt? In Anbetracht dieses Hinweises ist es sehr unwahrscheinlich, dass Sie sich den gewünschten 2000 MB / s nähern.