快速远程持久内存访问的挑战与解决方案
在当今的分布式系统中,快速远程持久内存访问以及持久日志的高效处理是至关重要的。本文将深入探讨如何利用 DMA 引擎提升 RPC 吞吐量,以及如何优化持久日志的性能。
1. DMA 引擎背景
现代 CPU 中的片上 DMA 引擎,如英特尔的 I/O 加速技术(IOAT)DMA 引擎,旨在加速高速网络和存储等应用中的内存复制操作。虽然处理器已经配备 DMA 引擎超过十年,但这些加速器的使用并不广泛。例如,谷歌在高速网络中使用 IOAT DMA 引擎将网络数据包从网卡的环形缓冲区复制到应用程序缓冲区。
过去,开发者忽视 DMA 加速的一个原因是其复制速度较低,甚至低于单个 CPU 核心的基本 memcpy 速度。不过,英特尔在 Skylake 及更新的处理器中将 DMA 引擎速度提高到了约 15 GB/s,AMD 的第二代 EPYC 处理器中的 DMA 引擎提供了高达 70 GB/s 的速率,这表明 DMA 加速对于未来更快的网络和非易失性内存(NVMM)是一种有前景的策略。
在软件支持方面,我们使用 DPDK 库中的用户空间驱动程序来操作 IOAT DMA 引擎。应用程序线程通过异步、无锁的 API 与 DMA 引擎交互,将工作描述符发布到每个线程的 DMA “通道”。需要注意的是,IOAT DMA 引擎操作的是物理地址,在 Linux 系统中,特权应用程序可以通过解析 /proc/self/pagemap 将虚拟地址转换为物理地址。我们使用在启动时分配的 2 MB 大页,并在首次转换后缓存物理地址,这样在稳定状态下,基准测试无需进行虚拟到物理地址的转换。
超级会员免费看
订阅专栏 解锁全文
173万+

被折叠的 条评论
为什么被折叠?



