孙 栋,王 彪,徐 云*
(1.中国科学技术大学 计算机科学与技术学院,合肥 230027;2.安徽省高性能计算重点实验室(中国科学技术大学),合肥 230027)
区块链是一个分布式账本,以区块的形式维护已完成交易,并使用前一个区块哈希来进行链接,记录已完成交易的顺序,系统中的节点通过共识机制保证分布式账本的一致性。近年来,随着区块链数据量和业务请求率的增加,对区块链系统可扩展性的要求越来越高。为此,区块链的性能分析和共识机制得到了广泛的研究,早期的基于Proof of Work共识机制的区块链,如比特币[1]、以太坊[2]等,需要大量的计算资源进行哈希计算,导致区块链系统的交易吞吐量低、出块间隔时间长。由于在共识机制研究[3-5]上的投入,区块链系统的出块间隔时间已经从数分钟减少到秒[6],甚至是毫秒级别。在出块速度得到极大提升的情况下,区块链网络节点间区块传输的延迟逐渐成为区块链可扩展性提升的瓶颈。
在区块链系统中,节点生成一个区块之后,需要将其传输给网络中的其他节点,从而让这个区块得到全网共识。根据Bonneau 等[7]的研究,在节点发现块和所有其他节点接收块之间的任何延迟都会增加临时分叉的可能性,当分叉过多或分叉无法解决时,区块链系统就会变得不稳定,所以降低区块传输延迟是提高区块链系统可扩展性的重要一环。尽管近年来研究者为降低区块传输延迟付出了大量的努力,但是传统的区块传输方案是基于TCP(Transmission Control Protocol)技术来设计的,而TCP 协议栈在接收、发送报文时,内核需要做多次上下文切换,还需要至少三次的数据拷贝并依赖CPU 进行协议封装,使得基于TCP 的区块传输机制在降低延迟上难以取得较好的效果。
与此同时,新兴的先进硬件技术远程直接内存访问(Remote Direct Memory Access,RDMA)[8]为数据密集型应用的高性能数据传输提供了新的机会。RDMA 是一种新的直接内存访问技术,让应用程序可以直接存取远程计算机的内存,无需对方处理器参与,通过零拷贝和内核绕过技术实现了高带宽和低延迟。随着InfiniBand 等新硬件的成本下降以及RoCE(RDMA over Converged Ethernet)技术的成熟,基于RDMA 构建的高性能系统逐渐显现出优势,如FaRM(Fast Remote Memory)[9]、DrTM[10],同时,基于RDMA 的区块链系统通信优化研究已经渐渐展开,如BAASH(Blockchain-As-AService for HPC)[11]。
本文通过RDMA 为区块链系统提供高性能通信,设计并实现了基于RDMA 的低延迟区块传输机制。首先分析了其不同通信原语的特点,并结合区块链的区块传输场景,选择了适合的通信原语;然后基于选择的通信原语的特性,设计了用于区块信息共享的区块目录结构;结合单边原语和区块目录结构,设计并实现了基本的区块传输过程;最后分别在真实环境和模拟环境中对传输机制的性能进行了分析,结果表明本文方案能够有效地降低现有区块传输机制的延迟,提高现有区块链系统的可扩展性。
在区块链网络中,每当节点产生了一个新区块或接收到一个由其他节点产生的新区块,首先需要对这个区块进行验证,再将区块传输给它的邻居节点,通过共识机制完成区块链账本的一致性维护,整个过程中存在大量的数据通信,其中就包含区块传输。现有的区块链系统的通信机制根据其依赖的底层通信技术不同可以分为基于TCP 的通信机制和基于RDMA 的通信机制两类。传统的基于TCP 的通信机制发展时间较长,得到了广泛研究,经过大量的优化性能已经得到了较大提升。近年来,随着在高性能计算机上RDMA 技术的应用与研究的展开,利用RDMA 技术构建高性能区块链系统的研究也逐渐兴起。
Bi 等[12]提出了一种通过选择最近的邻居作为对等体来加速块传播的方案,其中最近的邻居由传输延迟决定,使得总体的区块广播延迟得到降低;Ayinala 等[13]为区块链网络提出了一种名为PiChu 的区块传输方案,该方案通过验证区块报头的一致性,并在P2P(Peer-to-Peer)网络上通过小块增量转发块体,来加速块的传播;Zhao 等[14]提出了用交易哈希来替换整个交易的轻量区块结构用于区块传输,并且通过对交易丢失进行预测,降低用于传输交易信息的额外通信次数,从而到达降低网络传输数据量的目的。上述的研究为降低区块链系统的通信数据量、通信延迟做出了一定的贡献,但仍是基于TCP 方案来设计实现的,受到底层网络协议栈的限制,所以对于通信延迟的优化相对有限。
Huang 等[6]为EOS(Enterprise Operation System)区块链设计了基于RDMA 原语的底层通信过程,用双边原语来实现原有系统的各类消息,并通过预注册内存池等方案实现了低延迟、低CPU 占用的EOS 节点启动过程,使启动过程区块同步用时降低20%。Rüsch 等[15]提出了用于BFT(Byzantine Fault Tolerance)协议的基于RDMA 的通信框架,该框架模拟了多路复用技术,使一个线程可以处理多个连接,使得BFT 协议的通信延迟能够极大降低。Wang 等[16]实现了基于RDMA 的Paxos 协议,利用单边原语使得共识协议的延迟最多为传统共识协议的1/32。以上研究充分说明了RDMA 技术在区块链系统的通信优化上存在的优势,也为进一步的研究提供了良好的基础。
传统的基于TCP 的区块传输方案对区块传输的延迟的优化上限较低,且现有优化方案不具有普适性,在某些情况下甚至会降低通信性能。基于RDMA 技术的区块链系统优化研究目前还处于起步阶段,虽然在降低区块链系统中的区块传输延迟的研究上已经取得了一定的成果,但是现有研究缺乏对区块传输过程与RDMA 原语的针对性分析与设计,未能充分发挥RDMA 原语的在区块传输上的优势。本文分析了区块传输过程的特点,并依据其特点选择了合适的通信原语,充分利用单边原语的特点来进行数据传输机制的设计,能够稳定地提升现有区块链系统的性能。
本文方法的总体框架如图1 所示,传统的区块链框架分为区块链管理层和传输层两个部分,由于现有的区块链传输层的TCP 技术限制了区块传输的性能,本文设计了基于RDMA 技术的传输层来进行替换。每当区块链系统中产生了一个新的区块,就通过传输层的内存管理将区块存储到注册内存中,并将此内存的信息通过RDMA 原语发送给其他邻居节点;邻居节点得到区块的信息,若需要此区块则可以再次通过RDMA 原语从相应的注册内存中远程读取此区块,从而完成区块的传输。
图1 本文方法的总体框架Fig.1 Overall framework of the proposed method
如图2(a)所示,基于TCP 的区块传输方案中,当节点A收到一个新的区块,将此区块传输给节点B 的基本传输过程由三次通信组成:A 得到新的区块,发送一个包含区块的id、hash 的消息给所有邻接点;B 收到消息之后根据id、hash 判断是否需要这个区块,若需要则向A 发送消息获取区块;A 收到消息之后,再将消息中指定的区块发送给B。如图2(b)所示,基于RDMA 的区块传输方案相较于传统的基于TCP 的区块传输方案,将区块传输过程中的三次TCP 通信优化为通过两次RDMA 原语通信即可完成,同时RDMA 原语的单次通信延迟也低于TCP 消息的延迟。所以从理论上分析,基于RDMA 的区块传输方案能够大幅降低区块链系统中区块传输的延迟。
图2 两种区块传输方案的基本过程Fig.2 Basic processes of two block transmission schemes
RDMA 网络传输主要有两类通信原语:send/receive 双边原语和read/write 单边原语,两种原语在通信模式、效率及使用场景上存在一定的差别。两类原语所需要的内存管理方式存在一定差异,其中,send/receive 双边原语采用内存复制方式,read/write 单边原语采用内存注册方式。同时两种内存机制在时间开销上存在一定的差异,采用内存复制方式,在传输过程中数据复制时间开销主要与复制的内存空间大小相关,而在采用内存注册方式时,调用内存注册接口同样会带来一定的时间开销,此时间开销主要与内存注册接口在内核态的效率相关。
为了对比不同数据量下两者的性能,本文对不同数据量下两种内存操作的耗时进行了测试。通过测试分析,随着操作内存空间大小的增加,内存复制操作的耗时增速远超内存注册操作的耗时。进一步说明了内存注册和read/write 原语相对于内存复制和其对应的send/receive 原语更适合于数据量更大的传输过程,同时在区块链系统中,区块普遍为100 KB~ 1 MB 大小,如比特币中区块平均大小为1 MB,所以read/write 方式更适合于区块链系统中的区块传输过程。
此外,这两种通信原语的区别还在于read/write 原语是单边操作,这意味着采用这种方式来进行通信时,当A 节点将区块信息通过write 原语写到B 内存中时,这个操作不需要B 节点参与,而read 原语完成后,A 节点的CPU 就不需要再参与之后的通信过程,之后B 节点可以直接绕过A 节点的CPU完成数据的读取。这样的特性是send/receive 原语所不具备的,而降低区块传输过程中对CPU 的占用同样能够为区块链系统带来性能上的提升。
综合以上两个因素,在基于RDMA 进行区块传输机制设计时,read/write 单边原语相较于send/receive 双边原语具有更大的优势,所以接下来的区块传输过程的设计将围绕read/write 单边原语的特性来展开。
在基于read/write 原语进行区块传输机制的设计时,当A节点新产生一个区块,需要通过RDMA 网卡注册一块内存用于存储这个区块,得到这块内存的地址、空间大小以及钥匙,再将这些信息与区块id、区块hash 一起通过write 原语写到B节点的内存中。write 原语能够成功执行的前提是需要有一块在B 节点上的注册内存,且A 节点需要知道此内存的虚拟地址以及访问钥匙。所以每次需要向B 节点的内存写入信息时,必须先注册内存,B 节点再发送消息通知A 节点这块内存的地址等信息,然后A 节点通过write 原语写入数据,如前所述,内存注册同样存在时间开销,频繁的内存注册会降低整个传输过程的效率。
为此,本文采用了预注册内存的方式,设计了可复用区块目录结构,用于让邻居节点写入最新的区块信息。在区块链系统中,区块在相邻节点之间的传输所需要的时间是远小于区块的产生时间间隔的,且一个区块在产生的一段时间之后就不需要再存储在内存中,所以节点中用于write 原语写入区块信息的注册内存是可以复用的。若节点在开始通信之前预注册N块内存,用于让邻居节点写入新产生区块的信息,并且将内存的信息先发送给邻居节点,同时记录每一块内存的信息是否过期就可以重复利用这N块内存,同时也避免了在每一次通信前注册内存带来的时间消耗,这N块内存即组成了用于在节点间共享区块信息区块目录。预注册的可复用区块目录一方面降低内存注册的时间代价,另一方面内存的复用简化了对注册内存的管理。
如上所述,每个节点需要为邻居节点需要注册N块内存mem1,mem2,…,memN,用于让邻居更新区块的信息。每块内存中存储的信息都有6 个字段,邻居节点可以根据自己产生或接收新区块的情况更新这N块注册内存中存储的信息,字段的内容及意义如表1 所示。
表1 区块目录存储的字段Tab.1 Fields stored in block catalogue
如图3 所示,每个节点需要为所有的邻居预注册N块注册内存,构成用于共享区块信息的区块目录,将N块内存的写入权限开放给邻居节点,邻居节点可以通过write 原语远程更新区块目录,同时每个节点可以根据内存中的区块目录存储的信息查看需要哪些区块,并通过read 原语远程读取区块数据。
图3 区块信息共享Fig.3 Block information sharing
在为邻居节点预注册N块用于存储区块信息的内存后,节点需要将这N块内存的地址等信息发送给邻居节点,邻居节点可以将数据远程写入这N块内存。在之后的通信中,邻居节点在产生新的区块时,可以直接根据这N块注册内存的注册信息通过write 原语将新区块的id、hash、addr、length、key信息写入其中一块注册内存,并标记此区块数据为已被更新的,更新区块目录的具体过程如图4 所示。
图4 基于单边原语的区块目录更新过程Fig.4 Updating process of block catalogue based on one-side primitives
节点在得到其邻居节点更新的区块目录信息后,便可以根据区块目录信息判定是否需要这些区块,若需要区块则可以根据区块目录中的信息通过read 原语到相应的邻居节点的内存中读取区块,从而完成了一个区块从产生到传输到全网所有节点的过程。区块传输的具体过程如图5 所示。
图5 基于单边原语的区块传输过程Fig.5 Block transmission process based on one-side primitives
本章将通过实验分析两种内存操作的性能作为两类RDMA 原语对比的依据,并评估基于RDMA 的区块传输机制对于现有区块链系统的性能的影响,并与现有的区块传输机制进行对比。为此,分别对两种方案在真实环境中测试了点到点的区块传输延迟,在模拟环境中测试了多到多区块传输的延迟以及区块链产生临时分叉的个数。
为了针对区块链系统的区块传输过程选择更适合的RDMA 数据传输方式,需要对send/receive 方式中的内存复制操作和read/write 方式中的内存注册操作在不同数据量下的耗时进行测试,分析得到更适合于大数据量的数据传输方式。为此,本实验分别测试了两种操作在从1 KB 至1 MB 的内存大小的情况下的平均耗时。
实验结果如图6 所示,从图6 的测试结果可以看出,随着操作内存空间的大小的增加,内存复制操作的耗时增加的幅度较大;相反,内存注册操作的耗时,只是随着内存空间大小的增大缓慢增加。该测试结果说明,与两种内存管理方式相应的两种通信原语中,send/receive 原语更适用于小块数据的传输,而read/write 原语更适合大块数据。
图6 不同数据量时的复制与注册操作耗时对比Fig.6 Comparison of time consumed by copy and register operations under different data sizes
真实环境中的实验在两台配置有RDMA 网卡的服务器上进行,两台服务器配置相同,具体配置如表2 所示。
表2 实验环境配置Tab.2 Experimental environment configuration
比特币中的区块传输机制是基于TCP 的区块传输机制的经典实现,因此为了比较基于RDMA 的区块传输机制与基于TCP 的区块传输机制的性能,并分析所提出的区块传输机制对现有区块链系统的影响,实验将对本文所提出区块传输机制与比特币系统中的区块传输过程的性能进行对比。首先模拟了比特币中的区块结构,并生成随机的区块作为实验过程传输的区块数据,用于测试区块传输机制的性能;再复现了比特币系统中的区块传输模块,用于与基于RDMA 的区块传输机制进行对比。两种区块传输机制将对相同的模拟区块进行传输,从而得到两者在性能上的差别。
两台服务器分别视为区块链网络中的A 节点和B 节点,在实验中,A 节点将以一定的时间间隔产生新的区块,在产生新的区块后,分别通过基于RDMA 的区块传输方案和基于TCP 的区块传输方案(比特币的区块传输方案)将区块传输给B 节点,A 节点在发送区块之前记录时间T1,B 节点完成区块接收时记录时间T2,从而得到节点间区块传输的延迟T2-T1。在实验中,将随机生成1 000 个区块,测试1 000 个区块传输的平均延迟,并且通过改变区块大小,分别测试了0.1 MB、0.3 MB、0.5 MB、1 MB 大小的区块的传输延迟。
如表3 所示,基于RDMA 的区块传输方案相较于传统的基于TCP 的方案,在两节点间的区块传输延迟得到了降低,在1 MB 大小的区块上能够使得节点间传输延迟降低44%。这是因为基于RDMA 的区块传输方案中将三次TCP 通信优化为两次RDMA 原语通信,并且单次RDMA 原语通信的延迟也低于TCP 通信,从而大幅降低了在两节点间传输区块的延迟。
表3 节点间的传输延迟对比 单位:μsTab.3 Comparison of transmission latency between nodes unit:μs
为了测试区块传输方案对区块链系统整体的影响,需要测试在区块链网络中区块全网传播的延迟,但是在真实的区块链网络上测试改进是几乎不可能的,因为这需要更新所有网络节点的软件。SimBlock[17]是一个开源的区块链网络模拟器,能模拟比特币、以太坊等区块链系统的参数,如区块链网络大小、区块生成间隔和网络通信状况,研究人员可以通过修改SimBlock 系统来模拟得到研究方案对于区块链系统产生的影响。
在实验中,通过SimBlock 模拟了5 000 个节点的区块链网络,依据真实环境下节点间传输实验中得到的两种方案在不同区块大小的情况下的延迟,作为SimBlock 系统中两个节点间区块传输延迟参数,再分别在SimBlock 系统中模拟生成1 000 个区块,记录这1 000 个区块从产生到传输到全网所有节点所需要的时间,从而比较两种方案的全网络区块传输延迟。
如表4 所示,在SimBlock 模拟环境中,基于RDMA 的区块传输方案相较于基于TCP 的方案,在1 MB 大小的区块上,能够将全网络传输延迟降低24.4%,这个结果相较于点到点传输实验的结果有所下降,这是因为区块在全网传输的过程中,延迟不仅包括网络传输过程,还有节点对区块的验证时间,而区块验证时间并没有因为区块传输机制而改变。
表4 模拟环境下全网络传输延迟对比 单位:μsTab.4 Comparison of transmission latency among whole network in simulated environment unit:μs
在此实验中,同样通过区块点到点传输实验可以得到RDMA 和TCP 方案点到点之间1 MB 大小的区块传输的延迟,设定SimBlock 模拟系统中节点之间进行区块传输的传输延迟,在2 000、5 000、10 000 个节点三种不同网络规模下分别生成2 000 个区块。SimBlock 模拟系统能够模拟区块生成和区块在网络中所有节点之间传输的过程,并且会输出每一个区块的信息,包括区块的高度、区块生成时间、区块被传输到每个节点上的时间以及区块是否在主链上等,从输出的区块信息中可以统计出不在主链上的区块数,从而得到此次模拟实验过程中RDMA 和TCP 方案中区块链发生临时分叉的个数。
如表5 所示,在SimBlock 模拟环境中,基于RDMA 的区块传输方案,在10 000 节点规模的区块链上,使得系统产生临时分叉的数量下降了22.6%。这是因为本文所提方案降低了区块传输的延迟,而区块传输延迟降低能够使得区块链系统中的区块在产生后能够快速得到全网其他节点同步,尽量降低各节点之间区块链状态的不一致性,从而达到降低临时分叉数量的效果。
表5 模拟环境下临时分叉数量对比Tab.5 Comparison of temporary fork numbers in simulated environment
总而言之,本文所提基于RDMA 技术区块传输机制能够在一定程度上降低现有的区块链系统的区块传输延迟,从而提高系统的可扩展性。
高性能区块传输是实现具有高可扩展性的区块链系统的重要部分。本文设计了一种基于RDMA 技术的区块传输机制,能够降低现有系统的区块传输延迟,实现高性能区块链系统。基于RDMA 提供的原语,本文设计了区块链中区块传输过程的两次单边操作,以实线低延迟、低负载的特性;并结合原语的特性,设计了预注册的可复用区块目录结构,进一步降低了内存注册的时间消耗。相较于传统的基于TCP的区块传输机制,本文所提方案能够使得区块全网同步的延迟降低24.4%,同时RDMA 单边原语的引入也降低了传输过程CPU 资源的占用。本文主要的目的是设计高效的区块传输机制,而忽视了区块链系统中其他数据的传输的低延迟需求。下一步的工作是在当前工作的基础上,进一步完成对区块链系统的通信模块的整体设计,实现低延迟的共识过程。