新公布的 RedisGraph 2.0 模块带来很多改进,包括 增强了 Cypher 支持、全文搜索,并启用了图表可视化。同样重要的是,RedisGraph 的最新版本提供了显著的性能改进:延迟提高了至多 6 倍,吞吐量提高了至多 5 倍。我们来看看这些性能提升以及用于展示它们的基准。
当我们在 2018 年 11 月发布 RedisGraph 1.0 时,我们分享了 基准结果,这些结果基于 k 跳邻域计数查询。新的 RedisGraph 2.0 包含了新特性和功能,这些特性和功能支持更全面的测试套件,比如由链接数据基准委员会 (LDBC) 提供的套件(下面会详细介绍)。但是,我们仍然依赖 k 跳基准来将 RedisGraph 2.0 与 v1.2 进行比较。
K-hop 邻域计数查询是一种图本地查询,用于计数一个单一的起始节点 (seed) 在某一深度上连接的节点数,并且仅计数 k-hop 范围内的节点,如下所示:
K-hop 邻域查询在大型图表的分析任务中非常有用,比如查找社交网络中的关系,或者根据共性推荐朋友或广告链接。
我们保留了以前的规模为 22 的基准 Graph 500 数据集,其图特性如下
为了更深入地了解并覆盖数据库性能,我们将基准的种子覆盖范围从 300 扩展到 100,000 个随机确定种子。为了让每个人都能轻松复制我们的结果,这里有一个 指向规模为 22 的持续存储图 500 数据集(RDB 格式)的公共链接。
对于每个受测版本,我们执行了
所有查询均在 22 个客户端的并发并行负载下执行。我们报告了中值 (q50) 和可实现的吞吐量。
为了获得稳态结果,我们放弃了先前的 Python 性能基准客户端,转而支持 memtier_benchmark,后者提供低开销和全延迟频谱延迟指标。
所有基准变化都在 Amazon Web Services 实例上运行,并通过我们的基准测试基础设施配置。基准测试客户端和数据库服务器都在不同的 c5.12xlarge 实例上运行。测试在单分片设置中执行,RedisGraph 版本为 1.2 和 2.0.5。
除了上面描述的主要基准/性能分析场景以外,我们还可以针对网络、内存、CPU 和 I/O 运行基准基准测试,以便了解底层网络和虚拟机特征。我们将基准测试基础设施表示为代码,以便使其稳定且易于复制。
RedisGraph 1.2 与 2.0 基准测试值指向在并行工作负载(多客户端)上的显著改进。我们测量了延迟提高了 6 倍和吞吐量提高了 5 倍,同时执行图遍历。工作负载越并行、越耗费计算资源,与上一版本相比,RedisGraph 2.0 的性能就越好。
RedisGraph 2.0 结合了 SuiteSparse:GraphBLAS 的最新版本 3.2.0 —SuiteSparse是 GraphBLAS的实现 — RedisGraph 使用其来进行稀疏矩阵运算。通过此版本,现在可以使用 OpenMP 反复利用共享内存并行性,以便获得显著的性能优势。
针对 CPU 密集型查询的内部测试表明,RedisGraph 在 SuiteSparse:GraphBLAS 上花费了大约 75% 的总 CPU 时间。为了演示 RedisGraph 中基于 SuiteSparse:GraphBLAS 并行、以 OpenMP 为基础的实现的性能增益,我们测试了 6 跳查询邻居计数,因为它耗费大量的计算资源。
如下所示,使用单线程的 SuiteSparse:GraphBLAS 转化为 q50 延迟为 537 毫秒,而使用 22 个 OpenMP 线程的延迟为 175 毫秒,延迟减少了 6 倍,且 RedisGraph 无需付出额外的代价。在高延迟频谱(例如 q99 等高分位值)中改进更加明显
由于 RedisGraph 2.0 支持更多 Cypher 功能,我们决定开始采用 Link Data Benchmark Council (LDBC) 基准测试。LDBC 为了其标准化图数据管理系统评估的任务聚集了强劲的工业参与。在本节中,我们想对我们所取得的进度进行更新。
LDBC 中的 LDBC 社交网络基准 (SNB) 是 RedisGraph 的一个合乎逻辑的选择,因为它支持涉及大量数据、具有复杂图形依赖关系且要求图形数据库支持复杂且创新的查询模式和算法的复杂读取查询。
在 LDBC SNB 基准中,节点和边分布是由与 Facebook 中发现的类似的度分布函数指导的。此基准考虑了社交网络模拟的一个重要方面,即具有相似兴趣和行为的人倾向于连接(称为 同质性原则)。
SNB 的读取查询与写入工作负载同时执行,该工作负载再现了真实世界的社交网络场景,例如在人与人之间添加友谊或对帖子点赞和评论。
目前,我们从 LDBC SNB 基准查询中支持 100% 的写入查询和 52% 的读取查询,如下表所示
即将受支持的 Cypher 功能:OPTIONAL MATCH(相当于 SQL 中的外连接)、shortestPath(众所周知的 最短路径问题 的一个实现)以及列表和模式理解将使我们能够支持 SNB 的 100% 的复杂读取查询。
与 1.2 版相比,RedisGraph 2.0 带来了显著的性能提升,可将查询速度提升 6 倍。不仅顺序执行性能得到提升,RedisGraph 还能够通过包含最新版本的 SuiteSparse:GraphBLAS 来利用共享内存并行处理,从而实现进一步的性能提升。
在性能提升的同时,我们为提高 Cypher 支持而开展的工作使我们接近支持更全面、社区驱动的 LDBC 基准(我们很高兴成为该基准的一份子并利用它来改进和强化我们的解决方案)。