【问题标题】:MMIO read/write latencyMMIO 读/写延迟
【发布时间】:2013-07-21 09:21:30
【问题描述】:

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

在内核空间中,我编写了一个简单的程序来读取 PCIe 设备的 BAR0 地址中的 4 字节值。该设备是一个 PCIe Intel 10G NIC,插入到我的 Xeon E5 服务器上的 PCIe x16 总线上。我用rdtsc来测量MMIO读取开始到结束的时间,代码sn-p是这样的:

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 us 的延迟。

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

【问题讨论】:

    标签: linux linux-device-driver pci-e pci-bus


    【解决方案1】:

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

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

    其次,阅读 io 始终是不张贴的事情。 CPU 必须停止,直到它获得在某些数据总线上通信的许可,并停止更多时间,直到数据到达所述总线。这条总线看起来像内存,但实际上并非如此,而且停顿可能是不可中断的忙碌等待,但它的非生产性却始终没有。因此,即使在您开始考虑任务抢占之前,我预计最坏情况下的延迟会远高于 5us。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我在本地 PCIe 总线上读取设备的 BAR 中的一个字不到 1 us。不知道为什么我的评论被否决了,因为我只是确认论文中的结果是现实的。 BAR 被映射到用户空间,我们只是读取地址。您是否也在计算 ioremap_nocache() 时间?作为我工作的一部分,我在整个房间的系统中读取 BAR 中的寄存器,这需要不到 5.5 us。我在 Mellanox FDR Infiniband 上使用 RDMA,并在系统之间使用 IB 交换机。
      猜你喜欢
      • 2017-03-16
      • 1970-01-01
      • 2021-04-12
      • 2010-12-18
      • 2018-07-12
      • 2018-06-04
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多