2013-07-21 14 views
7

Ich fand meine MMIO lesen/schreiben Latenz ist unangemessen hoch. Ich hoffe, jemand könnte mir ein paar Vorschläge machen.MMIO lesen/schreiben Latenz

Im Kernelraum schrieb ich ein einfaches Programm, um einen 4-Byte-Wert in der BAR0-Adresse eines PCIe-Gerätes zu lesen. Das Gerät ist ein PCIe Intel 10G NIC und ist am PCIe x16 Bus meines Xeon E5 Servers eingesteckt. Ich RDTSC verwenden, um die Zeit zwischen dem Beginn des MMIO lesen und das Ende zu messen, sieht ein Code-Schnipsel wie folgt aus:

vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device 
rdtscl(init); 
ret = readl(vaddr); 
rmb(); 
rdtscl(end); 

ich die verstrichene Zeit zwischen erwarten (Ende init) auf weniger als 1 us Schließlich sollten die Daten, die die PCIe-Datenverbindung durchlaufen, nur einige Nanosekunden betragen. Jedoch zeigen meine Testergebnisse mindestens 5.5use, um ein MMIO PCIe Gerät zu lesen. Ich frage mich, ob das vernünftig ist. Ich ändere meinen Code um remote die Speicherbarriere (rmb), aber immer noch um 5 us Latenz.

Dieser Artikel erwähnt die PCIe-Latenzzeitmessung. Normalerweise ist es weniger als 1us. www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf Muss ich eine spezielle Konfiguration wie Kernel oder Gerät vornehmen, um eine niedrigere MMIO-Zugriffslatenz zu erhalten? oder Hat jemand schon Erfahrungen damit gemacht?

Antwort

-1

Wenn die NIC-Karte über das Netzwerk gehen muss, z. B. über Switches, um die Daten von einem Remote-Host zu erhalten, ist 5.5us eine vernünftige Lesezeit. Wenn Sie ein Register im lokalen PCIe-Gerät lesen, sollte es weniger als 1us betragen. Ich habe keine Erfahrung mit der Intel 10G NIC, aber haben mit Infiniband und benutzerdefinierten Karten gearbeitet.

+0

Ich messe weniger als 1 us, um ein Wort in der BAR eines Geräts auf dem lokalen PCIe-Bus zu lesen. Nicht sicher, warum mein Kommentar abgelehnt wurde, da ich nur bestätige, dass die Ergebnisse in der Zeitung realistisch sind. Die BAR wurde in den User Space gemappt, die wir gerade gelesen haben. Zählen Sie auch die Zeit ioremap_nocache()? Als Teil meiner Arbeit, ich lese Register in BARs in Systemen im Raum, und es dauert weniger als 5,5 us. Ich benutze RDMA über Mellanox FDR Infiniband mit einem IB-Schalter zwischen den Systemen. –

2

5usec ist großartig! Machen Sie das in einer Schleife statistisch und Sie könnten viel viel größere Werte finden.

Dafür gibt es mehrere Gründe. BARs sind normalerweise nicht cachefähig und nicht vorabrufbar - überprüfen Sie Ihre mit pci_resource_flags(). Wenn die BAR als cachefähig gekennzeichnet ist, dann ist dies die Cache-Kohärenz - der Prozess, bei dem sichergestellt wird, dass alle CPUs den gleichen Wert im Cache haben, kann ein Problem sein.

Zweitens ist das Lesen von io immer eine nicht gepostete Angelegenheit. Die CPU muss stehen bleiben, bis sie die Erlaubnis erhält, auf einem Datenbus zu kommunizieren und etwas länger stehenzubleiben, bis die Daten auf dem Bus ankommen. Dieser Bus ist so aufgebaut, dass er wie Speicher aussieht, aber in Wirklichkeit ist dies nicht der Fall und der Stand könnte ein nicht unterbrechbares, beschäftigtes Warten sein, aber dennoch nicht produktiv. Daher würde ich erwarten, dass die Latenz im schlimmsten Fall viel höher als 5 us ist, sogar bevor Sie anfangen, die Vorbelegung von Aufgaben in Betracht zu ziehen.