MCX516A-CCAT-Mesh über 100G-DAC: lshw sagt 40Gbit/s, und ein einzelner iperf3-Stream deckelt bei 21 Gbit/s
Wir betreiben einen Drei-Knoten-Cluster, dessen Knoten direkt über 100G-DAC miteinander verkabelt sind, kein Switch im Pfad, und die Interfaces stecken in einem Broadcast-Bond, damit der Replikations-Traffic sein eigenes Fabric hat. Bevor ich echte Last draufgebe, wollte ich eine Baseline, und die Zahlen sind sich nicht einig.
- 3x Mellanox ConnectX-5 EN, MCX516A-CCAT, Dual-Port QSFP28
- ein 100G-DAC zwischen jedem Knotenpaar
- AMD-EPYC-Hosts, Proxmox auf allen drei
ethtool ist völlig zufrieden:
# ethtool ens1
Settings for ens1:
Supported link modes: 100000baseCR4/Full
Advertised link modes: 100000baseCR4/Full
Speed: 100000Mb/s
Duplex: Full
Link detected: yes
lshw nicht:
# lshw -class network
*-network
description: Ethernet interface
vendor: Mellanox Technologies
capacity: 40Gbit/s
Und iperf3 zwischen zwei der Knoten pendelt sich bei etwa 21 Gbit/s ein, was zu keiner der beiden Zahlen auch nur in die Nähe kommt.
Bereits gemacht:
- das Kabel auf beiden Karten in den zweiten Port gesteckt, keine Änderung
- ein anderes DAC desselben Typs eingesetzt, keine Änderung
- der Link bleibt die ganze Zeit up, keine steigenden Fehler in den Zählern
Welches der beiden Tools lügt mich also an, und sollte ich hinter dem Kabel, der Karte oder dem Treiber her sein?
Comments 5
Nichts von dem, was du gepostet hast, zeigt auf das DAC. Hier passieren zwei Dinge, die nichts miteinander zu tun haben.
Erstens die Widersprüchlichkeit.
lshw -class networkgibt eine Capability-Zahl aus, die es sich selbst zusammenrechnet, und bei diesen Karten sagt es muntercapacity: 40Gbit/szu einem Link, der mit 100G hochgekommen ist. Die ausgehandelte Rate steht in dem, wasethtoolmeldet, und bei dir steht dortSpeed: 100000Mb/smit100000baseCR4/Fullals Advertised. Diese Seite ist in Ordnung, da gibt es nichts zu reparieren.Zweitens der Durchsatz. Erst den Slot prüfen, bevor sonst irgendwas angefasst wird:
Trainiert
LnkStabei 2.5GT/s, währendLnkCap8GT/s sagt, ist die Karte weit unter der Leitung gedeckelt, und kein noch so großer Kabeltausch wird daran etwas ändern. Karte neu setzen und sicherstellen, dass sie in einem Slot sitzt, der wirklich für die volle Breite verdrahtet ist.Dann aufhören, mit einem einzigen Stream zu messen:
Rund 21 Gbit/s ist etwa das, was ein einzelner Core auf dieser Host-Klasse hergibt, diese Zahl allein sagt also sehr wenig aus. Während des Laufs die CPU beobachten und auch schauen, was die Idle-States treiben: Cores, die zwischen den Bursts in tiefe C-States fallen, kosten bei dieser Rate echte Bandbreite.
Bevor irgendein Ersatzteil bestellt wird: die
LnkSta-Zeile auslspci -vvfür diese Karte posten und die genaue iperf3-Kommandozeile, die benutzt wurde. Ein Stream bei 100G misst einen einzelnen CPU-Core, nicht den Link, und Leute verbrennen Tage damit. Und bestätigen, dass der zweite Port beim Test wirklich das andere Bein des Mesh trägt und nicht untätig herumsitzt: Ein Slot, der zwei lebende 100G-Ports füttert, hat ein anderes Budget als einer.lshwwürde ich vorerst beiseitelegen, das ist nicht das richtige Werkzeug für diese Frage.Eine Korrektur zum C-State-Teil: Wenn die Hosts EPYC sind, bringen die
intel_idle-Regler, die in jeden dieser Threads eingefügt werden, gar nichts, dieser Treiber liegt auf AMD überhaupt nicht im Pfad. Der Hebel, der bei mir funktioniert hat, warprocessor.max_cstate=2auf der Kernel-Kommandozeile. Gleiche Idee, andere Plattform. Der Rest des Posts steht, insbesondere keine ausgehandelte Rate auslshwabzulesen.Ein etwas anderer Fehler, gleiche Hardwarefamilie, lohnt sich auszuschließen, sobald der Slot geklärt ist: Ein direktes Mesh aus ConnectX-5-QSFP28-Ports lässt sich auf Layer 3 sehr leicht falsch aufsetzen. Ich hatte drei Knoten auf MCX516A-CCA_Ax, Firmware 16.35.4030 mit dem DOCA-2.8.0-Treiber, verkabelt mit MCP1600-C003E30L 3-m-Kupfer-DAC. Jeder Link meldete sich als aktiv mit 100 Gbps, und kein einziger Ping kam durch. Alle sechs Mesh-Interfaces hatten Adressen aus demselben Subnetz 10.5.5.x, ohne dass irgendwo im Pfad ein Switch war, der Kernel hatte also keine Möglichkeit zu entscheiden, zu welchem physischen Port ein bestimmtes Ziel gehörte. Ein Subnetz pro Knotenpaar, 10.5.5.x, 10.5.6.x und 10.5.7.x, und es fing an zu funktionieren. Lohnt sich,
ip aundip routeauf allen drei Boxen laufen zu lassen, bevor jemand dem Kupfer die Schuld gibt.Beide Punkte haben gesessen.
lspci -vvzeigte die Karte bei 2.5GT/s trainiert gegen einLnkCapvon 8GT/s, das war also Verdächtiger Nummer eins. Ich habe die Karten in allen drei Boxen in andere Slots gesteckt,LnkStakommt jetzt bei 8GT/s hoch, und mitiperf3 -P 8ging dasselbe Knotenpaar sofort über den Einzel-Stream-Wert hinaus.Ich habe außerdem den Broadcast-Bond aufgegeben und das Mesh auf Open vSwitch mit RSTP neu aufgebaut. Mit iperf verteilt über drei CPU-Threads und beide Ports messe ich jetzt etwa 95 Gbit/s, was für das, was dieser Cluster macht, nah genug an der Leitungsrate ist.
lshwbesteht weiterhin auf 40Gbit/s, und ich habe aufgehört, dort hinzuschauen.