DPDK会使用DMA将接收到的数据放入用户空间缓冲区,那么DPDK使用的DMA映射是什么呢?是连贯图还是流图?
据我了解,如果使用相干映射,那么由于缓存被禁用,读取性能会受到影响。但如果使用流式映射,就会出现内存一致性问题。由于 DPDK 在用户空间中工作,因此在用户空间应用程序访问新的 DMA 内存之前似乎无法刷新用户空间中的缓存。
内存分配:
大页:DPDK主要利用大页进行内存分配。这些大的、连续的内存区域可以通过减少 TLB 未命中来提高性能。 内存对齐:DPDK 将内存分配与特定缓存行大小或特定于硬件的要求对齐,以优化数据访问模式。 DMA 映射:
DPDK 经常使用流映射进行 DMA 传输以实现高性能。这意味着绕过 CPU 缓存进行直接内存访问。 虽然这种方法可能会引入内存一致性问题,但 DPDK 通过以下方式缓解这些问题: 内存屏障:DPDK 提供了像 rte_mb() 这样的函数来确保内存操作的顺序正确并且对其他内核可见。 缓存行刷新:在某些情况下,DPDK 可能会使用缓存行刷新来确保在用户空间访问数据之前将数据写回主内存。 用户空间访问:
DPDK 提供了同步多个线程或进程之间共享内存区域的访问的机制。这有助于防止数据竞争并确保一致性。