由Rust中文社区举办的题为「Rust For Fun」的首届Rust China Hackathon曾经顺利完赛。达坦科技作为本届Hackathon的协办方,资助参加本次企业组赛道。达坦科技组的赛题无关Concurrent Indexing,咱们邀请参赛者通过创立一个并发索引来解决解决来自客户端的对于分布式元数据KV存储器的高并发申请。
这个赛题吸引了不少对Rust语言有学习激情,并有志于进步Rust利用实际能力搭档前来进行思维的碰撞。最终有6支队伍在较量通关敞开之前提交了代码,他们中有上班族,也有在校学生。达坦科技组Concurrent Indexing赛题评审委员会依照代码完成度和性能体现两个维度进行综合评判,最终做出如下评审后果。
评比后果
一等奖:无
二等奖:摆摆队
三等奖:Day Day Rust 队
参加奖:除了以上二等奖和三等奖外,所有最终加入Rust China Hackathon 2022 达坦科技组的参赛队伍,共四支,别离为:Plus1s,Xlv,孤单摇滚!,BuckWang。
获奖点评
二等奖,500美金:摆摆队-钟弋辰
获奖队伍简介:
团队成员均为大学在校生:
队长:钟弋辰-东华大学研一
队员:苏金阳-合肥工业大学大学大二;陈靖珏-成都信息工程大学大四;刘涵铭-成都信息工程大学大三;田书繁-成都信息工程大学大四
评委会点评:
综述:摆摆队在较短的工夫内依据论文实现了一个无所跳表构造,尽管性能依然不如开源的 crossbeam-skiplist,然而鉴于无锁数据结构的复杂性和代码较高的完成度,这是一次十分胜利的尝试。
代码完成度 :4分 依据文论实现了一个无锁 skiplist,实现了论文中的根底能力。是本次参赛队伍中惟一胜利实现一个无锁数据结构的选手。
性能体现 :3分 我的项目中也与 crossbeam-skiplist 版本进行比拟, 性能稍稍落后,因而以 crossbeam-skiplist 的版本为准。
代码链接:
https://github.com/ActivePete...
三等奖,300美金:daydayrust-陈歌
获奖队伍简介:
陈歌,硕士毕业于上海交通大学-电子信息与电气工程学院-网络安全技术研究院,现就职于零幺宇宙(上海)科技有限公司,负责区块链优化和分布式数字身份搭建。
评委会点评:
综述:daydayrust 尽管只有 crossbeam 封装版本的代码可能正确运行,然而依然察看到行业内的其余开源解决方案,并且尝试将其移植到该我的项目进行性能比照。尽管移植的局部最终没有齐全实现,然而鉴于工夫的长度对于我的项目移植来说过于缓和,这依然是一次很棒的尝试。
代码完成度 :3.5分 可能运行的代码应用的是 crossbeam-skiplist 的二次封装。代码中有尝试 port 微软的 KV 零碎 faster, 并且实现了binding,该实现在并发写方面实践上更具备劣势,是一次不错的尝试。
性能体现 :3分 能够运行的版本是基于crossbeam-skiplist 为根底,因而以此为准。
代码链接:
https://github.com/cgair/rust...
获奖快问快答
Q:为什么抉择达坦科技Concurrent Indexing这个赛题?参赛前后,你对Concurrent Indexing的意识和理解有什么变动?
钟弋辰 :一是技术上对存储和性能优化比拟感兴趣,并发是一个比拟外围的性能优化问题,之前没用rust写过KV的数据结构,看到这个题目感觉很有意思,是一个很好的锤炼机会。二是对达坦科技这家公司感兴趣,之前在一个rust conf大会理解到这家公司,做软硬件联合的混合云存储,集体对云存储比拟感兴趣。参赛前后就这一赛题整体感觉是对技术实现和利用在思考解法时会更加具体化,比方具体的实现并发的跳表,要做很多细节上的衡量。
陈歌:首先我集体偏向于解决一些明确的问题。次要因为在公司做的是system相干,所以会喜爱解决问题类的题目。
同时达坦的这个题目自身和本人的业余教训比拟match,之前在学校和公司里分布式存储相干的教训会比拟多。最初是心愿通过这个较量晋升本人的业余技术能力。此次参赛,让我对CI 的意识变动,或者说更具体到 Lock-Free Programming 和rust 的 lock-free data structure的了解和意识有加深。对生产中一些轮子的源码、工具等有了更深的意识。最次要的不是代码自身,更多是对常识的学习、了解和利用会更粗浅,这个是对集体有十分大的价值的。
Q:你对于要求实现一个高速并发的Index数据结构,一开始想到哪些设计思路?
钟弋辰 :一开始想到的如果是hash的key ,能够做一个分段分桶锁的操作;但题目给的是只有ord接口,那么能够思考的计划就是实现并发的树结构或者跳表。树结构我理解的b+树中通过crabing lock 部分加锁来进步锁的并发性。最初抉择跳表,因为其构造绝对于b树简略,实现起来更有把握。链表构造更便于实现无锁化的操作,同时范畴查问时间接扫描链表,效率比拟高。
陈歌:目前索引的实现是 Lock + Btree,然而,这会产生一些影响(克制scalability、deadlocks等)。我首先想到的是应用 reader-writer lock,然而在写入频率高的场景下,我心愿找到一种办法,让并发写入不互斥地进行,这就须要 lock-free 的数据结构。
Q:在具体设计和实现的过程中,你碰到最大的难点或挑战是什么?
钟弋辰 :第一是实现并发跳表的insert ,一开始参考的levelDB 跳表没有实现并发的保障,所以要去摸索一下如何做并发。一开始想着部分化锁,这样能够将加锁范畴减小到插入值的地位不影响其余插入地位,通过实际发现性能不太好。起初想到用无锁化操作,参考了比拟多的文章和开源库,通过cas操作来保障插入链表时线程平安,同时在抵触时间接放弃残缺的构建,只保障跳表最底层的插入。
第二是性能优化。仅仅做了无锁后性能还是有欠缺,起初试了下把每个节点的内存动态化,依据其tower高度来决定申请多少内存,缩小了额定内存开销,同时测试性能有了比拟大的晋升。
第三是unsafe编程,回到了手动治理内存的模式,须要认真的思考数据结构的生命周期。
陈歌:在做生成 Microsoft faster C++ 的 binding 时遇到了麻烦。这使得我只能移植一个旧版本,导致后续花了很多的额定工夫,最终的提交的作品不是一个十分欠缺的版本,略有遗憾。
Q:在最终提交的设计上,你做过怎么的衡量?你的设计最大的亮点是什么?
钟弋辰 :衡量可能没有,思考次要都是在过程里,所以最初提交的时候就是成稿了。集体感觉亮点会有几点(也欢送大家给批评倡议或者更多观点):
1、无锁化的并发,绝对于加锁开销更小,防止了线程间切换,陷入内核的状况;
2、利用grow only的数据结构,这样最大限度的缩小了调整时须要同步消耗的工夫;
3、delete,间接通过革除value,不扭转构造,也是尽量减少了调整。
陈歌:所做的衡量有对于Skip List 绝对于 RwLock的利弊。益处是,它容许并发写入在没有互斥的状况下进行。然而,当写入频率较低时,此劣势就没有那么有用了(faster 同理)。所以对这些办法应该持有保留态度,实际中的性能应该依照理论状况做取舍。亮点的话,我感觉如果在把faster cache敌对的hash索引的设计,与纯内存 allocator 联合应用并用pure Rust实现,将会是一个亮点。
Q:参加此次 Rust Chinai Hackathon达坦科技组的流动,你有哪些播种或者感触?
钟弋辰 :技术上的播种:学习坚固了跳表,无锁操作这些常识。另外就是感触到了测试的重要性,很多时候写代码容易陷入局部优化,没有抓到外围性能问题。
整体的感触:Rust 是一门门槛比拟高的语言,比拟对标C++,更加重视安全性和编程整体的规约。在绝对于C++有很多更不便和现代化的个性,但也对编程的门槛也很高,所以心愿rust能够越来越遍及,越来越好用。
陈歌:首先感触到了rust 社区的激情。之前接触到的技术类的流动比拟少,在论坛上看到这个较量,感触到国内对rust语言学习的激情是在向上走,这是个很好的景象。心愿后续会有更多的流动,让更多人投身于rust 建设中。另外个体来讲,心愿能通过这个流动意识更多人,不论是线上还是线下,分享交换等,让rust 有激情的人不孤独。
最终取得优胜奖的两支队伍,将于2023年1月15日(周日) 下午 16:00-17:00 在线上举办一场地面路演。欢送所有的参赛队伍和对Concurrent Indexing感兴趣的搭档,届时参加凝听获奖小组的分享:他们是如何思考拆解赛题的?在着手设计时碰到哪些难点和挑战?以及最终提交的代码设计思路和亮点。
直播预约:
欢迎您预约直播,或者登陆腾讯会议观看直播:
会议号:482-326-186