我想知道操作系统在启动 RDMA 时的作用。谁启动它 OS 或 CPU?RDMA 启动后操作系统会发生什么?
3 回答
“启动 RDMA”是什么意思?是开始使用 RDMA 实际读取/写入数据,还是启用 RDMA 所需完成的所有准备工作?
无论如何,RDMA 描述了 NIC/HCA 通过该机器的 NIC/HCA 访问远程机器上的内存的能力,而无需涉及本地和远程机器上的 CPU。RDMA 还包括 DMA,这意味着网卡可以访问本地计算机上的物理内存,而无需涉及 CPU。
网卡获得以下类型的订单:
Take the buffer that is located on the local machine at address ADDR_LOCAL
of size SIZE and write it to remote machine's memory at address ADDR_REMOTE.
此操作示例称为 RDMA 写入。
驱动程序向网卡发出命令(反过来,某些应用程序可以向网卡发出请求)。从这一刻起,该卡将在两边都没有 CPU 的情况下完成所有工作(即,没有操作系统)。
当命令完成时,发送方的网卡可能会产生一个事件,该事件将被驱动程序(OS)拾取。在接收端,操作系统将完全不知道 RDMA 写操作刚刚发生。接收方需要定期检查请求地址的内存以了解数据何时到达,或者有一些其他机制(有很多选项,不想详细介绍)。
还有其他 RDMA 命令,例如 RDMA Read,但我认为现在主要思想很清楚。
但是请注意,为了能够执行 RDMA 命令,驱动程序必须准备好所有基础结构:必须注册和固定从/到内存缓冲区,以防止它们在 RDMA 命令执行期间被换出,本地网卡必须知道遥控器的机器内存密钥等。所有这些准备工作都是由两台机器上的驱动程序完成的。
与操作系统一起在 CPU 上运行的程序会启动 RDMA 传输。它负责设置能够被 RDMA 读取或 RDMA 写入的内存区域的所有 API 调用。操作系统是您的程序和支持 RDMA 的硬件之间的中介。
您的程序进行的调用是操作系统进入的地方。有些在内核驱动程序中,有些在用户空间中。用户空间和内核驱动程序混合在一起。
RDMA 传输之前的必要调用之一是操作系统系统调用,用于创建固定内存或无法从 RAM 中调出的内存。
另一个使用 Infiniband HBA 或 RDMA NIC 固定内存区域的 API 调用寄存器。
还有其他呼叫用于设置传输和配置各种参数。
流控制还需要其他发送/接收调用,这些调用不是 RDMA,而是异步完成。
最后是 RDMA 读写调用本身。当这些调用运行时,CPU 没有做任何工作。
RDMA 实际上很难使用。我已经开始在 Isis2 (Isis2.codeplex.com) 中支持它,这是我们在康奈尔创建的用于数据复制、容错和分布式一致性的系统。大多数人在 EC2 等云平台上使用它,但您也可以将 Isis2 配置为在其他 Linux 或 Windows 设置中运行,通过 UDP、IPMC、TCP 或 RDMA(目前仅使用 Infiniband 进行测试,但我们将很快在 RDMA 以太网上进行测试)
我可以说的是,老实说,我从来没有发现过更难使用的技术。RDMA 更像是一种硬件功能,而不是通常直接使用的任何东西。
我的建议:使用 MPI(广泛流行的高性能计算系统)或我的 Isis2 库中的 RDMA。不要试图直接使用它。