MMIO读/写延迟

时间:2013-07-21 09:21:31

标签: 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); 
ret = readl(vaddr); 
rmb(); 
rdtscl(end);

我期望(end,init)之间的经过时间小于1us,毕竟,遍历PCIe数据链路的数据应该只有几纳秒。但是,我的测试结果显示至少5.5用于执行MMIO PCIe设备读取。我想知道这是否合理。我将我的代码更改为远程内存屏障(rmb),但仍然可以获得大约5美分的延迟。

本文提到了PCIe延迟测量。通常它不到1us。 www.cl.cam.ac.uk/~awm22/.../miller2009motivating.pdf 我是否需要执行任何特殊配置(如内核或设备)才能获得较低的MMIO访问延迟?或者有没有人有这样的经历?

2 个答案:

答案 0 :(得分:2)

5usec很棒!在统计上循环执行此操作,您可能会发现更大的值。

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

其次,阅读io总是不贴事。 CPU必须停止,直到它获得在某些数据总线上进行通信的许可并停止一点直到数据到达所述总线为止。这条总线看起来像记忆,但事实上并非如此,而且失速可能是一个不间断的繁忙等待,但它的非生产性永远不会少。因此,即使在您开始考虑任务抢占之前,我预计最坏情况下的延迟会远远高于5us。

答案 1 :(得分:-1)

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