Motivation
Bei einer Signalisierungsrate von 480 MBit / s sollten USB 2.0-Geräte Daten mit bis zu 60 MB / s übertragen können. Allerdings scheinen die heutigen Geräte beim Lesen von [ Wiki: USB ] auf 30-42 MB / s beschränkt zu sein . Das ist ein Overhead von 30 Prozent.
USB 2.0 ist seit über 10 Jahren ein De-facto-Standard für externe Geräte. Eine der wichtigsten Anwendungen für die USB-Schnittstelle war von Anfang an der portable Speicher. Leider war USB 2.0 schnell ein Geschwindigkeitsengpass für diese bandbreitenintensiven Anwendungen. Eine heutige Festplatte kann beispielsweise mehr als 90 MB / s sequentiell lesen. In Anbetracht der langen Marktpräsenz und des ständigen Bedarfs an höherer Bandbreite ist zu erwarten, dass das USB 2.0-Eco-System im Laufe der Jahre optimiert wurde und eine Leseleistung erreicht hat, die nahe an der theoretischen Grenze liegt.
Was ist die theoretische maximale Bandbreite in unserem Fall? Jedes Protokoll hat Overhead, einschließlich USB, und gemäß dem offiziellen USB 2.0-Standard beträgt es 53,248 MB / s [ 2 , Tabelle 5-10]. Das bedeutet, dass die heutigen USB 2.0-Geräte theoretisch 25 Prozent schneller sein könnten.
Analyse
Die folgende Analyse zeigt, was auf dem Bus geschieht, während sequentielle Daten von einem Speichergerät gelesen werden. Das Protokoll ist Schicht für Schicht aufgeschlüsselt und wir interessieren uns besonders für die Frage, warum 53,248 MB / s die maximale theoretische Anzahl für Bulk-Upstream-Geräte ist. Abschließend werden wir uns mit den Grenzen der Analyse befassen, die uns Hinweise auf zusätzlichen Overhead geben könnten.
Anmerkungen
In dieser Frage werden nur Dezimalpräfixe verwendet.
Ein USB 2.0-Host kann mehrere Geräte (über Hubs) und mehrere Endpunkte pro Gerät verwalten. Endpunkte können in verschiedenen Übertragungsmodi betrieben werden. Wir beschränken unsere Analyse auf ein einzelnes Gerät, das direkt an den Host angeschlossen ist und im Hochgeschwindigkeitsmodus kontinuierlich vollständige Pakete über einen vorgelagerten Massenendpunkt senden kann.
Rahmung
Die USB-Hochgeschwindigkeitskommunikation wird in einer festen Rahmenstruktur synchronisiert. Jeder Frame ist 125 us lang und beginnt mit einem Start-Of-Frame-Paket (SOF) und ist durch eine End-Of-Frame-Sequenz (EOF) begrenzt. Jedes Paket beginnt mit SYNC und endet mit und End-Of-Packet (EOF). Diese Sequenzen wurden der Übersichtlichkeit halber den Diagrammen hinzugefügt. EOP ist variabel in Größe und Paketdaten abhängig, für SOF sind es immer 5 Bytes.
Öffne das Bild in einem neuen Tab, um eine größere Version zu sehen.
Transaktionen
USB ist ein mastergesteuertes Protokoll und jede Transaktion wird vom Host initiiert. Der Zeitschlitz zwischen SOF und EOF kann für USB-Transaktionen verwendet werden. Das Timing für SOF und EOF ist jedoch sehr streng und der Host initiiert nur Transaktionen, die innerhalb des freien Zeitfensters vollständig abgeschlossen werden können.
Die Transaktion, an der wir interessiert sind, ist eine erfolgreiche Bulk-IN-Transaktion. Die Transaktion beginnt mit einem Token-Paket IN, dann warten die Hosts auf ein Datenpaket DATA0 / DATA1 und bestätigen die Übertragung mit einem Handshake-Paket ACK. Die EOP für alle diese Pakete beträgt 1 bis 8 Bit, abhängig von den Paketdaten. Wir haben hier den ungünstigsten Fall angenommen.
Zwischen jedem dieser drei Pakete müssen wir Wartezeiten berücksichtigen. Diese befinden sich zwischen dem letzten Bit des IN-Pakets vom Host und dem ersten Bit des DATA0-Pakets des Geräts sowie zwischen dem letzten Bit des DATA0-Pakets und dem ersten Bit des ACK-Pakets. Wir müssen keine weiteren Verzögerungen berücksichtigen, da der Host direkt nach dem Senden einer ACK mit dem Senden des nächsten IN beginnen kann. Die Kabelübertragungszeit ist auf maximal 18 ns festgelegt.
Eine Massenübertragung kann bis zu 512 Bytes pro IN-Transaktion senden. Der Host wird versuchen, so viele Transaktionen wie möglich zwischen den Frame-Begrenzern auszugeben. Obwohl die Massenübertragung eine niedrige Priorität hat, kann sie die gesamte verfügbare Zeit in einem Slot in Anspruch nehmen, wenn keine andere Transaktion aussteht.
Um eine ordnungsgemäße Taktwiederherstellung zu gewährleisten, definieren die Standards ein Methodenaufruf-Bit-Stuffing. Wenn das Paket eine sehr lange Sequenz derselben Ausgabe erfordern würde, wird eine zusätzliche Flanke hinzugefügt. Das sichert eine Flanke nach maximal 6 Bits. Im schlimmsten Fall würde dies die Gesamtpaketgröße um 7/6 erhöhen. Das EOP unterliegt keinem Bitstuffing.
Öffne das Bild in einem neuen Tab, um eine größere Version zu sehen.
Bandbreitenberechnungen
Eine Bulk-IN-Transaktion hat einen Overhead von 24 Bytes und eine Nutzlast von 512 Bytes. Das sind insgesamt 536 Bytes. Der Zeitschlitz zwischen ist 7487 Bytes breit. Ohne Bit-Füllung ist Platz für 13.968 Pakete. Mit 8000 Micro-Frames pro Sekunde können Daten mit 13 * 512 * 8000 B / s = 53,248 MB / s gelesen werden
Für völlig zufällige Daten erwarten wir, dass Bitfüllung in einer von 2 ** 6 = 64 Sequenzen von 6 aufeinanderfolgenden Bits erforderlich ist. Das ist eine Steigerung von (63 * 6 + 7) / (64 * 6). Das Multiplizieren aller Bytes, die einer Bitfüllung unterliegen, mit diesen Zahlen ergibt eine Gesamttransaktionslänge von (19 + 512) * (63 * 6 + 7) / (64 * 6) + 5 = 537,38 Bytes. Das ergibt 13.932 Pakete pro Micro-Frame.
In diesen Berechnungen fehlt ein weiterer Sonderfall. Der Standard definiert eine maximale Geräteantwortzeit von 192 Bitzeiten [ 2 , Kapitel 7.1.19.2]. Dies muss bei der Entscheidung berücksichtigt werden, ob das letzte Paket noch in den Frame passt, falls das Gerät die volle Antwortzeit benötigt. Wir könnten das mit einem Fenster von 7439 Bytes erklären. Die resultierende Bandbreite ist jedoch identisch.
Was ist übrig
Die Fehlererkennung und -behebung wurde nicht behandelt. Möglicherweise sind Fehler häufig genug oder die Fehlerbehebung ist zeitaufwendig genug, um die durchschnittliche Leistung zu beeinträchtigen.
Wir haben eine sofortige Reaktion von Host und Gerät nach Paketen und Transaktionen angenommen. Ich persönlich sehe keinen Bedarf an großen Verarbeitungsaufgaben am Ende von Paketen oder Transaktionen auf beiden Seiten und kann mir daher keinen Grund vorstellen, warum der Host oder das Gerät nicht in der Lage sein sollte, sofort mit ausreichend optimierten Hardwareimplementierungen zu reagieren. Insbesondere im normalen Betrieb könnten die meisten Buchhaltungs- und Fehlererkennungsarbeiten während der Transaktion ausgeführt werden und die nächsten Pakete und Transaktionen könnten in die Warteschlange gestellt werden.
Übertragungen für andere Endpunkte oder zusätzliche Kommunikation wurden nicht berücksichtigt. Möglicherweise erfordert das Standardprotokoll für Speichergeräte eine kontinuierliche Seitenkanal-Kommunikation, die wertvolle Slot-Zeit in Anspruch nimmt.
Möglicherweise ist ein zusätzlicher Protokoll-Overhead für Speichergeräte für den Gerätetreiber oder die Dateisystemschicht erforderlich. (Paketnutzlast == Speicherdaten?)
Frage
Warum können heutige Implementierungen kein Streaming mit 53 MB / s durchführen?
Wo liegt der Engpass bei den heutigen Implementierungen?
Und ein mögliches Follow-up: Warum hat niemand versucht, einen solchen Engpass zu beseitigen?