最近我正在尝试使用 DPDK“testpmd”应用程序进行一些转发测试。我发现了一些有趣的东西。
当 TX 和 RX 使用 512 个描述符时,性能优于使用 4096 个描述符。使用 perf
命令检查计数器后,我发现观察到大量“dTLB-load-misses”。它大约是 512 个描述符的 100 多倍。但是 page-faults 始终为零。使用“:u”和“:k”参数,似乎大多数 TLB 未命中都在用户空间中。所有缓冲区都在一个大页面中,用于存储网络有效负载的数据,大页面大小为 512MB。每个缓冲区小于 3KB。缓冲区和描述符是一对一的映射。
那么有什么线索可以找到大量的 TLB 未命中?会不会对性能有影响(退化)?
最佳答案
一般而言,CPU TLB 缓存容量取决于页面大小。这意味着对于 4KB 页面和 512MB 页面,可能会有不同数量的 L1/L2 TLB 缓存条目。
例如,对于 ARM Cortex-A75:
The data micro TLB is a 48-entry fully associative TLB that is used by load and store operations. The cache entries have 4KB, 16KB, 64KB, and 1MB granularity of VA to PA mappings only.
对于 ARM Cortex-A55:
The Cortex-A55 L1 data TLB supports 4KB pages only. Any other page sizes are fractured after the L2 TLB and the appropriate page size sent to the L1 TLB.
基本上,这意味着 512MB 的大页面映射将被分解成更小的尺寸(低至 4K),并且只有那些小部分将被缓存在 L1 dTLB 中。
因此,即使您的应用程序适合单个 512MB 页面,性能仍然在很大程度上取决于实际内存占用量。
关于arm - DPDK转发测试时出现大量 "dTLB-load-misses",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52077230/