关键词:
向量化指令
列式存储
执行引擎
轻量化压缩
性能优化
摘要:
随着互联网的迅速发展,数据量呈现出爆发式增长的趋势,这给数据处理系统的存储和计算带来了巨大的挑战。为了应对这些挑战,列式存储数据处理系统近年来开始在数据分析市场中占主导地位。相较于行式存储,列式存储可以更有效地压缩数据,降低数据的存储空间占用,而且在执行查询时可以只读取相关的列,通过降低读取数据量,从而提高查询执行效率。为了实现实时或者近实时数据处理的需求,当前数据处理系统采用多种优化方式,包括将数据全部存储在内存中和使用向量化优化。列式存储天然适合向量化优化,因为内存中连续存储的是相同类型的数据,利用向量化指令可以并行地处理多个数据,实现更高的吞吐量和更低的响应时延。但是目前的向量化优化方法存在以下三个问题:(1)当前向量化优化方法没有充分利用处理器的计算资源。因为当前向量化实现方式在查询执行过程中标量单元只是用来进行执行流程的控制,基本不参与运算。(2)在非时序数值型数据分析场景中,随着处理器核心数量的增加和向量化指令的变宽,计算不再是扫描算子的性能瓶颈,内存带宽逐渐成为扫描的主要瓶颈,现有的方法是通过压缩数据来缓解内存带宽压力。现有解决方法一类是需要完全解压缩数据,解压缩开销的引入降低了系统的整体性能;另一类不需要完全解压缩数据,但是却没有充分压缩数据,浪费了存储空间和内存带宽。(3)在边云协同的时序数值型数据分析场景中,为了降低数据传输的开销与网络带宽的压力,通常将数据压缩之后再进行传输。但是在云端数据中心分析数据时需要对数据解压缩之后才可以进行分析,而这些分析操作的计算都很轻量化,解压缩的开销比分析操作本身的开销还要高。
为解决以上三个问题,本文结合处理器微体系结构的特点与不同类型数值数据的特征进行列式存储内存数据处理系统的性能优化,主要研究内容和贡献总结如下:
(1)向量化指令和标量指令混合执行框架:传统的利用向量化指令优化数据处理系统的方法关注于使用更多的向量化指令和更加有效地使用向量化指令,但是这种方式忽视了标量单元。为了充分的利用处理器的资源,本文提出了向量化指令和标量指令混合执行的概念。通过向量化指令和标量指令的混合执行可以同时利用到处理器的向量化单元和标量单元,可以实现更高的指令级并行,更加充分的利用处理器的资源,从而实现更高的吞吐和更低的响应时延。为了降低在现有数据处理系统中引入混合执行的开销,通过引入代码生成技术和自动化测试,避免了大量的开发和测试工作。最后,在开源数据集Star Scheme Benchmark(SSB)上通过实验验证了混合执行方法的有效性。
(2)结合非时序数值型数据特征和低精度向量化指令的数据处理优化:目前处理器的核心数量越来越多,向量化指令越来越宽,在扫描操作中内存带宽往往会成为性能瓶颈。现有的解决办法没有在解压缩开销和数据压缩率之间取得很好的权衡。本文设计了 BitsBytes存储格式,将原本的数据切分为不同的字节片段和比特位片段,通过消除非必要比特位的存储,降低内存占用和数据传输开销。将低精度向量化指令和轻量化压缩算法相结合,不仅可以降低从内存中加载数据的数据量,还可以利用数据元素的部分比特位或者部分字节提前完成扫描,进而实现更高的吞吐和更低的时延。本文基于BitsBytes存储结构结合低精度向量化指令实现定制化执行引擎BExecutor,可以在部分解压缩数据的情况上完成数据处理。与未压缩数据相比,BExecutor最高可实现6.5倍的性能提升,与ByteSlice相比,BExecutor最高可实现1.8倍的性能提升。
(3)结合时序数据特征和低精度向量化指令的边云协同数据处理优化边云协同的时序数据处理系统会将数据压缩之后再进行传输,但是在处理数据时需要解压缩数据。在数据处理过程中,操作往往都很轻量化,数据解压缩的开销往往比数据分析本身的开销更高。为了降低数据解压缩的开销,本文结合时序数据的特征提出了一种新型的压缩数据存储结构,称之为ByteZipper。并且,结合低精度向量化指令设计并实现了定制化的面向压缩数据的向量化执行引擎ByteExecutor,可以在不解压缩ByteZipper格式的基础上直接处理数据。实验结果表明,与GDBP(Group Delta Bitpacking)相比,可以实现9.6倍的分析性能提升,与DeltaVector相比,可以在实现相同分析性能的情况下获得更高的压缩率。
综上所述,本文首先结合处理器微架构的特征在数据处理系统中实现了向量化指令和标量指令的混合执行。随后,本文结合非时序和时序数值数据的特点,分别设计了两种不同的压缩存储结构,并且利用低精度向量化指令实现了对应的执行引擎,可以有效提高数据压缩率的同时实现低成本的数据解压缩。通过结合处理器微架构特征和不同的数据特征,本文对列式存储内存数据处理系统的性能进行了优化。