【发布时间】: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 倍以上。