论文部分内容阅读
伴随着“互联网+”时代的飞速发展,国家大数据战略的颁布实施以及人工智能时代的到来,各大互联网公司都意识到数据将成为未来的石油,都开始主动根据人们的衣食住行获取大量数据。新型硬件设备(NVMe SSD、支持RDMA的网卡、3dXpoint等)的广泛使用,它们的性能无论延迟还是带宽都比以前快了几个数量级,这时传统软件层的时间开销就随之凸显了出来。Apache Spark作为目前业界最流行的分布式处理系统,广泛应用在数据分析、交互式数据查询、机器学习等领域。Spark作为在MapReduce基础上发展起来的分布式系统,其Shuffle过程涉及到非常耗时的网络IO和磁盘IO,目前Shuffle性能是决定Spark整体性能的瓶颈之一。目前支持RDMA协议的25Gb以太网已经在国内主要互联网公司大规模部署,探索RDMA技术和Spark的深度融合是一个具有现实意义的研究工作。本文在高性能计算领域常用的Infiniband体系下,进行的工作和创新如下:使用RDMA技术进行网络传输的数据所在的内存空间,必须首先将内存元数据注册到网卡中,由于注册操作需要经过PCIe总线,因此这是一个比较耗时的操作。本文综合参考当前主流内存分配器,在Boost.Pool的基础上设计实现了一个分层RDMA内存池,达到RDMA内存的重复利用,减少每次的注册开销。实验结果表明该内存池能很好适应多线程竞争情况,达到比较高的效率。RDMA为数据传输提供多种模式和操作,它们都有不同优点和缺点,适合不同的应用场景。本文将数据按照一定阈值分为大小数据块,对于小数据块使用RDMA write_with_imm操作直接将数据写到远程一个指定的内存区域,对于大数据块先使用RDMA write_with_imm将写入数据元数据,远程节点再根据这些元数据使用RDMA Read操作将数据传输到远程内存中。这种数据访问机制根据不同规模数据使用不同传输模式,有效兼顾了通用和效率。在前面两个铺垫下,本文设计实现了一个通用的高性能RDMA网络库——baiyun。Baiyun在面向用户的编程模型上参考netty,具有简单易用等特点,在网络事件处理上基于开源项目brpc,使用用户态线程和执行队列等技术方案,实现通用化高性能目标。最后,本文基于baiyun设计实现了Apache Spark的Shuffle机制的优化。主要思想是将Spark Shuffle中的网络模块通过JNI替换为baiyun,通过将操作流水化达到比较高的效率。实验结果显示,优化后的Spark Shuffle性能得到大幅度提升。