10G, 2.5G, 1G... ach, geh!

Da dachte ich, ich mache mal alles richtig: Mein neues NAS hat einen 10G-RJ45-Anschluss, also lag es nahe, die gesamte Infrastruktur wo es sinnvoll erschien auf 10G umzurüsten. Der Unifi Aggregation Switch für schnelle 10G-Anbindung, ein 1G-24-Port-Switch für alles andere, ein 8er 1G-PoE-Switch für alles ohne eigenes Netzteil und natürlich die gute alte UDM Pro für Verwaltung und alles drumherum. Für den PC gab’s eine 10G-Netzwerkkarte und dazwischen hängen eine Handvoll DAC-Kabel.

So weit, so gut. Alles verkabelt und eingerichtet, die ersten Pakete fließen - aber was ist das? Die Verbindung PC <-> Switch <-> NAS tröpfelt mit guten 2000 MBit/s herum. Da sollte mehr gehen. Also umstöpseln und testen. PC <-> NAS genau dasselbe bei direkter Verbindung, der Switch ist also nicht Schuld. Generell schließe ich Performance-Probleme der Datenträger aus, indem ich mittels iperf messe: iperf3 -c *Zielhost* -f m --parallel 16 -t 300 - dafür muss der iperf-Server auf dem Zielhost installiert sein, dafür werden Datenpakete dann aber direkt aus dem Arbeitsspeicher erzeugt udn kopiert. Der ist meist eher nicht das Bottleneck.

Verschiedene Konfigurationen des Netzwerkadapters, der MTU und anderen potenziellen Bottlenecks brachten keine Besserung. Mein auf dem Mainboard verbauter 2.5G-Anschluss lieferte etwa dieselben Werte, dafür ist das Ganze auch vollkommen valide. Schaltete mein 10G-Adapter etwa in den 2.5G-Modus?

Der Übeltäter: PCIe-Lanes!

Nach einigem Debuggen fiel mir auf, dass im Systemlog bei der Initialisierung der 10G-Karte eine Meldung auftauchte, dass sie im gedrosselten Modus (Gen2) laufe.

Zuerst einmal musste ich die Geräte-ID meiner Netzwerkkarte herausfinden. Am schnellsten geht das via lspci -nn | grep 10G, welches mir die Geräte-ID 0000:07:00.0 lieferte.

Nun ließ ich mir mittels cat /sys/bus/pci/devices/0000:07:00.0/current_link_width anzeigen, welche Bandbreite die Karte zugewiesen bekam. Das Ergebnis bestätigte meine Vermutung, die Ausgabe lieferte eine 2 statt der erwarteten 4.

Wie sich nach weiterer Recherche herausstellte, unterstützt mein Prozessor zwar das PCIe Lane Sharing-Konzept, mein Mainboard aber nicht. Gerade nicht benötigte PCIe-Lanes können darüber geteilt werden, sodass andere Geräte temporär mehr Lanes zur Verfügung gestellt bekommen können. Meine CPU bietet insgesamt 24 nutzbare PCIe-Lanes an. Da ich das System voll bestückt habe (große GPU: 8 Lanes, 3 NVMe SSDs: je 4 Lanes), sind nach Abzug der intern vom Mainboard belegten Lanes (ebenfalls 4 Lanes) einfach nicht genügend übrig, um auch noch die Netzwerkkarte voll zu versorgen. Stattdessen werden die Bandbreiten einiger PCIe-Geräte (in dem Fall primär die NVMes) gedrosselt, um die so frei werdenden Lanes umzuverteilen. Sprich: Mindestens eine meiner NVMes läuft ebenfalls im gedrosselten Modus, um der Netzwerkkarte überhaupt ihre Funktion zu ermöglichen.

Mein Mainboard hat den B650E-Chipsatz verbaut, ich würde den X670E-Chipsatz benötigen, um die entsprechende Funktionalität verwenden zu können. Damit bleibt mir aktuell entweder, die auf maximal 2.5G herabgestufte PCIe-Karte im Bonding mit der on-Board-2.5G-Karte zu betreiben und so wenigstens auf ca. 4000 MBit/s zu kommen, oder den WLAN- und LAN-Controller on-board zu deaktivieren und so die freigewordene Bandbreite besser unter den restlichen Geräten aufzuteilen. Die 10G-Karte kommt so derzeit auf ca. 3000 MBit/s. Vermutlich belasse ich es jetzt einfach so, bis ich in ein paar Jahren irgendwann einen neuen PC zusammenstelle. Bis dahin ist dann vermutlich auch PCIe 6.0 marktreif und das Mainboard kann mehr Bandbreite downstream verteilen.