2013-07-21 15 views
7

Zauważyłem, że moje opóźnienie odczytu/zapisu MMIO jest nieuzasadnione wysokie. Mam nadzieję, że ktoś może dać mi jakieś sugestie.Opóźnienie odczytu/zapisu MMIO

W przestrzeni jądra napisałem prosty program do odczytu 4-bajtowej wartości w adresie BAR0 urządzenia PCIe. Urządzenie jest kartą PCI 10g Intel 10G i podłączoną do szyny PCIe x16 na moim serwerze Xeon E5. Używam rdtsc zmierzyć czas pomiędzy początkiem MMIO czytać i koniec, to fragment kodu wygląda następująco:

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

Czekam czas, jaki upłynął między (koniec init) za mniej niż 1us w końcu dane przechodzące przez łącze danych PCIe powinny być tylko kilka nanosekund. Jednak wyniki mojego testu pokazują się w punkcie 5.5, aby wykonać odczyt urządzenia MMIO PCIe. Zastanawiam się, czy to jest rozsądne. Zmieniam swój kod na zdalną barierę pamięci (rmb), ale wciąż mamy około 5 lat opóźnienia.

Ten dokument wspomina o pomiarze opóźnienia PCIe. Zwykle jest to mniej niż 1us. www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf Czy muszę wykonać jakąś specjalną konfigurację, taką jak jądro lub urządzenie, aby uzyskać niższe opóźnienie dostępu MMIO? lub Czy ktoś ma już takie doświadczenia?

Odpowiedz

-1

Jeśli karta NIC musi przejść przez sieć, być może poprzez przełączniki, aby uzyskać dane ze zdalnego hosta, 5.5us to rozsądny czas odczytu. Jeśli czytasz rejestr w lokalnym urządzeniu PCIe, powinno być mniej niż 1us. Nie mam żadnego doświadczenia z kartą Intel 10G, ale pracowałem z kartami Infiniband i niestandardowymi.

+0

Zmierzam mniej niż 1 nas, aby przeczytać słowo w BARie urządzeń na lokalnej magistrali PCIe. Nie wiem, dlaczego mój komentarz został odrzucony, ponieważ potwierdzam, że wyniki w gazecie są realistyczne. BAR został zmapowany w przestrzeń użytkownika, po prostu odczytaliśmy adres. Czy liczycie również czas ioremap_nocache()? Jako część mojej pracy, czytam rejestry w BARach w systemach po drugiej stronie pokoju, a zajmuje to mniej niż 5,5 nas. Używam RDMA przez Mellanox FDR Infiniband z przełącznikiem IB pomiędzy systemami. –

2

5usec jest świetny! Zrób to w pętli statystycznie i możesz znaleźć o wiele większe wartości.

Istnieje kilka powodów takiego stanu rzeczy. BAR są zwykle nie-buforowane i nie można ich wstępnie pobierać - sprawdź swoje za pomocą pci_resource_flags(). Jeśli BAR jest oznaczony jako buforowalny, to spójność pamięci podręcznej - jednym z problemów może być proces zapewnienia, że ​​wszystkie procesory mają tę samą buforowaną wartość.

Po drugie, czytanie io zawsze jest sprawą nieopublikowaną. Procesor musi zostać zablokowany, dopóki nie otrzyma pozwolenia na komunikację na niektórych magistralach danych i opóźnienie trochę więcej, dopóki dane nie dotrą do wspomnianej magistrali. Ten autobus ma wyglądać jak pamięć, ale w rzeczywistości nie jest, a stragan może być nieprzerwanym, zajętym czekaniem, ale jego nieproduktywny nigdy nie mniej. Tak więc oczekiwałbym, że najgorszy przypadek opóźnienia będzie znacznie wyższy niż 5, nawet zanim zaczniesz rozważać zapobieganie zadaniom.