极客时间打造的QCon+案例研习社以案例讲解视频、主题直播、社群交互结合的全新线上学习模式,为数字化人才提供利用碎片化时间来提升知识和技能的平台。
讲解回顾
达坦科技联合创始人施继成受邀作为案例研习社的讲师,近日分享了达坦实用的、可落地的Rust技术应用开发经验和实践案例,介绍了达坦是如何使用以安全性著称的系统编程语言—Rust去封装RDMA接口以达到安全高效的目的。
在分享中,施继成简单介绍了Rust语言的三大特性。首先,Rust语言的所有权(ownership)和借用(borrowing)机制对内存管理友好。这一特性非常严格地控制了如果一个内存被大家共享的时候的访问权限和边界。
其次,Rust提供了很方便的异步编程接口。它有Async和Await两个关键词,同时在它的标准库中有Futures的完整的接口支持。因此,Rust天生支持异步I/O编程接口。
最后,Rust还支持零成本抽象。也就是说,在程序构建的过程中,它能提供一个比较高的抽象层,但是抽象层又不会带来性能损失。这带来两大优势: 第一,在构建程序的时候,得以用到比较高级的抽象层,减少了代码冗余;第二,又不会因为抽象层带来性能的损失,因为编译器已经帮忙将抽象展开。鱼和熊掌,两者兼得。
就RDMA的Rust封装设计,施继成认为由于重写RDMA的ibverbs库工作量大,又不能把Rust的一些先进的理念直接带进库当中,因此选择把ibverbs上层封装出来的接口上再封装更高级的抽象层,以此让Rust程序能够直接调用它不失为更明智的选择。
他还介绍了一个Rust binding的生成工具——Bindgen。Bindgen会自动地根据C语言去生成对应的Rust语言的转换接口。但一键式的工具也有局限性,譬如:它没有办法恰当地处理嵌套的数据结构,生成出来的数据结构晦涩难懂,在它的命名上都失去了原来的语义。因此,需要进行一些人工的干预,来帮助自动生成工具,把想要的RDMA的Rust Binding生成出来。其实,直接使用这个库可以进行RDMA编程,这和直接用C语言去写没有本质区别。所以,一些以往碰到的问题,比如裸指针还是会出现。
最后,施继成结合达坦的实践经验,从技术层面详细分享了如何用Rust语言去解决多线程的安全问题、异步接口、以及内存资源管理。Rust语言的天然保护性,无疑给多任务,多个线程过程中共享的RDMA内存加了一把保护锁。然后,他进一步比较了同步接口和异步接口的优劣,强调语言级别的异步操作能够绕过操作系统,而去进行轻量级的任务切换,通过这样的方式,以达到在高吞吐的I/O操作当中,也能够得到比较好的性能的开销。此外,他强调远端的内存管理和本地的内存管理同等重要,以及资源释放的管理问题。
达坦宗旨
而以上实践中思考和设计的逻辑始终是从终端用户的角度出发,希望简化用户使用的难度,并且避免用户使用上的一些错误和安全性的问题。既然身负的是非常底层的造车轮的任务,那就要创造性地精耕细做,努力把车轮造得好一些。
欲了解此次分享中具体的技术细节和设计要点,请点击以下链接,领取极客时间7天会员,免费观看完整视频:https://time.geekbang.org/activity/promo?page_name=page_447
联系我们
欢迎参与达坦科技开源项目async-rdma,Github链接:https://github.com/datenlord/async-rdma