2013-07-21 1 views
7

내 MMIO 읽기/쓰기 대기 시간이 부당하게 높습니다. 누군가가 나에게 제안을 해줄 수 있기를 바랍니다.MMIO 읽기/쓰기 대기 시간

커널 공간에서 PCIe 장치의 BAR0 주소에서 4 바이트 값을 읽는 간단한 프로그램을 작성했습니다. 이 장치는 PCIe Intel 10G NIC이며 Xeon E5 서버의 PCIe x16 버스에 연결되어 있습니다. 내가 읽고 끝 MMIO의 시작 사이의 시간을 측정하는 RDTSC를 사용하는 코드는 다음과 같습니다

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

내가 (끝은, 초기화)이 1us 미만이어야하는 사이의 경과 시간을 기대하고 있습니다 결국 PCIe 데이터 링크를 통과하는 데이터는 불과 몇 나노초가되어야합니다. 그러나 내 테스트 결과는 5.5에서 MMIO PCIe 장치 읽기를 수행하는 것으로 나타났습니다. 이것이 합리적인지 궁금합니다. 원격 코드를 메모리 장벽 (rmb)으로 변경하지만 지연 시간은 약 5입니다.

이 백서에서는 PCIe 대기 시간 측정에 대해 언급합니다. 보통 1 초 미만입니다. www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf 더 낮은 MMIO 액세스 대기 시간을 얻으려면 커널이나 장치와 같은 특수 구성을 수행해야합니까? 또는 이전에 경험 한 사람이 있습니까?

답변

-1

NIC 카드가 원격 호스트에서 데이터를 가져 오기 위해 스위치를 통해 네트워크를 거쳐야하는 경우, 5.5us는 적절한 읽기 시간입니다. 로컬 PCIe 장치에서 레지스터를 읽는 경우 1us 미만이어야합니다. Intel 10G NIC에 대한 경험이 없지만 Infiniband 및 맞춤형 카드로 작업 한 적이 있습니다.

+0

로컬 PCIe 버스에있는 장치의 BAR에서 단어를 읽는 데 1 us 미만을 측정합니다. 필자가 논문의 결과가 사실적임을 확인하고 나서 내 의견이 왜 투표에 실패했는지 확신 할 수 없다. BAR이 사용자 공간에 매핑되었으므로 주소를 읽었습니다. ioremap_nocache() 시간도 계산하고 있습니까? 제 직업의 일환으로 방 전체의 시스템에서 BAR 레지스터를 읽었습니다. 5.5 점이 적습니다. 시스템간에 IB 스위치가있는 Mellanox FDR Infiniband보다 RDMA를 사용하고 있습니다. –

2

5usec 대단합니다! 통계적으로 루프를 반복하면 훨씬 더 큰 값을 찾을 수 있습니다.

여기에는 여러 가지 이유가 있습니다. BAR은 일반적으로 캐시가 가능하지 않고 프리 페치가 불가능합니다. pci_resource_flags()를 사용하여 바를 점검하십시오. BAR이 캐시 가능한 것으로 표시되면 캐시 일관성 - 모든 CPU의 캐시 된 값이 동일한 지 확인하는 프로세스가 한 가지 문제 일 수 있습니다.

두 번째로, 독서 io는 항상 게시되지 않은 사건입니다. CPU는 일부 데이터 버스에서 통신 할 수있는 권한을 얻고 데이터가 상기 버스에 도착할 때까지 조금 더 정지해야만 실속해야합니다. 이 버스는 기억처럼 보이도록 만들어졌지만 실제로는 그렇지 않습니다. 그리고 실속은 중단되지 않는 바쁜 대기이지만 생산성이 떨어지는 결코 적습니다. 따라서 작업 우선 처리를 고려하기도 전에 최악의 대기 시간이 5us보다 훨씬 높을 것으로 예상됩니다.