作者|王璞
后期编辑|张汉东
转自《RustMagazine中文精选》
RDMA是常⽤于⾼性能计算(HPC)领域的⾼速⽹络,在存储⽹络等专⽤场景也有⼴泛的⽤途。RDMA最⼤的特点是通过软硬件配合,在⽹络传输数据的时候,完全不需要CPU/内核参与,从⽽实现⾼性能的传输⽹络。最早RDMA要求使⽤InfiniBand (IB)⽹络,采⽤专⻔的IB⽹卡和IB交换机。现在RDMA也可以采⽤以太⽹交换机,但是还需要专⽤的IB⽹卡。虽然也有基于以太⽹卡⽤软件实现RDMA的⽅案,但是这种⽅案没有性能优势。
RDMA在实际使⽤的时候,需要采⽤特定的接⼝来编程,⽽且由于RDMA在传输数据的过程中,CPU/内核不参与,因此很多底层的⼯作需要在RDMA编程的时候⾃⾏实现。⽐如RDMA传输时涉及的各种内存管理⼯作,都要开发者调⽤RDMA的接⼝来完成,甚⾄⾃⾏实现,⽽不像在socket编程的时候,有内核帮忙做各种缓存等等。也正是由于RDMA编程的复杂度很⾼,再加上先前RDMA硬件价格⾼昂,使得RDMA不像TCP/IP得到⼴泛使⽤。
本⽂主要介绍我们⽤Rust对RDMA的C接⼝封装时碰到的各种问题,并探讨下如何⽤Rust对RDMA实现safe封装。下⾯⾸先简单介绍RDMA的基本编程⽅式,然后介绍下采⽤Rust对RDMA的C接⼝封装时碰到的各种技术问题,最后介绍下后续⼯作。我们⽤Rust实现的RDMA封装已经开源,包括rdma-sys和async-rdma,前者是对RDMA接⼝的unsafe封装,后者是safe封装(尚未完成)。
目录
RDMA编程理念
先⾸先简要介绍下RDMA编程,因为本⽂重点不是如何⽤RDMA编程,所以主要介绍下RDMA的编程理念。RDMA的全称是Remote Direct Memory Access,从字⾯意思可以看出,RDMA要实现直接访问远程内存,RDMA的很多操作就是关于如何在本地节点和远程节点之间实现内存访问。
RDMA的数据操作分为“单边”和“双边”,双边为send/receive,单边是read/write,本质都是在本地和远程节点之间共享内存。对于双边来说,需要双⽅节点的CPU共同参与,⽽单边则仅仅需要⼀⽅CPU参与即可,对于另⼀⽅的CPU是完全透明的,不会触发中断。根据上述解释,⼤家可以看出“单边”传输才是被⽤来传输⼤量数据的主要⽅法。但是“单边”传输也⾯临这下列挑战:
1. 由于RDMA在数据传输过程中不需要内核参与,所以内核也⽆法帮助RDMA缓存数据,因此RDMA要求在写⼊数据的时候,数据的⼤⼩不能超过接收⽅准备好的共享内存⼤⼩,否则出错。所以发送⽅和接收⽅在写数据前必须约定好每次写数据的⼤⼩。
2. 此外,由于RDMA在数据传输过程中不需要内核参与,因此有可能内核会把本地节点要通过RDMA共享给远程节点的内存给交换出去,所以RDMA必须要跟内核申请把共享的

最低0.47元/天 解锁文章

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



