接上文一次HugePage碎片引发的DPDK性能雪崩——深入理解TLB、HugePage、IOMMU与地址转换上-CSDN博客十一、TLB并不是无限大的很多开发者第一次了解到TLB后都会产生一个疑问既然TLB这么重要CPU为什么不把它做得很大答案很简单TLB本身也是Cache。Cache越大访问时间越长。CPU不能因为地址转换而降低每次Load指令的速度。因此Intel处理器通常采用多级TLB结构。以Intel Xeon为例不同型号略有差异Load指令 │ ▼ L1 DTLB │ ▼ STLBSecond-Level TLB │ ▼ Page Walk Cache │ ▼ Page TableL1 DTLB容量非常小只有几十到上百个Entry。STLB容量虽然更大但也远不是无限。一旦Working Set覆盖的页数超过TLB容量。CPU只能不断Page Walk。十二、为什么2MB HugePage和1GB HugePage并不完全一样很多文章都会说1GB HugePage一定比2MB更快。实际上并不能这样简单理解。假设需要映射8GB如果使用2MB HugePage。需要8GB ÷ 2MB 4096页如果使用1GB HugePage只需要8页TLB压力确实进一步降低。但是1GB HugePage也存在几个问题。第一内存申请困难Linux需要连续1GB物理内存。系统运行一段时间以后。碎片化很容易导致申请失败。第二内存利用率降低很多对象根本用不到1GB。却必须独占整个HugePage。第三NUMA管理更加困难因此目前绝大多数DPDK生产环境仍然主要采用2MB HugePage。只有极少数超高性能场景才会使用1GB HugePage。十三、为什么DPDK要求VFIO和IOVA很多人在部署DPDK时都会看到vfio-pci或者IOVAVA很多人直接照着配置。却不知道为什么。原因在于NIC并不能识别虚拟地址。CPU看到的是Virtual Address但是DMA Engine只能访问Physical Address于是必须有人完成地址转换。如果没有IOMMU流程Application ↓ Virtual Address ↓ Physical Address ↓ DMA如果开启IOMMU流程变成Application ↓ Virtual Address ↓ IOVA ↓ IOMMU ↓ Physical Address ↓ DMA也就是说NIC看到的并不是真正物理地址。而是IOVAInput Output Virtual Address。十四、IOMMU为什么既是朋友也是敌人IOMMU最大的优势就是安全。以前DMA可以直接访问任何物理内存。如果设备异常。甚至可能覆盖整个系统。IOMMU以后DMA只能访问映射区域。安全性大幅提升。但是任何地址转换都有代价。DMA访问也需要查表。如果DMA Mapping数量很多。IOMMU自身也会产生TLB Miss。因此很多极限性能测试仍然会看到iommupt或者Passthrough模式。目的就是减少DMA地址翻译。需要强调的是这里的优化是在明确安全边界、专用网络设备以及可控环境下进行的。生产环境是否采用Passthrough模式需要综合考虑安全、虚拟化隔离和运维要求而不是单纯追求性能。十五、为什么Session越大TLB压力越大回到本次事故。很多人一直认为Session增加。只是Hash变慢。实际上真正变化的是Session覆盖越来越多内存页。例如20万Session。可能集中几百个HugePage。100万Session。可能分布几千个HugePage。CPU每处理一个包访问Session ↓ PDR ↓ FAR ↓ QER ↓ Statistics这些对象。开始落到不同HugePage。TLB越来越容易被冲掉。于是。每秒几千万Page Walk。CPU真正等待的不是Session。而是地址翻译。十六、如何定位TLB问题很多工程师只看perf top其实TLB问题通常需要perf stat重点关注dTLB-load-misses dTLB-store-misses iTLB-load-misses进一步可以观察Page Walk Backend Stall Instructions IPC如果出现IPC下降 Instructions下降 Cycles基本不变 TLB Miss暴涨通常说明CPU开始等待地址转换。而不是等待业务计算。这种特征与Cache Miss有明显区别。十七、最终如何解决事故最终并没有修改ACL。也没有修改Hash。更没有修改DPDK版本。团队主要进行了三项优化。第一重新规划HugePage。避免运行过程中临时申请。在系统启动阶段一次性预留足够的2MB HugePage减少物理内存碎片带来的影响。第二优化对象布局。将SessionPDRFAR这些高频访问对象尽量放在连续内存区域。降低Working Set。第三冷热数据分离。统计信息、Timer、日志这些Cold Data从Session主体中拆离。让Worker真正访问的Hot Data。尽可能集中。优化完成以后指标优化前优化后吞吐63 Gbps91 GbpsdTLB Miss27.8M4.2MIPC1.491.80Backend Stall46%21%CPU100%100%可以看到CPU利用率始终100%。真正恢复的是CPU执行有效指令的能力。十八、DPDK内存优化不只是HugePage很多人认为只要配置HugePageDPDK性能就结束了。实际上真正重要的是整个内存访问路径。包括HugePage大小mempool对象布局mbuf冷热字段Session连续性TLB覆盖率IOMMU配置IOVA模式。这些共同决定CPU每秒到底是在处理数据包。还是在做地址翻译。十九、写在最后过去几年很多DPDK性能优化都集中在算法、NUMA、RSS、Cache和流水线设计上。但随着CPU计算能力不断提升地址转换成本逐渐成为新的性能瓶颈。TLB虽然只是处理器中的一个很小的部件却承担着每一次内存访问前的地址转换工作。当Working Set不断扩大、Session越来越多、ACL越来越复杂时TLB命中率往往比Cache命中率更早达到瓶颈。这也是为什么DPDK从诞生开始就强调HugePage、连续内存和大页映射并通过VFIO、IOVA等机制尽可能减少DMA地址转换带来的额外开销。对于高性能DPDK应用而言一个值得长期坚持的设计原则是真正限制性能的不只是CPU计算速度也不只是Cache命中率而是整个地址转换链路的效率。当你发现CPU始终100%Cache Miss正常NIC没有丢包算法没有变化却仍然出现吞吐下降时不妨把目光从算法和缓存转向TLB、HugePage和地址转换。很多看似无法解释的性能问题真正的答案往往就隐藏在这里。