没有映射内存的 RDMA 传输
RDMA transfer without mapping memory
我有补充流程,应该通过 IB 网络交换文件。然后这些文件将被其他进程使用。
工作流程如下:
- 在 /dev/shm
中创建文件
- 适当调整文件大小
- 进程 VM 中的映射文件
- 用ibv_reg_mr
注册mmaped区域
- 为数据传输启动 RDMA 操作
原来我这个方案的瓶颈是ib_reg_mr(我单独实测注册3Gb内存需要1.78秒)。似乎它触发了内存区域到进程地址 space 的映射。不幸的是,不需要这个操作,因为接收进程不使用这个内存。内存应该在以后被其他进程映射和使用。
所以我认为避免为接收进程更改页表是明智的,但我根本找不到是否可行。
如果有一种方法可以在不将其映射到进程地址的情况下启动内存区域上的数据传输,你能告诉我吗space?
请改用 FRWR(快速内存注册工作请求)。
这是一个通过 ibv_post_send 动词进行内存注册的 API - 更快的方式:
http://lists.openfabrics.org/pipermail/general/2008-May/050235.html
http://lxr.free-electrons.com/source/include/rdma/ib_verbs.h?v=3.2#L734
据我所知,如果不将内存区域映射到进程页表,就无法注册内存区域。在注册期间,页面被固定,以便在设备访问页面时映射不会更改,这需要将它们映射到进程。使用按需分页,您可以延迟将页面映射到进程中,直到 HCA 实际使用它们,但最终它们将被映射。
我有补充流程,应该通过 IB 网络交换文件。然后这些文件将被其他进程使用。
工作流程如下:
- 在 /dev/shm 中创建文件
- 适当调整文件大小
- 进程 VM 中的映射文件
- 用ibv_reg_mr 注册mmaped区域
- 为数据传输启动 RDMA 操作
原来我这个方案的瓶颈是ib_reg_mr(我单独实测注册3Gb内存需要1.78秒)。似乎它触发了内存区域到进程地址 space 的映射。不幸的是,不需要这个操作,因为接收进程不使用这个内存。内存应该在以后被其他进程映射和使用。
所以我认为避免为接收进程更改页表是明智的,但我根本找不到是否可行。
如果有一种方法可以在不将其映射到进程地址的情况下启动内存区域上的数据传输,你能告诉我吗space?
请改用 FRWR(快速内存注册工作请求)。 这是一个通过 ibv_post_send 动词进行内存注册的 API - 更快的方式:
http://lists.openfabrics.org/pipermail/general/2008-May/050235.html
http://lxr.free-electrons.com/source/include/rdma/ib_verbs.h?v=3.2#L734
据我所知,如果不将内存区域映射到进程页表,就无法注册内存区域。在注册期间,页面被固定,以便在设备访问页面时映射不会更改,这需要将它们映射到进程。使用按需分页,您可以延迟将页面映射到进程中,直到 HCA 实际使用它们,但最终它们将被映射。