近数据计算

上周看了一些「近数据计算」相关的东西,其实感觉和现在关注的东西不远不近,看的时候也有些收获,这里简单总结记录一下。

近数据计算

近数据计算是指在当前数据所在的位置或附近执行计算,即将计算移动到数据侧,而不是将数据移动到计算侧。常见的近数据计算技术是指在存储器上做数据处理,按照近数据计算的设计理念,其实发现现代数据库中也有类似的设计,后文将分别对存储器相关的近数据计算技术和数据库相关的“近数据计算技术”进行说明。

那么近数据计算缘何而来?实际上是当前放缓的摩尔定律,存储器性能的提升速度远远落后于处理器的性能提升速度,在存储单元和计算单元之间移动数据需要消耗很高的成本,业界称为 “存储墙(memery wall)” 问题。

近数据解决的问题,就是处理流程中在数据从存储器传输到处理器产生的时间消耗。当然,对于存储硬件来说,解决存储器和处理器性能差距的相关技术有:

  • 高速带宽数据通信技术,旨在增加存储器和处理器间数据传输的带宽以减少传输延迟,常见的技术有光互联技术技术和 2.5D/3D 堆叠技术;
  • 近数据存储技术,旨在拉近数据传输的距离,常见的有增加存储级数及高密度偏上存储;
  • 近数据计算技术,包括了 DRAM 上的逻辑层和存储层的堆叠(借助 2.5D/3D 堆叠技术)、存算融合的存储器。

存储器近数据计算

传统的近数据计算技术,实际上是由内存处理技术(PIM,Processing in memory)发展而来。随着 3D 堆叠技术的发展以及新型非易失性存储器件的日益成熟,加上大数据时代应用的催化,计算型存储及存算一体逐渐受到了工业界和学术界的关注。

计算型存储类似于近数据存储,近数据存储是指将处理器与存储器的距离尽量做短,计算型存储则是在处理器周围封装一些可以进行计算的逻辑单元,即基于堆叠技术将逻辑层和存储层堆叠在一起,使用逻辑层实现存储层中数据的计算。在存储墙问题出现的时候,其实使用构建逻辑器件的工艺和构建存储器件的工艺不相兼容,无法实现将两种器件结合在一起。但随着现代工艺的发展,尤其是 3D 堆叠技术的发展,有研究者考虑将逻辑层和存储层堆叠起来实现计算型存储。计算型存储目前主要基于 DRAM 构建实现,将数据计算移动到主存附近。目前常见的做法是将存储的数据通过灵敏放大器读出,在输出端加上与或等单元,从而实现计算。由于将逻辑层和存储层封装在一起,实际上是减小了数据访问延迟和功耗,虽然没有让处理器参与计算,但是真正的计算操作还是在逻辑层实现,这样也就意味着还是有数据移动,并未完全消除访存延迟和功耗。

存算一体指真正的存储和计算的融合,即在存储器颗粒本身进行计算的嵌入,在存储颗粒内实现计算。在这种方式下,数据不需要单独的运算部件来完成计算,而是在存储单元中完成存储和计算。常见的做法是利用非易失性存储的特性,其可以通过外加操作电压有“条件地”在输出(操作后的电阻)和输入(操作前的电阻)之间建立逻辑函数关系,从而直接实现计算。

存算一体的架构,可以直接消除数据访存产生的延迟和功耗,同时由于计算完全耦合于存储,因此可以开发更细粒度的并行性,获得更高的性能和能效。

在数据库中进行的近数据计算

使用 FPGA 加速 SSD 可以归为计算型存储,通过修改 SSD 的控制器,结合 FPGA,可以将一些频繁的处理推送到 SSD 的控制器,从而实现在读取数据的时候直接做一些计算,这也是数据库常用的一种异构计算加速方法。

现有的使用 FPGA 加速数据架构可以分为 “bump-in-the-wire” 架构和混合架构。“bump-in-the-wire” 的方法是将 FPGA 放置在存储和主存的数据路径上充当一个 Filter,这样设计的好处是数据零拷贝,但是要求加速的运算操作是流式处理的一部分。由于早期 FPGA 板载内存资源不足,这种方法比较流行。后一种设计方案则是将 FPGA 作为一个协处理器,FPGA 通过 PCIe 和主存连接,数据通过 DMA 的方式进行传输。

一些实现包括百度通过将一些数据库算子(如选择,排序)写在 FPAG 中,在数据库查询的时候,可以先在 FPGA 计算适配的算子,再将数据向 CPU 移动;阿里巴巴的 X-Engine 异构计算存储引擎,使用 FPGA 作为协处理器,帮助加速存储引擎 LSM-Tree 压缩过程。

现代数据库中的设计

其实看了近数据计算对应的问题、解决方法和设计思路,可以很容易类比到分布式的场景。其实分布式存储和计算也面临数据(网络)传输速度慢的问题,也存在一些数据端发送的数据到计算端其实很大一部分是没有意义的,但却又是因为这些部分而白白占用了带宽。一些分布式数据的处理方法类似与近数据计算的设计方法。

比如开源的 TiDB ,TiDB SQL Engine 计算节点虽然会执行一部分的计划,但是查询优化器会尽量将可以在 TiKV(存储节点)执行的算子下推到存储节点,这样可以在数据侧完成一部分计算,然后将数据返回到计算节点继续进行计算。

华为的 GaussDB 数据库,在接收用户请求之后,CN 节点作为 SQL Engine 对 SQL 进行解析,然后分发到各个 DN 执行。由于数据全部存储在 DN 节点上,所以相当于将计算全部推到数据侧进行,CN 只是起到一个计算生成、调度和结果返回的作用。

蚂蚁金服的 OceanBase 数据库,每个节点都有 SQL Engine 和 Storage Engine,当上层的 SQL 请求到达数据库的时候,OBProxy 会对 SQL 进行 schema 的解析(如果配置了 OBProxy),然后将 SQL 请求推送到最适合处理的节点。此时处理的节点将对 SQL 解析生成执行计划,然后将执行计划中各个算子推送到数据所在的节点进行计算,尽量先在数据本地节点过滤数据以减少网络。

当然,类似的还有边缘计算的概念,边缘计算作为云计算技术的一种补充,在大数据时代发挥着重要的作用。云计算可以理解为资源高度中心化的系统,所有的数据和计算任务都要发送到云计算中心进行计算。边缘计算可以帮助云计算在数据终端侧处理一部分数据甚至提供一定的服务,如果不需要复杂的计算而追求低延迟的应用应该使用边缘网络进行计算,如现代应用中的视频应用,未来的虚拟现实及增强现实技术等应用。这也将降低计算中心的负载,边缘网络的计算节点能够为中心计算节点分担计算任务,同时也可以在数据传输过程中进行处理,减少传输到中心节点的数据量,提高最终到达的数据质量。

总结

近数据计算是一种大胆打破冯·诺依曼架构的解决方法,随着现代存储器制造技术的发展,尤其是 2.5D/3D 堆叠技术的得成熟,非易失性存储技术的发展,在实现上将会有新的突破。同时,近数据计算这种减少数据传输带来的系统性能消耗的方法,其设计理念也可以类比到分布式数据库与边缘计算架构的设计中。

参考