【问题标题】:Remote Direct Memory Access and OS远程直接内存访问和操作系统
【发布时间】:2014-07-11 20:50:57
【问题描述】:

我想知道操作系统在启动 RDMA 时的作用。谁启动它 OS 或 CPU? RDMA 启动后操作系统会发生什么?

【问题讨论】:

    标签: rdma


    【解决方案1】:

    “启动 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 命令期间被换出执行时,本地网卡必须知道远程的机器内存密钥等。 所有这些准备工作都是由两台机器上的驱动程序完成的。

    【讨论】:

      【解决方案2】:

      您在 CPU 上与操作系统一起运行的程序会启动 RDMA 传输。它负责设置能够被 RDMA 读取或 RDMA 写入的内存区域的所有 API 调用。操作系统是您的程序和支持 RDMA 的硬件之间的中介。

      您的程序进行的调用是操作系统进入的地方。有些在内核驱动程序中,有些在用户空间中。混合了用户空间和内核驱动程序。

      RDMA 传输之前的必要调用之一是操作系统系统调用,用于创建固定内存或无法从 RAM 中调出的内存。

      另一个使用 Infiniband HBA 或 RDMA NIC 固定内存区域的 API 调用寄存器。

      还有其他调用用于设置传输和配置各种参数。

      还有其他非 RDMA 而是异步完成的流控制所需的发送/接收调用。

      最后还有 RDMA 读写调用本身。当这些调用运行时,CPU 没有做任何工作。

      【讨论】:

        【解决方案3】:

        RDMA 实际上很难使用。我已经开始在 Isis2 (Isis2.codeplex.com) 中支持它,这是我们在康奈尔创建的用于数据复制、容错和分布式一致性的系统。大多数人在 EC2 等云平台上使用它,但您也可以将 Isis2 配置为在其他 Linux 或 Windows 设置中运行,通过 UDP、IPMC、TCP 或 RDMA(目前仅使用 Infiniband 进行测试,但我们将很快在 RDMA 以太网上进行测试)

        我可以说的是,老实说,我从来没有发现过更难使用的技术。 RDMA 更像是一种硬件功能,而不是通常直接使用的任何功能。

        我的建议:使用 MPI(广泛流行的高性能计算系统)或我的 Isis2 库中的 RDMA。不要尝试直接使用它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-02
          • 2020-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-04
          • 2021-12-20
          • 1970-01-01
          相关资源
          最近更新 更多