【问题标题】:Huge number of "dTLB-load-misses" when DPDK forwarding testDPDK 转发测试时出现大量“dTLB-load-misses”
【发布时间】:2019-02-04 05:31:21
【问题描述】:

最近我正在尝试使用 DPDK“testpmd”应用程序进行一些转发测试。我发现了一些有趣的东西。

当 TX 和 RX 使用 512 描述符时,性能优于使用 4096 描述符。使用“perf”命令检查计数器后,我发现观察到大量“dTLB-load-misses”。大约是 512 个描述符的 100 多倍。但页面错误始终为零。使用 ":u" 和 ":k" 参数,似乎大多数 TLB 未命中都在用户空间中。所有的缓冲区都在一个巨大的页面中,用于存储网络有效载荷的数据,巨大的页面大小为 512MB。每个缓冲区小于 3KB。缓冲区和描述符是一对一的映射。

那么有什么线索可以让我找到大量的 TLB 未命中?对性能有影响吗?(降级)

谢谢

【问题讨论】:

  • 什么是 CPU?
  • Hi Andiy,它是一个兼容 ARMv8.1 的多核 CPU。该内核并非来自 ARM,仅获得许可。
  • 另一个有趣的事情是,当缓冲区仅用于 RX 时,dTLB 未命中数并没有那么大。但是当应用程序转发缓冲区(只是将缓冲区放入NIC TX队列中而不对数据字段进行任何修改)时,dTLB未命中数会显着变大。
  • 好吧,正如您所见,更多并不总是更好。描述符通常用作循环缓冲区。所以即使应用只转发,更多的描述符也可能不适合 L1/L2 dTLB 缓存...
  • 我上面描述的不是很清楚。我的意思是,如果将 testpmd 设置为具有 4096 txd 和 4096 rxd 的 rxonly 模式,例如,与 512rxd/txd 相比,dTLB 加载未命中数并不是很大。但是当 testpmd 设置为 io fwd 模式 4096txd/rxd 时,未命中数增加了 100 倍以上。

标签: arm tlb dpdk


【解决方案1】:

一般来说,CPU TLB 缓存容量取决于页面大小。这意味着对于 4KB 页面和 512MB 页面,可能有不同数量的 L1/L2 TLB 缓存条目。

例如,对于 ARM Cortex-A75:

数据微型 TLB 是一个 48 条目的完全关联 TLB,供加载和存储操作使用。缓存条目只有 4KB、16KB、64KB 和 1MB 粒度的 VA 到 PA 映射。

来源:ARM Info Center

对于 ARM Cortex-A55:

Cortex-A55 L1 数据 TLB 仅支持 4KB 页。 在 L2 TLB 和适当的页面大小发送到 L1 TLB 之后,任何其他页面大小都会被分解。

来源:ARM Info Center

基本上,这意味着 512MB 的大页面映射将被分割成更小的大小(低至 4K),并且只有那些小块会缓存在 L1 dTLB 中。

因此,即使您的应用程序适合单个 512MB 页面,性能仍然很大程度上取决于实际内存占用。

【讨论】:

  • 现在我对此有点清楚了,似乎 TLB 与基于 MIPS 的 CPU 上的有点不同。我需要检查数据表并检查 dTLB 的行为。 TLB 的行为很可能是合规的。非常感谢
  • 是的,ARM 非常不同,因此数据表是确认的最佳位置。您还应该检查“dTLB-load-misses”映射到哪个硬件寄存器。并再次检查数据表中该寄存器的确切计数...
  • 谢谢,我会向我们的内核团队索要手册。目前,我只得到几张关于这个的简单幻灯片......
猜你喜欢
  • 2020-07-26
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2019-02-07
  • 1970-01-01
相关资源
最近更新 更多