Warum ist der SMB-Übertragungsdurchsatz so niedrig?

Warum ist der SMB-Übertragungsdurchsatz so niedrig?

Ok, hinter der Geschichte steckt etwas mehr, als der Titel vermuten lässt.

Hintergrund und Umfeld: Ich kopiere mehrere TB von einem älteren Ubuntu-Server über SMB auf einen neueren Windows 2012-Server. (Technisch gesehen handelt es sich um Standardhardware, aber hier sind es Server.) Alle sind in einem Gigabit-LAN ​​und die ältere Ubuntu-Box hat eine verbundene Schnittstelle. Ich glaube, der Ubuntu-Server hat zwei Rosewill PCI-e 1x Ethernet-Karten und der Windows-Server hat eine einigermaßen gute PCI Intel Ethernet-Karte.

Auf dem Zielcomputer (dem Windows-Server) läuft ein Speicherpool mit Parität über 4 x 2 TB-Laufwerke. Er läuft mit dem neuen ReFS von Microsoft. Auf dem Quellcomputer (dem Ubuntu-Server) läuft ein Software-RAID-Spiegel. Er läuft mit dem guten alten EXT4.

Die beiden Server laufen über einen einzigen Gigabit-Switch. Ich habe mit dem Aufheben der Verbindung auf dem Quellcomputer (Ubuntu) experimentiert, ohne eine Verbesserung zu erzielen.

Problem: Ich habe keine Probleme, mit angemessener Geschwindigkeit von anderen Computern auf den Windows-Server zu übertragen. Andere Computer können ohne große Schwierigkeiten 50-80 MB/s bewältigen, aber die Übertragung von diesem Ubuntu-Server erreicht maximal 20 MB/s. 4+TB bei 20 MB/s dauert lange (etwa 2,3 Tage) und ich frage mich, was ich tun kann, um herauszufinden, wo der Engpass liegt.

Problembeschreibung: Die CPU-Auslastung auf beiden Computern ist ziemlich gering und sicherlich nicht übermäßig ausgelastet. Die Festplatten auf beiden Computern sind aktiv, aber nicht überlastet, und die CPU-IOwait-Leistung beträgt zumindest auf dem Ubuntu-Server fast 0 %.

Ich habe 35 Sekunden lang eine Wireshark-Verfolgung durchgeführt (vermutlich lang genug, um sicherzustellen, dass alle ACKs für neue Pakete waren) und dabei festgestellt, dass es einige Dinge gab, die ich nicht erwartet hatte. (1) Es gab keine Prüfsummen für die ACKs (und EINIGE SMB-Pakete) von Windows zu Ubuntu. Wireshark behauptet jedoch, dass dies an „IP-Prüfsummen-Offload“ liegen könnte. Ok, ich habe da eine ziemlich gute Karte drin. Ich nehme an, es ist möglich, dass die Netzwerkkarte Prüfsummenberechnungen durchführen könnte. Gut. Weiter geht‘s … (2) „TCP hat ungesehenes Segment bestätigt.“ Damit habe ich ein Problem. Die ACK-Nummer liegt meines Erachtens in einem akzeptablen Bereich und es gibt oft riesige Blöcke dieser Nachrichten. Vielleicht ist Wireshark einfach zu langsam?

Zusammenfassung: Die Übertragungsgeschwindigkeit ist beschissen (20 MB/s über Gigabit-Ethernet) und ich weiß nicht, warum. Wireshark behauptet, dass Windows Dinge bestätigt, die nie von Ubuntu gesendet wurden.

Vermutungen: Meine erste Vermutung ist, dass die billigeren Rosewill-Karten überlastet sind. Meine zweite Vermutung ist, dass die softwarebasierten RAID-ähnlichen Dinge auf der einen oder anderen Seite mit Aufgaben überlastet sind.

Antwort1

Ihre Leistungslücke entspricht einer allgemeinen Erfahrung, wenn Samba (ich bin nicht sicher, ob das immer noch die Standardeinstellung ist; es war lange Zeit die Standardeinstellung) mit der Standard-Lese- und Schreib-Socket-Puffergröße von 1024 Bytes konfiguriert ist.

Früher habe ich das häufig bei Linux- und Mac-Rechnern gesehen. Hoffentlich ist das nicht mehr der Fall.

In der Konfigurationsdatei von Samba gibt es ein Socket-Optionsargument, mit dem Sie die Größe des Lese- und Schreib-Socket-Puffers festlegen können. Ich schlage vor, Sie setzen beide auf 8192 Byte (8 KiB). 4 oder 8 KB sind oft ähnlich, aber ich habe das nicht auf einer Gigabit-Verbindung getestet.

Erwarten Sie außerdem nicht, dass eine einzelne TCP-Verbindung von einer gebündelten Verbindung profitiert, da der Datenverkehr fast immer über eine der Verbindungen läuft. Andernfalls müssen Sie viele Pakete in falscher Reihenfolge verarbeiten. Erwarten Sie also nur einen Lastausgleichsvorteil, wenn Sie mehrere Clients bedienen. Selbst dann sollten Sie sich die verschiedenen Bündelungsmodi ansehen und wissen, dass es für Bündelung im „Modus 4“ (IEEE 802.3ad) grundsätzlich zwei Übertragungs-Hash-Modi gibt, die bestimmen, über welche Slave-Schnittstelle gesendet wird. Es gibt Layer-2-Hashing (Standard) und Layer-3-Hashing. Wenn Sie den Großteil Ihrer Daten über ein Gateway senden, wird sich das Layer-2-Hash nicht gut verteilen, da die MAC-Adresse des Gateways dieselbe ist. Erwägen Sie stattdessen die Verwendung von Layer-3.

Antwort2

Ich hatte einmal zwei Ethernet-Karten in einem Ubuntu-Computer und aus irgendeinem Grund funktionierte es nicht richtig - anscheinend wetteiferten beide um die gleichen Pakete, sodass ich manchmal eine Antwort bekam und manchmal nicht, je nachdem, ob die andere Netzwerkkarte das Paket abholte. Es war seltsam. Ich muss es irgendwie falsch konfiguriert haben, aber ich hätte gedacht, dass es einfach funktioniert. Die Karten hatten natürlich eindeutige IP-Adressen.

Um das auszuschließen, können Sie es ganz einfach mit nur EINER Ethernet-Karte in dem an das Netzwerk angeschlossenen Computer versuchen.

verwandte Informationen