PCIe-Bus: Beeinflussen physikalische Einschränkungen die Übertragungsrate?

Ich werde von weitem anfangen. Letzten Winter habe ich zufällig ein USB-Gerät mit einem im FPGA gehosteten Kern hergestellt. Natürlich wollte ich unbedingt die tatsächliche Bandbreite dieses Busses überprüfen. Im Controller gibt es schließlich zu viel zu tun. Man kann immer sagen, dass es eine Verzögerung gibt oder dort drüben. Im Fall von FPGAs sehe ich einen Block, der Daten pumpt, also sagte er mir, dass Daten darin sind. Ich habe jedoch festgelegt, dass alles verarbeitet wurde, und bin bereit, einen neuen Teil zu akzeptieren (gleichzeitig werden bereits Daten im zweiten Puffer desselben Endpunkts empfangen). Stellen Sie die Bereitschaft von Anfang an ein und sehen Sie, was passiert, wenn USB ohne Unterbrechung „hämmern“ kann.



Aber es stellt sich als erstaunliche Sache heraus. Wenn das USB 2.0-Gerät im „blauen“ Anschluss (USB 3.0) steckt, beträgt die Geschwindigkeit eins. Wenn in "schwarz" - eine andere. Hier ist mein Diagramm der USB-Aufnahmegeschwindigkeit im Verhältnis zur Datenlänge. USB3 und USB2 sind die Art des Anschlusses, das Gerät ist immer USB 2.0 HS.



Ich habe es in verschiedenen Maschinen versucht. Das Ergebnis ist nah. Niemand konnte mir dieses Phänomen erklären. Später fand ich den wahrscheinlichsten Grund. Und der Grund ist sehr einfach. Hier sind die Eigenschaften des USB 2.0-Controllers:



Die Steuerungen, die den „blauen“ Anschluss steuern, tun dies nicht. Und der Unterschied beträgt nur etwa 20 Prozent.

Daraus schließen wir, dass Bandbreitenbeschränkungen nicht immer durch die physikalischen Eigenschaften des Busses bestimmt werden. Manchmal überlagern sich einige andere Dinge. Wir gehen heutzutage mit diesem Wissen weiter.

Primäres Experiment


Also. Alles begann ziemlich banal. Es wurde ein Programm überprüft. Der Vorgang des gleichzeitigen Schreibens von Daten auf mehrere Festplatten wurde überprüft. Die Hardware ist einfach: Es gibt ein Motherboard mit vier PCIe-Steckplätzen. In alle Steckplätze werden absolut identische Karten mit AHCI-Controllern eingesetzt, von denen jeder ausschließlich PCIe x1 unterstützt.



Jede Karte bedient 4 Laufwerke.
Und dann wird der folgende Effekt offenbart. Wir nehmen eine Platte und beginnen, Daten darauf zu schreiben. Wir erhalten eine Geschwindigkeit von 180 bis 220 Megabyte pro Sekunde (im Folgenden sind Megabyte 1024 * 1024 Byte):



Wir nehmen die zweite Fahrt. Die Schreibgeschwindigkeit beträgt 170 bis 190 MB / s:



Wir schreiben sofort an beide - wir bekommen einen Geschwindigkeitsverlust:



Die Gesamtgeschwindigkeit liegt bei 290 MB / s. Aber das Erstaunliche ist, dass wir dieses Programm auf denselben Laufwerken, aber auf anderen Kanälen getestet haben (wie sich herausstellte). Und dort war alles in Ordnung. Wir wechseln schnell zu diesen Kanälen (sie werden eine andere Karte durchlaufen), wir bekommen einen ausgezeichneten Job:



Ich werde einen Slot in einer guten Gegend kaufen


Ich muss sofort sagen, dass es sich nicht lohnt, die Komponenten eines anderen für alles verantwortlich zu machen. Alles hier wird von uns geschrieben, angefangen vom Programm selbst bis hin zu den Treibern. So kann der gesamte Datenpfad überwacht werden. Unbekannt kommt nur, wenn die Anfrage an die Hardware ging.

Nach der ersten Analyse stellte sich heraus, dass die Geschwindigkeit in den "langen" PCIe-Steckplätzen nicht begrenzt ist und in den "kurzen". Bei langen Karten können Sie x16-Karten einlegen (obwohl eine davon im Modus nicht höher als x4 funktioniert), bei kurzen Karten nur für x1-Karten.



Alles wäre in Ordnung, aber die Controller in den aktuellen Karten können im Prinzip nicht in einem anderen Modus als PCIex1 arbeiten. Das heißt, alle Controller müssen sich unabhängig von der Steckplatzlänge in absolut identischen Bedingungen befinden! Aber nein. Wer im "langen" lebt - arbeitet schnell, wer im "kurzen" - langsam. Gut. Und schnell - wie schnell? Fügen Sie ein drittes Laufwerk hinzu und schreiben Sie an alle drei.

In den "kurzen" Slots liegt das Limit immer noch bei 290 MB / s:



Im "langen" - im Bereich von 400 MB / s:





Ich habe das gesamte Internet durchsucht. Erstens habe ich nach einiger Zeit bereits über Artikel gelacht, in denen es heißt, dass der Durchsatz von PCIe Gen 1 und Gen 2 für x1 250 und 500 MB / s beträgt. Dies sind rohe Megabyte. Aufgrund des Overheads (ich verwende dieses nicht-russische Wort, um einen Dienstaustausch zu bezeichnen, der den Hauptdaten entspricht) für Gen 2 erhalten wir genau 400 Megabyte pro Sekunde nützlichen Streams. Zweitens konnte ich hartnäckig nichts über die magische Nummer 290 finden (mit Blick nach vorne - ich habe sie immer noch nicht gefunden).

Großartig. Der Versuch, die Topologie der Einbeziehung unserer Controller zu untersuchen. Hier ist es (013-015 - dies sind die Gerätenamen-Suffixe, anhand derer ich sie abgeglichen habe, um sie irgendwie zu unterscheiden). Grün ist schnell, Rot ist langsam.



Den Controller "015" betrachten wir nicht einmal. Er lebt in einem privilegierten Steckplatz für eine Grafikkarte. Der 013. ist jedoch mit demselben Schalter verbunden wie der 012. von 014. Wie ist er anders?

Einige Artikel besagen, dass sich verschiedene Karten in den Einstellungen für die maximale Nutzlast unterscheiden können. Ich habe den Konfigurationsraum aller Karten untersucht - dieser Parameter gilt für alle mit dem gleichen, minimal möglichen Wert. Darüber hinaus besagt die Dokumentation für den Chipsatz dieses Motherboards, dass es keine andere Bedeutung geben kann.



Im Allgemeinen habe ich alles im Konfigurationsbereich durchsucht - alles ist identisch konfiguriert. Und die Geschwindigkeit ist anders! Lesen Sie die Dokumentation für den Chipsatz wiederholt durch - keine Bandbreiteneinstellungen. Prioritäten - ja, es wurde etwas darüber geschrieben, aber Tests werden ohne jegliche Belastung anderer Kanäle durchgeführt! Das heißt, es ist nicht in ihnen.

Für alle Fälle habe ich sogar das Interrupt-Programm ausgeschaltet. Die Prozessorlast hat sich auf wahnsinnige Beträge erhöht, weil sie jetzt ständig dumm das Bereitschaftsbit liest, aber die Geschwindigkeitswerte haben sich nicht geändert. Es ist also unmöglich, dieses Subsystem für Probleme verantwortlich zu machen.

Und was ist mit anderen Boards?


Wir haben versucht, das Motherboard auf genau das gleiche zu ändern. Keine Änderung. Sie versuchten, den Prozessor zu ersetzen (es gab Gründe zu der Annahme, dass es sich um Junking handelte). Auch keine Geschwindigkeitsänderungen (aber der alte Prozessor ist wirklich Junk). Wir haben ein Motherboard der neuen Generation installiert - alles fliegt einfach auf allen Steckplätzen. Darüber hinaus beträgt die maximale Geschwindigkeit nicht mehr 400, sondern 418 Megabyte pro Sekunde, selbst in "langen", sogar in "kurzen" Slots:



Aber hier - keine Wunder. Mit der üblichen Handbewegung (die heutzutage bereits verwendet wird) lesen wir den Konfigurationsbereich und stellen fest, dass der Parameter Max Payload nicht auf 128, sondern auf 256 Byte festgelegt ist.

Größere Paketgröße - weniger Pakete. Weniger Aufwand für das Senden - nützlichere Daten können gleichzeitig ausgeführt werden. Alles ist richtig.

Also, wer ist schuld?


Ich werde die Frage aus dem Titel unter Bezugnahme auf die Dokumente nicht genau beantworten. Aber mein Gedanke ging den folgenden Weg: Nehmen wir an, die Durchflussbeschränkung ist im Chipsatz festgelegt. Es kann nicht programmiert werden, es ist fest eingestellt, aber es ist. Beispielsweise entspricht dies 290 Megabyte pro Sekunde für jedes Diff. ein paar. Mehr - es ist bereits irgendwo im Chipsatz auf seinen internen Mechanismen geschnitten. Daher wird im "langen" Steckplatz (in dem Sie Karten bis zu x4 stecken können) nichts für unsere Karte im Chipsatz geschnitten, und wir ruhen uns an der physischen Grenze des x1-Busses aus. Im "kurzen" Anschluss stoßen wir auf diese Einschränkung.

In der Tat ist es nicht einfach, dies zu überprüfen, aber sehr einfach. Wir stecken im 013. Steckplatz nicht AHCI, sondern den SAS-Controller, der 8 Laufwerke gleichzeitig bedient und in PCIe-Modi bis zu x4 arbeiten kann. Wir verbinden 4 intelligente SSD-Laufwerke damit. Wir schauen auf die Aufnahmegeschwindigkeit - so sehr sich die Seele freut:



Jetzt fügen wir die 4 Festplatten hinzu, die in den ersten Tests erschienen sind. Die SSD-Leistung ist vorhersehbar gesunken:



Wir berechnen die Gesamtgeschwindigkeit, die durch den SAS-Controller fließt, und erhalten 1175 Megabyte pro Sekunde. Teilen Sie durch 4 (so viele Zeilen gehen zum "langen" Slot), erhalten wir ... Trommelwirbel ... 293 Megabyte pro Sekunde. Irgendwo habe ich diese Nummer schon gesehen!

Im Rahmen dieses Projekts wurde also bewiesen, dass das Problem nicht in unserem Programm oder Treiber liegt, sondern in den seltsamen Einschränkungen des Chipsatzes, die wahrscheinlich eng "verdrahtet" sind. Die Methode zur Auswahl von Motherboards, die im Projekt verwendet werden können, wurde entwickelt. Im Allgemeinen ziehen wir jedoch die folgenden Schlussfolgerungen.

Fazit


  • Im wirklichen Leben hat das Gerät oft eine geringere Leistung als theoretisch möglich. Einschränkungen können sogar von Treibern auferlegt werden, wie im Fall von USB gezeigt. Manchmal ist es möglich, Geräte abzuholen, für die (oder deren Fahrer) keine solchen Einschränkungen gelten.
  • Einschränkungen können sogar nicht dokumentiert sein, aber klar zum Ausdruck gebracht werden.
  • Viele Artikel, die besagen, dass ein Differentialpaar von PCIe gen. 1 und Gen 2 ergeben ungefähr 250 und 500 Megabyte pro Sekunde, sind fehlerhaft. Sie kopieren denselben Fehler voneinander - ein Megabyte Rohdaten pro Sekunde. Der Overhead sammelt sich auf mehreren Ebenen der Schnittstelle. Mit einer maximalen Nutzlast von 128 Bytes erhält PCIe gen2 tatsächlich ungefähr 400 Megabyte pro Sekunde. In neueren PCIe-Generationen sollte alles etwas besser sein, da die physische Codierung nicht 8b / 10b ist, sondern wirtschaftlicher, aber bisher wurde kein Laufwerkscontroller gefunden, auf dem dies in der Praxis getestet werden kann.

Source: https://habr.com/ru/post/de414753/


All Articles