Warum liefert meine Gigabit-Anleihe nicht mindestens 150 MB / s Durchsatz?

17

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 ddjetzt 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
Nils
quelle
Haben Sie überprüft /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.
Zoredache
Ich bin nicht sicher, ob LACP / Bonding eine einzelne TCP-Sitzung auf mehrere physische Verbindungen aufteilen kann.
Kedare
@Kedare, das ist nicht LACP, das ist der Round-Robin-Paketplaner des Linux-Bonding-Moduls, der mehrere Links für eine einzelne TCP-Sitzung verwenden kann.
Larsks
1
Eine bessere Methode zum Testen des Durchsatzes einer Verbindung ist die Verwendung von nuttcp. Testen Sie einfach einzelne Verbindungen oder mehrere Verbindungen.
MikeyB

Antworten:

8

Ich hatte vor einiger Zeit ein ähnliches Problem beim Versuch, die Geschwindigkeit einer DRBD-Synchronisation über zwei Gigabit-Verbindungen zu erhöhen. Am Ende habe ich es geschafft, ungefähr 150 MB / s Synchrongeschwindigkeit zu erreichen. Dies waren die Einstellungen, die ich auf beiden Knoten angewendet habe:

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

Sie können auch versuchen, die Interrupt-Koaleszenz zu aktivieren, wenn Sie noch keine für Ihre Netzwerkkarten haben (mit ethtool --coalesce ).

user842313
quelle
Ich weiß es nicht. Es wurde in meinem Fall nicht benötigt. Das Einstellen dieser Parameter war ausreichend. Aber ich denke, wenn Sie es einstellen, wird es nicht schaden. Hat sich die Übertragungsrate verbessert?
user842313
1
Ich kann das derzeit nicht testen, aber es wird höchstwahrscheinlich. Ihr Hinweis auf "Koaleszenz" trifft wahrscheinlich genau das Richtige. Ich habe einen interessanten Artikel über "High Speed ​​Ethernet" -Einstellungen gefunden. Die Jumbo-Frames gehen in die gleiche Richtung - es geht darum, die Anzahl der PCI-Interrupts zu reduzieren, die zum Übertragen der Arbeitslast erforderlich sind.
Nils
Wenn Sie an eine Engpassgrenze wie Interrupts denken, hilft auf jeden Fall ein Tool wie collectd , obwohl es ein wenig Setup erfordern würde. Siehe zum Beispiel dieses Diagramm
user842313
0

Haben Sie diese Amtsleitung am Switch konfiguriert? Wenn nicht, funktioniert es nicht so, sondern nur im aktiven / passiven Modus und verwendet nur eine der 1-Gbit / s-Verbindungen.

Chopper3
quelle
Es ist kein Netzwerkgerät beteiligt. Dies sind direkte Crossover-Kabel.
Nils
5
Ah, dann haben Sie aus einem anderen Grund Pech. LACP / Etherchannel-Trunks wie diese basieren auf der Varianz im ersten (und gegebenenfalls zweiten und dritten) niedrigstwertigen Bit des Ziel-MAC, um zu definieren, welches Trunk-Mitglied für die Kommunikation mit diesem MAC verwendet wird. Vorausgesetzt, Sie haben nur einen MAC für den Trunk an jedem Ende, dann wird auch nie mehr als ein Link verwendet.
Chopper3
2
er benutzt kein etherchannel / 802.3ad, er benutzt balance-rr, was, um genau zu sein, nicht einmal Switch-Unterstützung erfordert.
the-wabbit
@ Chopper3: Also sollte das MAC-Problem deiner Meinung nach nicht in RR auftauchen?
Nils
2
Ich weiß das nicht gut genug, um es zu kommentieren. Ich wünschte, du hättest das schon früher erwähnt, aber das macht nichts.
Chopper3
0

Es sieht so aus, als wäre der PowerEdge 6950 auf möglicherweise PCI-Steckplätze beschränkt, die 133 MB / s erreichen und über den gesamten Bus gemeinsam genutzt werden. Möglicherweise werden E / A-Einschränkungen für die Systembusarchitektur selbst angezeigt.

Abgesehen davon, dass andere Systeme mit unterschiedlichen Hardware- und E / A-Architekturen getestet werden müssen, könnte auch die Verkabelung eine Rolle spielen. Einige mögliche Kombinationen können sowohl unterschiedliche Bewertungen (5e vs. 6) als auch Längen aufweisen (kürzer ist nicht immer besser).

user48838
quelle
Ich habe bereits 160 MB / s - mit den gleichzeitigen Einzelleitungen. Beim Bonden sinkt dieser Wert jedoch auf 100 MB / s. Auf jeder einzelnen Leitung bekomme ich fast 100 MB / s, so dass die Kabel auch nicht das Problem zu sein scheinen.
Nils
Es scheint keine PCIe-Unterstützung für den PowerEdge 6950 zu geben. Ungeachtet dessen können Sie die IO-Bus-Spezifikationen für den
PowerEdge 6950 nachschlagen.
Ich habe die Frage mit der Ausgabe von lspci aktualisiert. Dies war nicht der Engpass. Ich bekomme jetzt meine 200 MB / s.
Nils
0

Jumbo-Rahmen?

ifconfig <interface> mtu 9000
Julien Vehent
quelle
Dies sollte die CPU-Auslastung reduzieren, oder? Ich frage mich, was die CPU während dieser Tests macht.
SpacemanSpiff
1
Mit einer MTU von 9000 statt 1500 reduzieren Sie die Anzahl der TCP-Datenpakete, die Sie für die Übertragung derselben Datenmenge benötigen (die Nutzlast ist größer). Sie können also weniger Pakete auf beiden Seiten und in beide Richtungen verarbeiten und mehr Daten senden.
Julien Vehent
Das scheint einen Versuch wert zu sein. Die CPUs sind während der Übertragung ziemlich untätig. Aber ich habe immer noch das Gefühl, dass eine physische Verbindung auf eine ACK wartet, bevor der Kernel das nächste Paket auf der anderen physischen Verbindung sendet.
Nils
Ich bin auch gespannt auf das Ergebnis. Versuchen Sie außerdem, jede Netzwerkkarte an einen CPU-Kern zu binden. Ein neuerer Kernel sollte das richtig handhaben, aber ich bin mir nicht sicher, wie es mit Bonding funktionieren würde. Die Idee ist zu vermeiden, dass für jedes Paket von einem l2-Cache zu einem anderen gewechselt wird.
Julien Vehent
CPU-Auslastung ist kein Problem. Alle Auslagerungsoptionen sind aktiviert ...
Nils
0

Jumbo Frames zu machen ist eine gigantische Hilfe, solange Ihr Switch und Nic's es unterstützen. Wenn Sie ein nicht verwaltetes siwtch haben, werden Sie höchstwahrscheinlich für die Bandbreite nicht an den gewünschten Ort gelangen. Dies ist jedoch nicht der Fall, wenn Sie die Ports auf dem Switch zusammenbinden. Hier ist etwas, was ich vor langer Zeit gelernt habe, 65% der Zeit, es ist ein physisches Problem. Verwenden Sie Cat6-Kabel?

Will - TechToolbox
quelle
0

Wenn Sie Jumbo-Frames auf Ihren Nics konfiguriert haben, stellen Sie anscheinend sicher, dass Sie Ihre Switches so konfiguriert haben, dass sie auch die hohe MTU unterstützen.

Jumbo-Frames sind in Gigabit-Netzwerken eine hervorragende Leistung, aber Sie müssen sicherstellen, dass Sie sie von Ende zu Ende konfiguriert haben (sowohl Quell- als auch Zielserver und die von ihnen verwendeten Netzwerk-Switches).

Ashmere
quelle
In diesem Sonderfall sind keine Netzwerkgeräte beteiligt. (direkte Überkreuzungslinien). Dies ist auch der einzige (echte) Fall, in dem Sie den RR-Algorithmus verwenden können, um die Last für eine einzelne Sitzung auf alle Leitungen zu verteilen.
Nils