最近我试图用DPDK“testpmd”应用程序进行一些转发测试。我发现了一些有趣的东西。
当512个描述符用于TX和RX时,性能优于使用4096个描述符。用“perf”命令检查计数器后,我发现观察到大量“dTLB-load-miss”。它使用512个描述符大约是100倍。但页面错误始终为零。使用“:u”和“:k”参数,似乎大多数TLB未命中都在用户空间中。所有缓冲区都在一个巨大的页面中,用于存储网络有效负载的数据,而巨大的页面大小为512MB。每个缓冲区小于3KB。缓冲区和描述符是一对一的映射。
那么有什么线索我能找到大量的TLB未命中吗?它会对性能产生一些影响吗?(退化)
谢谢
通常,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页面,性能仍将在很大程度上取决于实际内存占用量。