Linux MMIO读/写延迟

Linux MMIO读/写延迟,linux,linux-device-driver,pci-e,pci-bus,Linux,Linux Device Driver,Pci E,Pci Bus,我发现我的MMIO读/写延迟过高。我希望有人能给我一些建议 在内核空间中,我编写了一个简单的程序来读取PCIe设备的BAR0地址中的4字节值。该设备是一个PCIe Intel 10G NIC,并插在我的Xeon E5服务器上的PCIe x16总线上。我使用rdtsc测量MMIO读取开始和结束之间的时间,代码段如下所示: vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device rdtscl(init

我发现我的MMIO读/写延迟过高。我希望有人能给我一些建议

在内核空间中,我编写了一个简单的程序来读取PCIe设备的BAR0地址中的4字节值。该设备是一个PCIe Intel 10G NIC,并插在我的Xeon E5服务器上的PCIe x16总线上。我使用rdtsc测量MMIO读取开始和结束之间的时间,代码段如下所示:

vaddr = ioremap_nocache(0xf8000000, 128); // addr is the BAR0 of the device  
rdtscl(init); 
ret = readl(vaddr); 
rmb(); 
rdtscl(end);
我预计(end,init)之间经过的时间小于1U,毕竟,通过PCIe数据链路的数据应该只有几纳秒。但是,我的测试结果显示,至少有5.5%的用户使用MMIO PCIe设备进行读取。我想知道这是否合理。我将代码更改为远程内存屏障(rmb),但仍有大约5秒的延迟

本文提到了PCIe延迟测量。通常小于1U。 www.cl.cam.ac.uk/~awm22/../miller2009.pdf‎
我是否需要进行任何特殊配置(如内核或设备)以降低MMIO访问延迟?或者有人以前有过这样做的经验吗?

如果NIC卡需要通过网络(可能是通过交换机)从远程主机获取数据,5.5us是一个合理的读取时间。如果正在本地PCIe设备中读取寄存器,则该寄存器应小于1U。我对Intel 10G NIC没有任何经验,但是
曾使用Infiniband和定制卡

5usec太棒了!在循环中进行统计,您可能会发现更大的值

这有几个原因。条通常是不可缓存和不可预取的-使用pci_资源_标志()检查您的条。如果该条被标记为可缓存,那么缓存一致性-确保所有CPU具有相同的缓存值的过程可能是一个问题


其次,阅读io始终是一件不公开的事情。CPU必须暂停,直到它获得在某些数据总线上通信的许可,并暂停一点,直到数据到达所述总线。这条总线看起来像内存,但实际上不是,暂停可能是一个不可中断的忙等待,但它的非生产性从来没有减少。因此,即使在您开始考虑任务抢占之前,我也希望最坏情况的延迟比5US高得多。

在本地PCIE总线上的设备栏中,我测量不到1个字。我不知道为什么我的评论被否决,因为我只是确认报纸上的结果是现实的。该条被映射到用户空间,我们只是读取地址。你也在计算ioremap_nocache()的时间吗?作为我工作的一部分,我在整个房间的系统中读取酒吧里的登记簿,花费的时间少于5.5美元。我在Mellanox FDR Infiniband上使用RDMA,系统之间有IB交换机。