使用 verbs 接口实施客户机和服务器通信(仅限 Linux)

开发使用 verbs 接口的应用程序需要多个步骤来创建服务器和客户机之间的远程直接存储器存取 (RDMA) 连接中使用的工件。 系统提供了示例来引导开发人员在连接的客户端和服务器端完成该过程。

注: SR8 FP30 更改开始 IBM® SDK, Java™ Technology Edition, Version 8 中删除了之前已废弃的 RDMA 实现。服务更新 8 修复包 30 的更改结束
通过 verbs API,可以控制如何创建和使用 RDMA 资源。 在开始任何开发工作之前,您应该充分了解 RDMA 通信以及 Java 应用程序的客户机和服务器环境。 需要以下类型的 RDMA 资源:
  • 保护域
  • 连接标识
  • 队列对
  • 完成队列
您必须确定这些资源应如何相互关联。 例如,单独的队列对可以与单个完成队列关联,也可以与共享完成队列关联。 您还必须确定 RDMA 资源应如何用于联网。 例如,可以直接轮询完成队列,也可以在事件通道上请求通知,此后轮询完成队列。
下图显示使用 verbs API 的客户机和服务器实施的示例。 对于客户机和服务器过程均通用的特定步骤在后面的图中进行了扩展。 有关这些通信流中使用的术语的详细说明,请参阅 jVerbs 编程术语和工件(Linux 仅适用)
该图显示了使用动词 API 开发应用程序时 RDMA 通信所需的编程步骤的示例。 这些步骤在连接的客户端和服务器端均需要依照特定顺序。 此外,还会突出显示在客户机和服务器系统之间的流程特定阶段生成的通信事件。 有关通信流的完整描述,请阅读关联文本。
下图扩展分配 RDMA 结构时所需的编程步骤。 在第一个图中,此过程显示为标注“分配 RDMA 结构”的单个步骤,标记数字 1。
该图显示了为数据传输分配 RDMA 结构所需的步骤的示例。 在通信的客户端和服务器端均需要这些步骤。 有关步骤的描述,请阅读关联的文本。
下图扩展在移除 RDMA 结构时所需的编程步骤。 在第一个图中,此过程显示为标注“销毁分配的结构”的单个步骤,标记数字 2。
该图显示了在数据传输后移除 RDMA 结构所需的步骤的示例。 在通信的客户端和服务器端均需要这些步骤。 有关步骤的描述,请阅读关联的文本。

以下部分提供图中展示的服务器和客户机通信流的说明。

服务器流程

在 RDMA 连接的服务器端建立了以下事件:
  1. 创建事件通道。
  2. 创建连接标识并将其与事件通道关联。 可以将任何数量的连接标识与事件通道关联。
  3. 服务器侦听来自客户机的连接请求。
  4. 当接收到客户机连接请求时,将对请求进行应答。 请求的事件类型为 RDMA_CM_EVENT_CONNECT_REQUEST
  5. 对于从客户机接收到的每个请求,将会执行以下步骤:
    1. 服务器获取客户机连接标识。
    2. 在建立服务器和客户机之间的连接之前分配必要的 RDMA 结构。 需要以下步骤来创建 RDMA 结构:
      • 获取设备的上下文,该上下文可用于查询设备、端口或全局唯一标识 (GUID)。
      • 分配保护域。
      • 为发布完成事件创建完成通道。
      • 创建完成队列。
      • 针对完成队列通知发出工作请求。
      • 创建队列对。
      • 为数据传输分配并注册直接字节缓冲区。
    3. (可选)可以启动完成队列处理线程。 有关发生的事件的更多信息,请参阅 完成队列处理
    4. 当 RDMA 结构就绪时,服务器会发布接收工作请求。
    5. 接受工作请求后,会向客户机发送事件以确认连接已建立并准备就绪以接收 RDMA 发送或接收请求。 事件类型为 RDMA_CM_EVENT_ESTABLISHED
    6. 发布发送或接收请求,该请求会在服务器和客户机系统之间启动数据传输。
    7. 当工作请求完成时,断开连接。 事件类型 RDMA_CM_EVENT_DISCONNECTED 是由服务器生成的。
    8. 按照以下顺序移除为数据传输创建的 RDMA 结构:
      1. 清除并注销缓冲区。
      2. 移除完成队列。
      3. 移除完成通道。
      4. 移除队列对。
  6. 要断开服务器与客户机系统的连接以阻止进一步的 RDMA 操作,请移除连接标识。
  7. 移除事件通道。 在接收到所有应答之前,无法移除事件通道。

客户机流程

在 RDMA 连接的客户端发生了以下事件:
  1. 创建事件通道。
  2. 创建连接标识并将其与事件通道关联。 可以将任何数量的连接标识与事件通道关联。
  3. 客户机使用 ConnectionID.ResolveAddress() 方法查询服务器系统的地址。 在收到事件类型 RDMA_CM_EVENT_ADDRESS_RESOLVED 时,客户机发送确认。
  4. 客户机使用 ConnectionID.ResolveRoute() 方法查询服务器系统的路由。 在收到事件类型 RDMA_CM_EVENT_ROUTE_RESOLVED 时,客户机发送确认。
  5. 在建立客户机和服务器之间的连接之前分配必要的 RDMA 结构。 需要以下步骤来创建 RDMA 结构:
    • 获取设备的上下文,该上下文可用于查询设备、端口或全局唯一标识 (GUID)。
    • 分配保护域。
    • 为发布完成事件创建完成通道。
    • 创建完成队列。
    • 针对完成队列通知发出工作请求。
    • 创建队列对。
    • 为数据传输分配并注册直接字节缓冲区。
  6. (可选)可以启动完成队列处理线程。 有关发生的事件的更多信息,请参阅 完成队列处理
  7. 向服务器发出发布接收请求。
  8. 向服务器发出连接请求。 这将生成事件类型 RDMA_CM_CONNECT_REQUEST 并发送到服务器。
  9. 客户机将等待直至从服务器收到事件类型 RDMA_CM_EVENT_ESTABLISHED。 此事件指示已建立连接且可以进行数据传输。
  10. 发布发送或接收工作请求,该请求会在服务器和客户机系统之间启动数据传输。
  11. 当工作请求完成时,断开连接。 事件类型 RDMA_CM_EVENT_DISCONNECTED 是由客户机生成的。
  12. 按照以下顺序移除为数据传输创建的 RDMA 结构:
    1. 清除并注销缓冲区。
    2. 移除完成队列。
    3. 移除完成通道。
    4. 移除队列对。
  13. 要断开客户机与服务器的连接以阻止进一步的 RDMA 操作,请移除连接标识。
  14. 移除事件通道。

完成队列处理

下图扩展在选择处理完成队列时所需的编程步骤。 此过程在第一张图中显示为以“完成队列处理”标示的单个步骤,该步骤使用编号 3 进行标记。
该图显示了处理完成队列所需的步骤的示例。 这些步骤在通信的客户端和服务器端均是可选的。 有关步骤的描述,请阅读关联的文本。
图中显示了以下步骤:
  1. 客户机或服务器使用 getCQEvent()pollCQEvent() 方法来从触发处理的事件队列通道检索类型为 RDMA_CM_EVENT ESTABLISHED 的事件。
  2. 处理工作完成。
  3. 向完成队列发送应答以确认工作完成。
  4. 针对完成队列通知发出请求以确保完成队列接收到应答。