CN113504874B - 基于负载感知的自适应粒度纠删码编解码加速方法及系统 - Google Patents
基于负载感知的自适应粒度纠删码编解码加速方法及系统 Download PDFInfo
- Publication number
- CN113504874B CN113504874B CN202110703033.2A CN202110703033A CN113504874B CN 113504874 B CN113504874 B CN 113504874B CN 202110703033 A CN202110703033 A CN 202110703033A CN 113504874 B CN113504874 B CN 113504874B
- Authority
- CN
- China
- Prior art keywords
- granularity
- task
- coding
- data
- decoding
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/067—Distributed or networked storage systems, e.g. storage area networks [SAN], network attached storage [NAS]
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/07—Responding to the occurrence of a fault, e.g. fault tolerance
- G06F11/08—Error detection or correction by redundancy in data representation, e.g. by using checking codes
- G06F11/10—Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's
- G06F11/1004—Adding special bits or symbols to the coded information, e.g. parity check, casting out 9's or 11's to protect a block of data words, e.g. CRC or checksum
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5027—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
- G06F9/505—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals considering the load
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computer Security & Cryptography (AREA)
- Quality & Reliability (AREA)
- Human Computer Interaction (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明提出一种基于负载感知的自适应粒度纠删码编解码加速方法及系统。通过针对当前节点的编解码负载判断当前节点的计算压力,根据计算压力,区分当前的优化方向,在面向低负载时,根据最佳切分粒度分布图进行数据切分和计算,在面向高负载时,则根据任务压力进行自适应的粒度聚合。
Description
技术领域
本发明涉及数据存储及纠删码领域,特别涉及一种基于负载感知的自适应粒度的纠删码编解码加速方法和系统。
背景技术
在大数据时代,海量数据的存储正面临通过冗余机制保证可靠性与提高空间利用率降低存储成本的矛盾。目前存储机群大都由商用服务器构成,常态化的组件故障威胁存储系统的可靠性。磁盘阵列、副本和纠删码是用于保证数据可靠性的主流机制。然而,磁盘阵列造价昂贵,性价比低,主要在单机内提供大容量存储服务,扩展单机存储容量,但无法保证分布式系统内节点级的数据可靠性,扩展性差。副本机制简单,高效,是当前最为普遍的数据组织方式,但副本机制以多副本的形式保证数据可靠性,导致存储成本较大,特别是当前激增的海量数据环境。在3副本的情况下,副本占用3倍的磁盘存储开销。然而,纠删码只占用副本机制一半的磁盘存储开销,可以获得较副本机制更高的存储可靠性。在PB-EB级存储系统汇总,纠删码可以节省几十万到几个亿的存储成本。纠删码存储方式,既具有较高的空间利用效率,又能保证数据存储的可靠性,越来越多的应用于存储系统当中,在Google的GFS、Microsoft的Azure以及Facebook的存储系统等商业系统和HDFS、GlusterFS、CEPH等开源存储系统中都有应用。纠删码主要用于对更新性能要求较低的离线应用场景,如廉价的数据中心、多媒体、冷数据存储等。在实时应用、在线数据处理和数据库等场景中,提高编解码性能已成为纠删码的主要需求。
当存储系统采用纠删码机制存储数据时,特别采用高容错比例的纠删码配置时(存储系统容许多个块丢失),纠删码编码和解码性能成为数据读写过程中的主要瓶颈,特别是针对当前的全闪存储系统。针对纠删码编解码性能的优化,可以使得纠删码机制在得到近似副本机制的读写性能的同时,也能达到副本机制一半的存储开销。纠删码编解码性能直接影响文件系统的写入带宽、降级读(降级读:对临时失效数据的读取,在对临时失效数据的读取,需要首先恢复失效数据,然后进行读取)时延和数据恢复性能。纠删码编码发生在数据写入过程中的编码阶段,纠删码解码发生在降级读和恢复过程中的解码阶段。由于恢复过程是一个经过调度的并发流程,解码过程在批量恢复过程中是批量并发进行的,所以本发明重点关注数据写入过程中的编码速度和降级读过程中的解码加速。
纠删码编码通过FEC(forward error correction)方式将原数据分成k个固定大小的块,根据相应的编码理论计算得到m个编码块,那么这(k+m)个块中不多于任意m个块丢失都能恢复得到原始数据。纠删码的主要编码方式分为两类:MDS(Maximum DistanceSeparable)和Non-MDS(Non-Maximum Distance Separable)。
MDS编码是指编码满足Singleton界的纠删码编码。Singleton界断言保证了MDS编码生成的所有编码数据是正交的,即编码数据相互之间没有任何冗余,因此,MDS编码在相同的k和m的配置下达到了理论最好的编码利用率,这也是MDS被称为最大距离可分码的原因。
MDS编码的总体特点是通过一种复杂的规则来生成少量的信息编码。关于MDS的计算的复杂性,以RS编码为例,其编码计算采用Galois域GF(2w)运算规则。在计算机内部,Galois域的运算一般通过离散数学和对数来实现,当需要完成GF(24)域上的计算时,首先通过GF(24)上的本原多项式P(X)=X4+X+1获得GF(24)上的离散对数表,如表1所示:
表1GF(24)上的离散对数表和离散反对数表
Table 1The discrete logarithm and discrete opposition table on GF(24)
表1中离散对数gfilog[i]=2i mod P(2),离散反对数gflog[gfilog[i]]=i。根据离散对数和离散反对数的性质,我们可以获得Galois域上的乘除法计算方法:
A*B=gfilog[gflog[A*B]]=gfilog[gflog[A]+gflog[B]]
A/B=gfilog[gflog[A/B]]=gfilog[gflog[A]-gflog[B]]
因此,我们在GF(24)计算3*7时,计算过程如下:
3*7=gfilog[gflog[3*7]]=gfilog[gflog[3]+gflog[7]]=gfilog[4+10]=gfilog[14]=9
从上面的计算可以看出,有限域上的乘法计算将涉及3次查表(2次对数表和1次反对数表),同理,除法计算也将涉及3次查表。正是由于每次乘除法计算都需要3次查表计算,所以MDS类编码算法的计算效率低下。如果想要优化编码算法的速度,就需要根据CPU的Cache大小来仔细设计Galois域运算离散对数表和离散反对数表的大小。
分布式存储中使用的纠删码的开源实现有以下几种:M.Luby于1997年实现的关于范德蒙RS码和柯西RS码的纠删码库,这个库实现了最原始的范德蒙RS码以及柯西RS码,没有对编码进行优化处理;Python Software Foundation于2007年发布的Zfec,Zfec是在Rizzo开发的容错多播编码库的基础上开发的,而Rizzo的工作则是1997年发布,并被广泛使用和改进的fec,Zfec采用范德蒙矩阵进行有限域的计算,并提供C、Python、以及Haskell三种形式的API接口,其最新的版本是1.4.24;A.Partow于2000年发布的RS码实现Schifra,这是一个开源库,但是缺少文档;Plank等在2007年发布的Jerasure,Jerasure实现了多种纠删码编解码方法,包括范德蒙RS码,柯西RS码,以及RAID-6编码等,并在实现的过程中采用了一些已有的编码优化技术,Jerasure目前已停止维护。2013年,StreamScale公司发布了他们开发的纠删码实现BigParity,但是这个实现是非开源的。Intel在2016年开源了纠删码加速库(Intel Intelligent StorageAcceleration Library,ISAL),目前已经支持纠删码、RAID、CRC校验、压缩、加密等功能的加速,其中纠删码支持范德蒙矩阵和柯西矩阵,是目前持续更新的最快的纠删码加速库。目前用于加速纠删码编码效率的加速主要为IntelISAL库,可以达到2.5GB/s的编码效率(0.8GB/s-2.5GB/s),而单线程的异或运算编码效率(1GB/s-3GB/s)相对比矩阵乘仅提高20%-50%,相对比网络带宽,编码效率仍需要提高。在纠删码文件系统中,编码带宽和时延对数据写入带宽的影响仍然很大。
国内外关于纠删码编解码性能的研究前期主要集中在提高纠删码编码、解码效率,后期主要通过改变编码算法的方式提高纠删码编码效率和解码效率。
在纠删码编码方面,普朗克(Plank)利用处理器(CPU)SIMD指令集加速伽罗瓦域计算,比其他利用软件方式的优化方法提高2.7倍-12倍。然而受限于处理器(CPU)缓存容量,当需编码的数据规模大于处理器(CPU)三级缓存时,则利用处理器(CPU)SIMD指令集进行加速的编码带宽将会下降50%以上。国防科大通过将编码数据切分为最小粒度,然后通过多线程并发执行编码计算的方式提升编码性能,然而这种方法因为过多的任务切换而无法有效利用CPU L3 cache局部性特性进行加速。因此,对数据进行编码计算时,为了提高针对大数据量的编码带宽,应该以适当的大小进行数据编码,减少数据在处理器(CPU)缓存和内存之间的交换次数,提高CPU利用效率,以获得最高的编码性能。
在编码算法方面,将范德蒙矩阵替换为柯西矩阵,降低编码矩阵的求逆复杂度,通过柯西矩阵转换为二元域矩阵的方式,将矩阵乘计算转变为异或运算。在解码算法方面,通过局部编码方式降低恢复过程中数据的读取量和计算量,通过多种编码算法(比如RotatedRS编码、piggy-backed编码、bufferfly编码等)提升数据块在恢复过程中的利用率,降低恢复过程数据读取量。这些方法通过将矩阵乘运算改变为异或运算的方式,降低编码计算的复杂度;通过改变编码方法,降低数据恢复过程中的数据读取量。
国内外关于纠删码编解码性能的研究通过加速编码计算和降低编码计算复杂度、减少数据恢复过程中数据读取量的编码算法提升编解码性能,然而,这些方法并没有充分利用当前多核环境和CPU cache局部性的特征进行纠删码的编码计算,降低编解码计算在数据读写过程中的占比。
纠删码文件系统在数据写入过程中相对比副本机制多了编码过程,编码性能成为影响纠删码文件系统写性能的关键。在当前主流的存储架构中,客户端通过多线程形式提供数据的读写服务,数据的编码计算在数据写线程中完成,数据的解码计算在对临时失效数据的降级读过程中,较低的编解码性能导致较高的读写时延,降低了用户体验。因此,需要提升编解码性能,降低纠删码在数据读写过程中由于编解码计算带来的延迟。
发明内容
本发明提出了一种基于负载感知的自适应粒度的纠删码编解码加速方法,通过优化纠删码的编解码性能,可以降低纠删码编解码计算在数据写入和降级过程中的开销,通过自适应的并发编码框架可以加速纠删码的编解码性能,降低写入和读取时延,提高读写带宽,从而达到可以接受的用户体验,以及满足热数据处理的时效性。在低负载情况下,通过优化达到最低时延,降低编解码计算在读写流程中的开销占比,在高负载情况下,通过优化最大编码带宽,提升数据通量和整体读写带宽。通过降低计算时延、提升编解码带宽可以在保证低冗余开销的前提下,尽可能接近副本机制的性能。
具体来说本申请提供了一种基于负载感知的自适应粒度纠删码编解码加速方法,其中包括:
步骤1、根据该分布式存储系统在初始化阶段进行的基准编码性能测试,构建包含条带大小和最佳切分粒度之间对应关系的映射表;根据该映射表,对待进行纠删码编解码的条带进行编码粒度切分,将得到编解码数据作为任务按顺序追加到任务队列中;
步骤2、检测所有任务队列的负载参数,根据该负载参数判断是否聚合,若聚合则执行步骤3,否则执行步骤4;
步骤3、根据该负载参数确定聚合粒度,并按照缓存结构从任务队列获取编解码数据,对编解码数据以该聚合粒度为聚合目标进行聚合,将聚合得到的结果进行编解码处理,得到该待纠删码编解码的条带的编解码结果;
步骤4、按照缓存结构从任务队列获取编解码数据,并对编解码数据进行编解码处理,得到该待纠删码编解码的条带的编解码结果。
所述的基于负载感知的自适应粒度纠删码编解码加速方法,其中该负载参数包括:平均线程数据量、任务平均粒度、最大任务粒度和最大切分粒度;
步骤3中选定聚合粒度的过程包括:
步骤31、判断平均线程数据量是否大于最大切分粒度,若是,则选该最大切分粒度为聚合粒度,否则执行步骤32;
步骤32、判断平均线程数据量是否大于最大任务粒度,若是,则选该最大任务粒度为聚合粒度,否则执行步骤33;
步骤33、判断平均线程数据量是否大于任务平均粒度,若是,则选该任务平均粒度为聚合粒度,否则执行步骤34;
步骤34、判断任务平均粒度是否大于编解码线程当前处理的任务的粒度,若是,则选该任务平均粒度为聚合粒度,否则选该编解码线程当前处理的任务的粒度为聚合粒度。
所述的基于负载感知的自适应粒度纠删码编解码加速方法,其中该任务队列中的任务根据生成先后顺序按照2级索引进行组织,包括全局任务生成顺序和在不同粒度任务队列中的任务生成顺序。
所述的基于负载感知的自适应粒度纠删码编解码加速方法,其中该步骤3中聚合过程包括:
判断待聚合的编解码数据是否属于相同编解码矩阵,若是,则采用该数据拼接的方式对待聚合的小粒度编解码数据进行聚合,否则采用矩阵重构的方式对待聚合的编解码数据进行聚合。
所述的基于负载感知的自适应粒度纠删码编解码加速方法,其中该步骤3中聚合过程包括:
判断地址不连续的待聚合的编解码数据是否属于相同编解码矩阵,若是,则根据聚合算法确定进行聚合的编码任务,并将其拷贝到同一个地址空间中进行编码计算,否则重新构建编码矩阵,对每个编码矩阵,进行相同数量的编码数据聚合。
本发明还提出了一种基于负载感知的自适应粒度纠删码编解码加速系统,其中包括:
模块1,用于根据对分布式存储系统在初始化阶段进行基准编码性能测试,构建包含条带大小和最佳切分粒度之间对应关系的映射表;根据该映射表,对待进行纠删码编解码的条带进行编码粒度切分,将得到编解码数据作为任务按顺序追加到任务队列中;
模块2,用于检测所有任务队列的负载参数,根据该负载参数判断是否聚合,若聚合则执行模块3,否则执行模块4;
模块3,用于根据该负载参数确定聚合粒度,并按照缓存结构从任务队列获取编解码数据,对编解码数据以该聚合粒度为聚合目标进行聚合,将聚合得到的结果进行编解码处理,得到该待纠删码编解码的条带的编解码结果;
模块4,用于按照缓存结构从任务队列获取编解码数据,并对编解码数据进行编解码处理,得到该待纠删码编解码的条带的编解码结果。
所述的基于负载感知的自适应粒度纠删码编解码加速系统,其中该负载参数包括:平均线程数据量、任务平均粒度、最大任务粒度和最大切分粒度;
模块3包括:
模块31,用于判断平均线程数据量是否大于最大切分粒度,若是,则选该最大切分粒度为聚合粒度,否则执行模块32;
模块32,用于判断平均线程数据量是否大于最大任务粒度,若是,则选该最大任务粒度为聚合粒度,否则执行模块33;
模块33,用于判断平均线程数据量是否大于任务平均粒度,若是,则选该任务平均粒度为聚合粒度,否则执行模块34;
模块34,用于判断任务平均粒度是否大于编解码线程当前处理的任务的粒度,若是,则选该任务平均粒度为聚合粒度,否则选该编解码线程当前处理的任务的粒度为聚合粒度。
所述的基于负载感知的自适应粒度纠删码编解码加速系统,其中该任务队列中的任务根据生成先后顺序按照2级索引进行组织,包括全局任务生成顺序和在不同粒度任务队列中的任务生成顺序。
所述的基于负载感知的自适应粒度纠删码编解码加速系统,其中该模块3中聚合过程包括:
判断待聚合的编解码数据是否属于相同编解码矩阵,若是,则采用该数据拼接的方式对待聚合的小粒度编解码数据进行聚合,否则采用矩阵重构的方式对待聚合的编解码数据进行聚合。
所述的基于负载感知的自适应粒度纠删码编解码加速系统,其中该模块3包括:
判断地址不连续的待聚合的编解码数据是否属于相同编解码矩阵,若是,则根据聚合算法确定进行聚合的编码任务,并将其拷贝到同一个地址空间中进行编码计算,否则重新构建编码矩阵,对每个编码矩阵,进行相同数量的编码数据聚合。
由以上方案可知,本发明的优点在于:
1、将读写线程中单线程模式下的编解码任务通过多线程并发的模式提高编解码计算带宽,降低编解码时延;
2、本发明能够根据计算压力自适应的判断负载情况;
3、通过任务负载评估,面向低负载,可以获得较低的时延,面向高负载,可以获得更高的带宽;
4、本发明能够最大化的挖掘系统本身的计算能力,避免额外部署ASIC、FPGA、GPU等加速部件导致的成本。
附图说明
图1为纠删码存储系统架构图;
图2为基于负载感知的纠删码编解码加速架构;
图3为基于负载感知的聚合粒度决策流程;
图4为不同大小的编码条带对应的最大切分粒度
具体实施方式
编解码优化面向纠删码的编码和解码过程进行加速,需要一种负载感知的自适应编码粒度的加速机制。通过对编解码性能的评估可以得出结论:
1)单线程编解码计算无法获得最大编码性能;
2)编码条带在不同切分粒度下的并发不同,在最佳切分粒度下,并发编码才能获得峰值性能;
3)不同大小的编码数据对应的最佳切分粒度不同;
4)数据量大的编码数据比数据量小的编码数据在最佳切分粒度上能获得更高的编码带宽。
在实际存储环境中,存储系统中编解码计算操作并非一直是密集执行的,即存储系统中编解码计算是低负载和高负载都存在的情况。在低负载的情况下,编解码计算是离散的、数据量少的,这时候应该重点优化编解码计算时延,降低编解码计算在数据读写过程中的占比;在高负载情况下,编解码计算是密集的,有大量线程等待CPU资源执行编解码计算,这时候应该重点优化全局编解码性能,保证整体的计算性能最优。面向时延进行优化的低负载情况,根据最佳切分粒度进行编解码,可以获得最低的编码时延;面向全局性能优化的高负载情况,则根据结论4,在处理高负载情况下的编解码计算时,应避免小粒度计算,因为小粒度无法根据局部性特征通过L3 cache进行预取优化,使得数据搬运开销在计算过程中占比较大,为此,为了全局最大化编解码带宽,根据负载情况,将小粒度编解码数据通过矩阵拼接和数据拼接两种方式进行聚合,降低编解码过程中的数据搬运开销。
因此,本发明提出了一种负载感知的自适应粒度切分的编解码加速框架。通过针对当前节点的编解码负载判断当前节点的计算压力(图3所示为编解码负载的判断和粒度决策算法),根据计算压力,区分当前的优化方向,在面向低负载时,根据最佳切分粒度分布图进行数据切分和计算,在面向高负载时,则根据任务压力进行自适应的粒度聚合。包括以下关键技术点:
关键点1,基于负载感知的自适应粒度切分机制,通过最大化性能的最佳粒度切分机制将编码数据进行切分,根据任务队列中的负载进行相对应的数据聚合,达到最大化的编解码计算性能。
关键点2,使用2级任务队列组织编码任务,根据任务队列参数评估任务负载,并进行聚合提交编码计算。
关键点3,基于数据拼接和矩阵拼接的方式,分别完成同样编码矩阵的小粒度编码数据的聚合操作(数据拼接)和不同编码矩阵的小粒度编码数据的聚合操作(编码时的编码块数量增加,编码粒度不变),达到编码性能的提升。
本发明提出的负载感知的自适应粒度切分的编解码加速框架。通过当前节点的编解码负载判断计算压力,根据计算压力,将编解码计算分为低负载计算和高负载计算。在面向低负载时,根据如图4所示的最佳切分粒度分布图进行数据切分和计算,在面向高负载时,则根据任务压力进行自适应的粒度聚合,达到全局最大编码性能。
为让本发明的上述特征和效果能阐述的更明确易懂,下文特举实施例,并配合说明书附图作详细说明如下。
不同大小的数据的编码性能在不同切分粒度下的并发性能不同。当前的编码计算一般在数据写入线程中完成,实现简单,但无法发挥出当前多路多核CPU的并发性能。本发明针对不同大小的写入数据测试了不同切分粒度下的并发编码测试,不同条带大小的各种编码组合在不同切分粒度下的编码性能峰值不同,随着切分粒度越来越小,编码性能先上升,然后降低,这是因为,随着切分粒度越来越小,导致任务由于数据搬运开销(CPU L3cache预取机制在小粒度编码任务中无法发挥预读功能,导致从内存到CPU的数据搬运开销增大)、线程切换、信号量机制和任务排队等原因编码性能逐渐降低。
面向不同的编码数据,编码性能峰值对应的切分粒度不同。本节针对大小在4KB-1GB范围内的17种不同大小的条带进行了详细测试(针对容忍4个块失效的条带进行测试),如图4所示,随着条带大小的增加,切分粒度以及对应的任务线程数量呈阶梯型逐渐增加。在计算节点资源足够空闲的时刻,针对不同大小的编码条带,采用图4所示的最佳切分粒度可以达到最大的编码性能。
多个不同大小的数据条带进行编码时,需要一种更加灵活的粒度切分机制。从图4中可以看出,不同大小的数据条带在不同的粒度切分下达到最大的编码性能。数据量大的条带在经过CPU编码计算的过程中,中间有CPU L3级cache的预读功能,并且从内存读取到cache再到CPU运算单元过程中的搬运开销和计算开销可以进行并行流水,而对于较小的数据量,则没有这些更好的优化,且大数量下的编码数据,更适宜于Intel ISAL库的SIMD指令优化。在实际的编码环境中,由于数据写入是多线程模式,各线程写入的数据量的大小也是不同的。为了达到整体编码性能最大化的目标,不能完全按照图4的粒度进行并发计算,而应该基于全局编码性能最大化目标进行切分或者聚合,在已存在大数据量编码任务的队列中,应该将编码数据的切分朝向大数据量任务靠近,达到整体编码性能最大化。
面向低延迟、高带宽的编码要求,需要根据任务队列和计算时间判断编码方式的最优化处理模式。为了达到全局最大化编码性能,系统需要构建基于多线程的统一任务加速框架,在低负载情况下,以最低时延为计算需求,通过最佳切分粒度进行任务的并发执行,保证最大计算时延,降低计算任务在数据写入过程中的占比,在高负载情况下,以全局最大计算带宽为计算需求,通过聚合部分小粒度计算任务,利用L3 Cache的预取功能完成数据搬运的掩盖,减少线程切换开销,提升编解码性能。在高负载情况下,主要参与决策的参数有最大切分粒度(图4中最大切分粒度max_split_size为2MB,表示按照2MB进行数据切分时,可以获得最大编码性能)、平均线程计算数据量(任务队列中的每个线程平均需要完成的计算量)、最大任务大小(当前任务队列中的最大切分任务)和平均任务大小(所有计算任务的平均大小)四个参数。
纠删码解码过程发生在纠删码降级读和整盘恢复过程中。纠删码解码计算发生在数据恢复过程中,包括数据读取过程中由于临时失效导致的降级读,和由于磁盘失效和节点失效导致的整盘数据恢复。降级读和整盘恢复都是数据恢复过程,区别在于,降级读的目的在于通过数据恢复暂时恢复出要读取的数据,仅发生在数据读取的某个条带内,降级读需要数据的恢复过程能够在尽可能低的时间内完成,保证读取过程的低时延,而整盘恢复则是批量的数据恢复,需要一种更合理的调度方法使得各节点的恢复任务批量化且均衡的正常进行,达到全局最大化,在整盘恢复的调度过程中,通过调度机制使得某一重建节点执行最大数量的解码计算,不需要针对整盘恢复进行特殊的解码加速优化。因此,解码计算的加速优化仅需要处理降级读,需要更低的编码计算时间保证数据读取的低时延。
基于负载感知的自适应粒度切分的编解码加速框架,通过自适应粒度切分机制保证当前编码数据在低负载情况下,能够获得当前数据量下的最高编码带宽和最低编码时间;通过2级FIFO索引结构分别组织计算任务和不同粒度的计算任务,根据FIFO索引结构可以判断当前的任务负载并进行相应的处理,通过相同粒度的FIFO任务队列可以进行同等计算粒度的数据拼接和编码矩阵重组;通过基于负载感知的自适应粒度聚合机制,编解码线程动态的判断当前任务的负载情况,根据FIFO索引结构参数及时判断任务负载,做出数据编解码粒度的调整,获得最大的编解码性能。
纠删码编解码加速框架包括数据切分模块、任务队列结构和编码计算模块三部分,如图2所示为编解码计算加速框架。数据切分模块根据系统初始化过程中的基准测试数据,得到如图4所示的不同数据的最佳切分粒度,根据编码数据的大小进行切分,然后将切分后的任务按照顺序追加到不同粒度的任务队列中。在任务队列结构中,所有任务根据生成先后顺序按照2级索引进行组织,包括全局任务生成顺序和在不同粒度任务队列中的任务生成顺序。任务生成顺序使得加速框架在处理任务时按照FIFO结构进行处理,防止任务饥饿,而在不同粒度任务队列中的任务,则可以更方便的进行数据重组。任务队列维护计算任务的添加和删除,形成平均线程数据量、任务平均粒度、最大任务粒度、最大切分粒度四个参数判断是否进行聚合。编解码计算单元包含执行编解码任务的线程池和编码任务聚合决策算法,编码线程从任务队列中按照FIFO结构获取编码任务,任务聚合决策算法根据任务队列结构中的参数动态判断任务执行的粒度,对编码数据进行聚合后进行数据的编解码计算。
数据切分机制
数据在进行编解码时通过数据切分模块切分成多个同样大小的计算任务由线程池进行并行计算。数据切分模块根据具体的节点配置由单元测试完成切分粒度的评估和最高性能参数选择,形成如图4所示的切分粒度对照关系。切分粒度对照关系作为数据切分模块切分数据的依据,可以在低负载情况下,达到最高的计算带宽和最低的计算时延。在高负载情况下,由于小粒度计算任务无法基于局部性特征优化数据从内存到CPU的搬运开销,需要基于负载的聚合机制完成小粒度数据的聚合,提升整体计算带宽。
编解码任务聚合机制
面向编解码计算任务高负载的场景,需要负载感知的编解码任务聚合机制完成小粒度计算数据的聚合,通过数据局部性原理和计算与数据搬运流水线机制掩盖数据从内存到CPU的搬运开销,提升整体编码带宽。小粒度的计算任务缺乏数据局部性特性,无法有效利用计算资源,批量小粒度数据的计算带宽与数量无关,而计算消耗时间计算量成线性增长关系。批量小粒度数据的编解码优化无法通过多线程和数据量的优势进行大幅度的优化提升,根据结论4,可以得知,通过将小粒度数据聚合成大粒度数据,提升编解码计算粒度,通过CPU L3 cache的预取机制掩盖部分数据的搬运开销,提升计算带宽,降低计算消耗时间。
编解码任务拼接机制
密集数据写入场景下,存在大量的写入数据等待编码。在数据聚合过程中,存在多种类型的编码任务:1)逻辑地址连续(编码条带中对应位置的每个块都是地址连续的),编码矩阵相同的编码数据;2)逻辑地址连续,编码矩阵不同的编码数据;3)逻辑地址不连续,编码矩阵相同的编码数据;4)逻辑地址不连续,编码矩阵不同的编码数据。
编码任务通过矩阵重构和数据拼接两种方式实现。当进行聚合的计算任务所对应的编码矩阵不同时(对应解码计算),则通过构造编码矩阵的方式进行聚合编码计算,如图2所示。当进行聚合的编码数据对应的编码矩阵相同时(编码过程采用相同的编码矩阵),则采用数据拼接的方式。
地址连续的编码任务:针对每个任务中对应位置的块的地址是连续的情况,这种情况下的任务通常是来自同一编码数据的切分后的任务,其对应的编码矩阵也是相同的。针对编码矩阵不同的情况,按照地址不连续处理。针对地址连续的编码任务,不需要进行数据的拷贝,只需要在编码线程中,改变编码数据大小即可。
地址不连续的编码任务:针对地址不连续的编码任务,分为两种状况:1)编码矩阵相同;2)编码矩阵不同。针对编码矩阵相同的情况,则只需要根据聚合算法确定进行聚合的编码任务数量,将这些任务重新拷贝到同一个地址空间中,然后进行编码计算。如果编码库能够支持多个数据片段的计算时,则不需要显示的数据拷贝。对于编码矩阵不同的情况,则需要进行重新构建编码矩阵,如图2中右下角最上边的虚线框所示,将多个编码矩阵以对角矩阵的形式进行组织。这种情况下,本文为了避免过大的编码矩阵,仅对2个编码矩阵进行重构,然后,针对这2个编码矩阵的每个编码矩阵,进行相同数量的编码数据聚合。即对于第一种编码矩阵和第二种编码矩阵,每个编码矩阵对相同数量的编码任务进行聚合,保证聚合后的数据块是同样的大小。
编解码聚合机制
max_split_size=获取最大编码性能的切分粒度 (1)
avg_thread_size=任务数据总量/编码线程数量 (2)
max_task_size=当前任务队列中最大的计算任务的粒度 (3)
avg_task_size=任务数据总量/任务数量 (4)
cur_task_size=编码线程当前处理的任务的粒度大小 (5)
为了加速纠删码的编解码性能,我们针对不同的编码机制提出了一种自适应的编解码加速框架。在加速框架中,针对编码和解码的处理是一样的,只需要在数据处理过程中传入不同的编码、解码矩阵即可。在纠删码的编解码机制中,需要处理2种编码方式:矩阵乘运算和异或运算,这两种运算根据不同的参数进行选择。根据不同场景,所需要的运算也不同。在客户端仅需要矩阵乘运算,在存储服务器端需要提供三种编码方式,针对RS编码,需要提供矩阵乘运算;针对LRC编码,需要提供矩阵乘运算(多失效和全局编码块恢复)和异或运算(局部编码块恢复);针对CRS编码,则只需要实现异或运算。从图4中可以看出,不同大小的编码数据在不同的分片粒度上达到的峰值编码性能。因此,针对不同的编码机制、不同的编码数据量,在不同的任务量下进行自适应的编码计算加速。
基于负载感知的编解码任务聚合机制基于任务队列中的任务相关情况进行决策。如图3示的聚合处理流程图所示,当任务队列堆积大量编解码任务等待计算时,我们可以根据队列结构中的任务数量和总的计算数据量得到动态的参数值,如公式(1-5),分别为当前各线程平均需要处理的数据量avg_thread_size,当前队列结构中平均的任务大小avg_task_size,当前任务队列中粒度最大的任务大小max_task_size,以及当前节点中能够获得最大计算带宽的粒度大小max_split_size。其聚合步骤如下:
1、当各线程平均需要处理的数据量大于最大计算带宽的粒度大小时,编码线程在进行数据计算时,按照max_split_size为聚合目标,合并等待计算的任务,然后进行计算;否则,执行步骤2;
2、如果各线程平均需要处理的数据量大于当前队列中最大的任务粒度,编码线程按照max_task_size为聚合目标,合并计算任务,否则,执行步骤3;
3、如果如果各线程平均需要处理的数据量大于平均任务大小,则按照avg_task_size为聚合目标进行聚合后计算,否则,执行步骤4;
4、如果平均任务大小大于当前计算粒度,则按照avg_task_size为聚合目标进行计算,否则,按照当前粒度直接进行计算。
以下为与上述方法实施例对应的系统实施例,本实施方式可与上述实施方式互相配合实施。上述实施方式中提到的相关技术细节在本实施方式中依然有效,为了减少重复,这里不再赘述。相应地,本实施方式中提到的相关技术细节也可应用在上述实施方式中。
本发明还提出了一种基于负载感知的自适应粒度纠删码编解码加速系统,其中包括:
模块1,用于根据对分布式存储系统在初始化阶段进行基准编码性能测试,构建包含条带大小和最佳切分粒度之间对应关系的映射表;根据该映射表,对待进行纠删码编解码的条带进行编码粒度切分,将得到编解码数据作为任务按顺序追加到任务队列中;
模块2,用于检测所有任务队列的负载参数,根据该负载参数判断是否聚合,若聚合则执行模块3,否则执行模块4;
模块3,用于根据该负载参数确定聚合粒度,并按照缓存结构从任务队列获取编解码数据,对编解码数据以该聚合粒度为聚合目标进行聚合,将聚合得到的结果进行编解码处理,得到该待纠删码编解码的条带的编解码结果;
模块4,用于按照缓存结构从任务队列获取编解码数据,并对编解码数据进行编解码处理,得到该待纠删码编解码的条带的编解码结果。
所述的基于负载感知的自适应粒度纠删码编解码加速系统,其中该负载参数包括:平均线程数据量、任务平均粒度、最大任务粒度和最大切分粒度;
模块3包括:
模块31,用于判断平均线程数据量是否大于最大切分粒度,若是,则选该最大切分粒度为聚合粒度,否则执行模块32;
模块32,用于判断平均线程数据量是否大于最大任务粒度,若是,则选该最大任务粒度为聚合粒度,否则执行模块33;
模块33,用于判断平均线程数据量是否大于任务平均粒度,若是,则选该任务平均粒度为聚合粒度,否则执行模块34;
模块34,用于判断任务平均粒度是否大于编解码线程当前处理的任务的粒度,若是,则选该任务平均粒度为聚合粒度,否则选该编解码线程当前处理的任务的粒度为聚合粒度。
所述的基于负载感知的自适应粒度纠删码编解码加速系统,其中该任务队列中的任务根据生成先后顺序按照2级索引进行组织,包括全局任务生成顺序和在不同粒度任务队列中的任务生成顺序。
所述的基于负载感知的自适应粒度纠删码编解码加速系统,其中该模块3中聚合过程包括:
判断待聚合的编解码数据是否属于相同编解码矩阵,若是,则采用该数据拼接的方式对待聚合的小粒度编解码数据进行聚合,否则采用矩阵重构的方式对待聚合的编解码数据进行聚合。
所述的基于负载感知的自适应粒度纠删码编解码加速系统,其中该模块3包括:
判断地址不连续的待聚合的编解码数据是否属于相同编解码矩阵,若是,则根据聚合算法确定进行聚合的编码任务,并将其拷贝到同一个地址空间中进行编码计算,否则重新构建编码矩阵,对每个编码矩阵,进行相同数量的编码数据聚合。
Claims (8)
1.一种基于负载感知的自适应粒度纠删码编解码加速方法,其特征在于,包括:
步骤1、根据分布式存储系统在初始化阶段进行的基准编码性能测试,构建包含条带大小和最佳切分粒度之间对应关系的映射表;根据该映射表,对待进行纠删码编解码的条带进行编码粒度切分,将得到编解码数据作为任务按顺序追加到任务队列中;
步骤2、检测所有任务队列的负载参数,根据该负载参数判断是否聚合,若聚合则执行步骤3,否则执行步骤4;
步骤3、根据该负载参数确定聚合粒度,并按照缓存结构从任务队列获取编解码数据,对编解码数据以该聚合粒度为聚合目标进行聚合,将聚合得到的结果进行编解码处理,得到该待纠删码编解码的条带的编解码结果;
步骤4、按照缓存结构从任务队列获取编解码数据,并对编解码数据进行编解码处理,得到该待纠删码编解码的条带的编解码结果;
该负载参数包括:平均线程数据量、任务平均粒度、最大任务粒度和最大切分粒度;
步骤3中选定聚合粒度的过程包括:
步骤31、判断平均线程数据量是否大于最大切分粒度,若是,则选该最大切分粒度为聚合粒度,否则执行步骤32;
步骤32、判断平均线程数据量是否大于最大任务粒度,若是,则选该最大任务粒度为聚合粒度,否则执行步骤33;
步骤33、判断平均线程数据量是否大于任务平均粒度,若是,则选该任务平均粒度为聚合粒度,否则执行步骤34;
步骤34、判断任务平均粒度是否大于编解码线程当前处理的任务的粒度,若是,则选该任务平均粒度为聚合粒度,否则选该编解码线程当前处理的任务的粒度为聚合粒度。
2.如权利要求1所述的基于负载感知的自适应粒度纠删码编解码加速方法,其特征在于,该任务队列中的任务根据生成先后顺序按照2级索引进行组织,包括全局任务生成顺序和在不同粒度任务队列中的任务生成顺序。
3.如权利要求1所述的基于负载感知的自适应粒度纠删码编解码加速方法,其特征在于,该步骤3中聚合过程包括:
判断待聚合的编解码数据是否属于相同编解码矩阵,若是,则采用数据拼接的方式对待聚合的编解码数据进行聚合,否则采用矩阵重构的方式对待聚合的编解码数据进行聚合。
4.如权利要求1所述的基于负载感知的自适应粒度纠删码编解码加速方法,其特征在于,该步骤3中聚合过程包括:
判断地址不连续的待聚合的编解码数据是否属于相同编解码矩阵,若是,则根据聚合算法确定进行聚合的编码任务,并将其拷贝到同一个地址空间中进行编码计算,否则重新构建编码矩阵,对每个编码矩阵,进行相同数量的编码数据聚合。
5.一种基于负载感知的自适应粒度纠删码编解码加速系统,其特征在于,包括:
模块1,用于根据分布式存储系统在初始化阶段进行的基准编码性能测试,构建包含条带大小和最佳切分粒度之间对应关系的映射表;根据该映射表,对待进行纠删码编解码的条带进行编码粒度切分,将得到编解码数据作为任务按顺序追加到任务队列中;
模块2,用于检测所有任务队列的负载参数,根据该负载参数判断是否聚合,若聚合则执行模块3,否则执行模块4;
模块3,用于根据该负载参数确定聚合粒度,并按照缓存结构从任务队列获取编解码数据,对编解码数据以该聚合粒度为聚合目标进行聚合,将聚合得到的结果进行编解码处理,得到该待纠删码编解码的条带的编解码结果;
模块4,用于按照缓存结构从任务队列获取编解码数据,并对编解码数据进行编解码处理,得到该待纠删码编解码的条带的编解码结果;
该负载参数包括:平均线程数据量、任务平均粒度、最大任务粒度和最大切分粒度;
模块3包括:
模块31,用于判断平均线程数据量是否大于最大切分粒度,若是,则选该最大切分粒度为聚合粒度,否则执行模块32;
模块32,用于判断平均线程数据量是否大于最大任务粒度,若是,则选该最大任务粒度为聚合粒度,否则执行模块33;
模块33,用于判断平均线程数据量是否大于任务平均粒度,若是,则选该任务平均粒度为聚合粒度,否则执行模块34;
模块34,用于判断任务平均粒度是否大于编解码线程当前处理的任务的粒度,若是,则选该任务平均粒度为聚合粒度,否则选该编解码线程当前处理的任务的粒度为聚合粒度。
6.如权利要求5所述的基于负载感知的自适应粒度纠删码编解码加速系统,其特征在于,该任务队列中的任务根据生成先后顺序按照2级索引进行组织,包括全局任务生成顺序和在不同粒度任务队列中的任务生成顺序。
7.如权利要求5所述的基于负载感知的自适应粒度纠删码编解码加速系统,其特征在于,该模块3中聚合过程包括:
判断待聚合的编解码数据是否属于相同编解码矩阵,若是,则采用数据拼接的方式对待聚合的编解码数据进行聚合,否则采用矩阵重构的方式对待聚合的编解码数据进行聚合。
8.如权利要求5所述的基于负载感知的自适应粒度纠删码编解码加速系统,其特征在于,该模块3包括:
判断地址不连续的待聚合的编解码数据是否属于相同编解码矩阵,若是,则根据聚合算法确定进行聚合的编码任务,并将其拷贝到同一个地址空间中进行编码计算,否则重新构建编码矩阵,对每个编码矩阵,进行相同数量的编码数据聚合。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110703033.2A CN113504874B (zh) | 2021-06-24 | 2021-06-24 | 基于负载感知的自适应粒度纠删码编解码加速方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110703033.2A CN113504874B (zh) | 2021-06-24 | 2021-06-24 | 基于负载感知的自适应粒度纠删码编解码加速方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN113504874A CN113504874A (zh) | 2021-10-15 |
CN113504874B true CN113504874B (zh) | 2023-08-29 |
Family
ID=78010415
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110703033.2A Active CN113504874B (zh) | 2021-06-24 | 2021-06-24 | 基于负载感知的自适应粒度纠删码编解码加速方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113504874B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820333B (zh) * | 2023-06-12 | 2024-02-23 | 青海师范大学 | 一种基于多线程的ssdraid-5持续写入方法 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2010033644A1 (en) * | 2008-09-16 | 2010-03-25 | File System Labs Llc | Matrix-based error correction and erasure code methods and apparatus and applications thereof |
CN105824720A (zh) * | 2016-03-10 | 2016-08-03 | 中国人民解放军国防科学技术大学 | 一种面向数据连续读取的重删纠删混合系统的数据放置方法器 |
CN110212923A (zh) * | 2019-05-08 | 2019-09-06 | 西安交通大学 | 一种基于模拟退火的分布式纠删码存储系统数据修复方法 |
CN111625395A (zh) * | 2020-06-03 | 2020-09-04 | 中国人民武装警察部队警官学院 | 一种并行的纠删码编解码方法及系统 |
WO2021098665A1 (zh) * | 2019-11-18 | 2021-05-27 | 北京中电兴发科技有限公司 | 一种纠删码计算方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10044374B2 (en) * | 2015-07-30 | 2018-08-07 | Quantum Corporation | Adaptive erasure codes |
-
2021
- 2021-06-24 CN CN202110703033.2A patent/CN113504874B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2010033644A1 (en) * | 2008-09-16 | 2010-03-25 | File System Labs Llc | Matrix-based error correction and erasure code methods and apparatus and applications thereof |
CN105824720A (zh) * | 2016-03-10 | 2016-08-03 | 中国人民解放军国防科学技术大学 | 一种面向数据连续读取的重删纠删混合系统的数据放置方法器 |
CN110212923A (zh) * | 2019-05-08 | 2019-09-06 | 西安交通大学 | 一种基于模拟退火的分布式纠删码存储系统数据修复方法 |
WO2021098665A1 (zh) * | 2019-11-18 | 2021-05-27 | 北京中电兴发科技有限公司 | 一种纠删码计算方法 |
CN111625395A (zh) * | 2020-06-03 | 2020-09-04 | 中国人民武装警察部队警官学院 | 一种并行的纠删码编解码方法及系统 |
Non-Patent Citations (1)
Title |
---|
《面向存储网络的融合I/O模拟器设计与实现》;魏征; 黎斐南; 邢晶; 霍志刚; 孙凝晖;《高技术通讯》;第30卷(第10期);983-997 * |
Also Published As
Publication number | Publication date |
---|---|
CN113504874A (zh) | 2021-10-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10014881B2 (en) | Multiple erasure codes for distributed storage | |
US9916478B2 (en) | Data protection enhancement using free space | |
CN110442535B (zh) | 提高分布式固态盘键值缓存系统可靠性的方法及系统 | |
US20160179621A1 (en) | Prioritizing Data Reconstruction in Distributed Storage Systems | |
US10387307B2 (en) | Lock-free raid implementation in multi-queue architecture | |
CN110262922A (zh) | 基于副本数据日志的纠删码更新方法及系统 | |
CN110427156B (zh) | 一种基于分片的mbr的并行读方法 | |
WO2019001521A1 (zh) | 数据存储方法、存储设备、客户端及系统 | |
KR20160140381A (ko) | 가변 레이트 텍스처 압축을 수행하는 방법 및 압축기 | |
WO2023151290A1 (zh) | 一种数据编码方法、装置、设备及介质 | |
CN113504874B (zh) | 基于负载感知的自适应粒度纠删码编解码加速方法及系统 | |
WO2017177953A1 (zh) | 在存储服务器中为应用设置数据处理路径的方法及装置 | |
Qiu et al. | Ec-fusion: An efficient hybrid erasure coding framework to improve both application and recovery performance in cloud storage systems | |
CN112199054A (zh) | 一种文件存储的方法及系统 | |
US20230137007A1 (en) | Data storage method, storage system, storage device, and storage medium | |
Zhu et al. | Improved read performance in a cost-effective, fault-tolerant parallel virtual file system (ceft-pvfs) | |
CN115793957A (zh) | 写数据的方法、装置及计算机存储介质 | |
US11953991B2 (en) | Method, device and computer program product for storage management | |
Zhang et al. | NADE: nodes performance awareness and accurate distance evaluation for degraded read in heterogeneous distributed erasure code-based storage | |
CN113504875A (zh) | 一种基于多级调度的纠删码系统恢复方法及系统 | |
CN115981559A (zh) | 分布式数据存储方法、装置、电子设备和可读介质 | |
Li et al. | Exploiting decoding computational locality to improve the I/O performance of an XOR-coded storage cluster under concurrent failures | |
Cao et al. | Ec-scheduler: A load-balanced scheduler to accelerate the straggler recovery for erasure coded storage systems | |
CN111625395A (zh) | 一种并行的纠删码编解码方法及系统 | |
CN110647585A (zh) | 一种起到自动筛选和备份功能的数据部署系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |