OpenMLDB 实时引擎性能测试报告

news2025/4/16 13:49:01

OpenMLDB 提供了一个线上线下一致性的特征平台。其中,为了支持低延迟高并发的在线实时特征计算,OpenMLDB 设计实现了一个高性能的实时 SQL 引擎。本报告覆盖了 OpenMLDB 实时 SQL 引擎的性能测试,包含了在较为复杂的负载、典型配置下的各种性能指标。

了解更多关于 OpenMLDB

**官网:**https://openmldb.ai/

**GitHub:**https://github.com/4paradigm/OpenMLDB/

实时特征计算平台架构方法论和基于 OpenMLDB 的实践

实验环境

本次测试一共使用四台服务器进行,其中 OpenMLDB 服务部署在三台服务器,客户端部署在一台服务器,四台服务器使用的硬件配置一致,实验环境如下表格 Table-1 所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rjEIUSGZ-1671010026101)(null)]
Table-1:实验环境配置

测试负载

测试工具和脚本

本测试所使用的测试工具以及使用说明,可以在我们的 GitHub benchmark 页面下载,对本测试进行复现。

file

https://github.com/4paradigm/OpenMLDB/tree/main/benchmark

测试方法

本次测试主要用于展示 OpenMLDB 在不同工作负载和运行环境下的性能表现,因此使用基于参数变化的方法进行测试,来理解不同的参数对于性能的影响:

首先定义一组我们需要研究展示的参数变量,这部分参数可以分为三类:

系统参数:线程数目,是否打开预聚合优化

查询参数:窗口数目,LAST JOIN 个数

数据参数:窗口内数据条数,被索引列的基数(即 cardinality,列数据去重后的唯一值数目)

对于所有参数,确定一组典型情况下的默认参数值,其默认参数值配置详见 Table-2 。其中,预聚合优化一般针对窗口内数据量巨大(比如几百万条的情况)打开优化才有意义,所以其默认配置为关闭。

确定好默认参数以后,对于每一个实验参数,进行一定合理范围内的取值变化,同时保持其他参数默认不变,观察在不同参数下的性能数字和趋势表现,其参数的变化取值范围如 Table-3 。

file

Table-2:实验参数以及默认值

file

Table-3:实验参数取值变化范围

数据集

本次测试基于多个数据表进行,其默认参数下的基准表格建立语句如下。对于某些和表格参数有关的 SQL,部分语句会按照一定的模式进行调整(比如窗口数目,LAST JOIN 数目的变化),在每一个实验下面给出了详细的建表和查询 SQL。

基准表格建立 SQL

CREATE TABLE mt (
col_s0 string,col_s1 string,col_s2 string,col_s3 string,col_s4 string,col_s5 string,col_s6 string,col_s7 string,col_s8 string,col_s9 string,col_s10 string,col_s11 string,col_s12 string,col_s13 string,col_s14 string,col_d0 double,col_d1 double,col_d2 double,col_d3 double,col_d4 double,col_t0 timestamp,col_t1 timestamp,col_t2 timestamp,col_t3 timestamp,col_t4 timestamp,col_i0 bigint,col_i1 bigint,col_i2 bigint,col_i3 bigint,col_i4 bigint,index(key = col_s0, ttl=0m, ttl_type=absolute, ts = col_t0),index(key = col_s1, ttl=0m, ttl_type=absolute, ts = col_t0),) OPTIONS (REPLICANUM = 1);
 
CREATE TABLE lt0 (
col_s0 string,col_s1 string,col_s2 string,col_s3 string,col_s4 string,col_s5 string,col_s6 string,col_s7 string,col_s8 string,col_s9 string,col_s10 string,col_s11 string,col_s12 string,col_s13 string,col_s14 string,col_d0 double,col_d1 double,col_d2 double,col_d3 double,col_d4 double,col_t0 timestamp,col_t1 timestamp,col_t2 timestamp,col_t3 timestamp,col_t4 timestamp,col_i0 bigint,col_i1 bigint,col_i2 bigint,col_i3 bigint,col_i4 bigint,index(key = col_s0, ttl=0m, ttl_type=absolute, ts = col_t0),) OPTIONS (REPLICANUM = 1);

 
CREATE TABLE lt1 (
col_s0 string,col_s1 string,col_s2 string,col_s3 string,col_s4 string,col_s5 string,col_s6 string,col_s7 string,col_s8 string,col_s9 string,col_s10 string,col_s11 string,col_s12 string,col_s13 string,col_s14 string,col_d0 double,col_d1 double,col_d2 double,col_d3 double,col_d4 double,col_t0 timestamp,col_t1 timestamp,col_t2 timestamp,col_t3 timestamp,col_t4 timestamp,col_i0 bigint,col_i1 bigint,col_i2 bigint,col_i3 bigint,col_i4 bigint,index(key = col_s0, ttl=0m, ttl_type=absolute, ts = col_t0),) OPTIONS (REPLICANUM = 1);`

其中,数据表内的 String 类型长度为 10 bytes,其余字段为随机生成的数据。

测试 SQL

我们使用一个较为复杂的实际场景中可能使用到的 SQL 进行测试。由于我们的部分实验参数会针对不同的 SQL 负载进行调整(窗口数目,LAST JOIN 表的个数),所以具体 SQL 会有一定的变化。下面的 SQL 表示了在默认参数下的基准查询语句(除了预聚合实验)。对于不同的窗口数目以及 LAST JOIN 数目,相应的 WINDOW 相关,以及 LAST JOIN 相关的语句会相应变化。具体每个实验的 SQL 脚本,可以参照每个实验结果下附上的脚本文件。

默认参数下的基准负载 SQL:

SELECT * FROM
(SELECT
col_s0,
concat(col_s1, col_d0) as concat_col_s1,
upper(col_s2) as upper_col_s2,
substr(col_s3, 3) as substr_col_s3,
year(col_t0) as year_col_t0,
string(col_i2) as str_col_i2,
add(col_i1, col_i3) as add_i1_i3,
distinct_count(col_s1) OVER w0 AS distinct_count_w0_col_s1,
sum(col_i1) OVER w0 AS sum_w0_col_i1,
count(col_s11) OVER w0 AS count_w0_col_s11,
avg(col_i4) OVER w0 AS avg_w0_col_i4,
case when !isnull(at(col_s5, 0)) OVER w0 then count(col_s5) OVER w0 else null end AS case_when_count_w0_col_s5,
case when !isnull(at(col_i3, 0)) OVER w0 then count(col_i3) OVER w0 else null end AS case_when_count_w0_col_i3,
distinct_count(col_s1) OVER w1 AS distinct_count_w1_col_s1,
sum(col_i1) OVER w1 AS sum_w1_col_i1,
count(col_s11) OVER w1 AS count_w1_col_s11,
avg(col_i4) OVER w1 AS avg_w1_col_i4,
case when !isnull(at(col_s5, 0)) OVER w1 then count(col_s5) OVER w1 else null end AS case_when_count_w1_col_s5,
case when !isnull(at(col_i3, 0)) OVER w1 then count(col_i3) OVER w1 else null end AS case_when_count_w1_col_i3,
 from mt
WINDOW w0 as ( partition by col_s0 order by col_t0 rows_range between 30d PRECEDING AND CURRENT ROW MAXSIZE 1000),
w1 as ( partition by col_s1 order by col_t0 rows_range between 30d PRECEDING AND CURRENT ROW MAXSIZE 1000)
) as out0 LAST JOIN
(SELECT
lt0.col_s0 as out1_col_s0,
concat(lt0.col_s1, mt.col_d0) as out1_concat_col_s1,
upper(mt.col_s2) as out1_upper_col_s2,
substr(lt0.col_s3, 3) as out1_substr_col_s3,
year(mt.col_t0) as out1_year_col_t0,
string(lt0.col_i2) as out1_str_col_i2,
add(lt0.col_i1, mt.col_i3) as out1_add_i1_i3
from mt LAST JOIN lt0 order by lt0.col_t0 ON mt.col_s0 = lt0.col_s0
) as out1 ON out0.col_s0 = out1.out1_col_s0 LAST JOIN
(SELECT
lt1.col_s0 as out2_col_s0,
concat(lt1.col_s1, mt.col_d0) as out2_concat_col_s1,
upper(mt.col_s2) as out2_upper_col_s2,
substr(lt1.col_s3, 3) as out2_substr_col_s3,
year(mt.col_t0) as out2_year_col_t0,
string(lt1.col_i2) as out2_str_col_i2,
add(lt1.col_i1, mt.col_i3) as out2_add_i1_i3
from mt LAST JOIN lt1 order by lt1.col_t0 ON mt.col_s0 = lt1.col_s0
) as out2 ON out0.col_s0 = out2.out2_col_s0;

注意,由于目前部分聚合函数(如 distinct_count)在 OpenMLDB v0.5.0 还不支持预聚合优化,因此预聚合优化技术的实验的 SQL 是单独生成的,详见相关实验章节。我们在预聚合完善以后将会更新本份报告。

测试指标

在本次测试中,我们主要使用两种性能指标

延迟(latency):使用业界常用的 top percentile 定义(详见解释 Latency metrics | Cloud Spanner | Google Cloud),图上标记为 TPXX,即 XXth percentile latency

吞吐(throughput):使用 QPS ,即 queries per second,代表了每秒处理的请求数量

测试结果

「系统参数」

线程数变化

Figure-1 显示了在固定其他默认参数,线程数目变化的情况下,延迟和吞吐的性能表现。可以看到,随着线程的增加,请求延迟都呈现上升的趋势。而明显的上升拐点是当线程数为 20 时,增加线程数目会显著增加请求的延迟。总体来说,延迟均保持在个位数毫秒级别。对于吞吐,增加线程数目可以显著提升吞吐表现,在该较为复杂的场景下可以达到万级别的吞吐。

file
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AuPPJx9P-1671010028922)(null)]

Figure-1: 在线程数目变化的情况下,延迟(上图)和吞吐(下图)的性能表现

数据和查询脚本

该实验使用了基准的表格数据和查询 SQL 脚本(参见章节 “2.2. 数据集” 和 “2.3. 测试 SQL”)。

预聚合优化

预聚合实验配置

如之前所提到,由于预聚合还不能支持所有的聚合函数,因此针对预聚合的测试,我们单独设计了一套查询 SQL 进行测试,相关脚本附上。

/* Create table */
CREATE TABLE mt (
col_s0 string,col_s1 string,col_s2 string,col_s3 string,col_s4 string,col_s5 string,col_s6 string,col_s7 string,col_s8 string,col_s9 string,col_s10 string,col_s11 string,col_s12 string,col_s13 string,col_s14 string,col_d0 double,col_d1 double,col_d2 double,col_d3 double,col_d4 double,col_t0 timestamp,col_t1 timestamp,col_t2 timestamp,col_t3 timestamp,col_t4 timestamp,col_i0 bigint,col_i1 bigint,col_i2 bigint,col_i3 bigint,col_i4 bigint,index(key = col_s0, ttl=0m, ttl_type=absolute, ts = col_t0),) OPTIONS (REPLICANUM = 1);

/* Deploy SQL */
DEPLOY demo_long OPTIONS(long_windows="w0:1000")

/* Query */
SELECT
col_s0,count(col_s11) OVER w0 AS count_w0_col_s11,
FROM mt
WINDOW w0 as (partition by col_s0 order by col_t0 rows_range between 30d PRECEDING AND CURRENT ROW);

其相关的参数设置和变化参数显示在 Table-4 中:

file

Table-4:预聚合优化实验的参数设置

预聚合实验结果

结果如下图 Figure-2 所示,开启预聚合优化时,其延迟显著低于不开启预聚合的情况,随着窗口内数据条数增多,这样的差距随之变大,整体来说,预聚合技术在长窗口的情形下,对于延迟达到了两个数量级左右的性能提升。注意,由于两者性能差距巨大,以下图片纵坐标均使用了对数坐标。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wT6aw0mW-1671010027348)(null)]

file

file

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lri8mJSB-1671010029711)(null)]

file

Figure-2: 在窗口内数据条数变化的情况下,延迟性能表现

下图 Figure-3 显示了当在不同的窗口大小下,是否使用预聚合的吞吐性能表现:当窗口内数据行数变多,两种情况的吞吐性能都呈现下降趋势,但是开启预集合技术的吞吐量远远高于不使用的情况,而且当窗口变大时,这样的差距更加明显,超过 200 倍。注意,由于两者性能差距巨大,以下图片纵坐标使用了对数坐标。

file

Figure-3: 在窗口内数据条数变化的情况下,吞吐性能表现

「查询参数」

窗口数变化

Figure-4 显示了不同窗口数量的情况下,延迟和吞吐的性能表现。随着窗口的数目的上升,请求延迟呈现明显的上升趋势,其中,当 top percentile 值为 TP999 时,与其他情形差距更大,但是也都保持在个位数的毫秒级别。对于吞吐,窗口数量增多,吞吐缓慢减少,并呈现不断下降的趋势。

file

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UhzilKYH-1671010031803)(null)]

Figure-4: 在窗口数目变化的情况下,延迟(上图)和吞吐(下图)的性能表现

数据和查询脚本

窗口数不同时,脚本有相应变化,具体代码请参照:

http://openmldb.ai/download/benchmark/num_win_1.sql

http://openmldb.ai/download/benchmark/num_win_2.sql

http://openmldb.ai/download/benchmark/num_win_5.sql

http://openmldb.ai/download/benchmark/num_win_10.sql

LAST JOIN 个数变化

Figure-5 显示了在 LAST JOIN 数目变化时,延迟和吞吐的表现。随着 LAST JOIN 表数量的增加,不同 TP 指标下,延迟都呈现平缓的上升趋势,其中 TP999 与其他指标下的数字有非常明显的差距,但是都在5毫秒以内。而随着 LAST JOIN 表数量的增加,吞吐性能稍有下降,但是整体维持在6千以上。

file

file

Figure-5: 在LAST JOIN表数目变化的情况下,延迟(上图)和吞吐(下图)的性能表现

数据和查询脚本

LAST JOIN 个数不同时,脚本有相应变化,具体代码请参照:

http://openmldb.ai/download/benchmark/num_lastjoin_0.sql

http://openmldb.ai/download/benchmark/num_lastjoin_1.sql

http://openmldb.ai/download/benchmark/num_lastjoin_2.sql

http://openmldb.ai/download/benchmark/num_lastjoin_3.sql

「数据参数」

窗口内数据条数变化

Figure-6 显示了在窗口内数据条数变化时,延迟和吞吐的表现。随着窗口内数据条数的增多,延迟都呈现非常明显的上升趋势,但是基本都在 10 毫秒以内。增加窗口内数据条数时,吞吐性能会有较为显著的下降。

file

file

Figure-6: 在窗口内数据条数变化的情况下,延迟(上图)和吞吐(下图)的性能表现

数据和查询脚本

该实验使用了基准的表格数据和查询 SQL 脚本(参见章节 “2.2. 数据集” 和 “2.3. 测试 SQL”)。

索引列基数变化

Figure-7 显示了在索引列的基数变化时,延迟和吞吐的表现。随着基数增加,每一种 top percentile 参数下,耗时无明显变化,但是 TP999 的延迟明显较高。同时,吞吐没有明显的变化,QPS 值基本维持在7000以上。

file

file

Figure-7: 在索引列基数变化的情况下,延迟(上图)和吞吐(下图)的性能表现

数据和查询脚本

该实验使用了基准的表格数据和查询 SQL 脚本(参见章节 “2.2. 数据集” 和 “2.3. 测试 SQL”)。

联系我们

如果你对上述实验报告内容有任何问题,欢迎在社区渠道和我们取得联系。

GitHub Issues

https://github.com/4paradigm/OpenMLDB/issues

对于严肃的使用者和开发者,关于程序使用过程中遇到的任何问题或者特性诉求,欢迎来我们的项目需求搜基地给我们提出反馈和意见。我们会对每一个反馈的 issue 给出 feedback,并且在项目规划的时候会有效考虑社区需求。

微信使用交流群

关于 OpenMLDB 的任何使用问题,扫码进群

file

Roadmap

https://github.com/4paradigm/OpenMLDB/projects/10

我们在此汇集了开发历程,对于规划中的 Roadmap,你可以在相关 issues 下参与讨论:

如果你有意愿参与其中已经规划的开发计划,请留言和我们互动,确认以后请认领相关 issue,成为 owner

如果你有特别希望在下一个版本中加入的产品特性,也可以留言和我们进行讨论,确认以后我们将正式加入到 roadmap

Slack

https://openmldb.slack.com/join/shared_invite/zt-ozu3llie-Khn9Ss1GZcFW2K_L5sMg#/shared-invite/email

你也可以在 Slack 上我和我们进行实时交流,有关任何的使用或者开发问题。

Email

有关任何问题,也可以通过 Email 和我们联系:contact@openmldb.ai

开发者邮件列表

https://groups.google.com/u/3/g/openmldb-developers

我们维护了一个针对开发者的邮件列表,有关开发的重要事项将会在群里通知讨论。如果你有意愿参与 OpenMLDB 的开发,你可以加入我们的 OpenMLDB-Developers Google Group ,通过验证以后即可以通过邮件列表方式和我们的社区开发者互动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/88759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多线程知识笔记(四)-----volatile、wait方法、notify方法

文章目录1、volatile关键字2、volatile和synchronized对比3、wait和notify方法1、volatile关键字 先看例子: class Counter {public int flag 0; }public class Test4{public static void main(String[] args) {Counter counter new Counter();Thread t1 new Th…

如何使用Footrace 钱包监控功能和设置自定义的交易警报

2022-06-12 本文将介绍如何使用 Footrace 监控 CEX 的钱包地址并设置自定义警报。 什么是 Footrace? Footrace (Foot Trace) 是一个多链的钱包追踪监控平台,可以监控CEX、DEX、鲸鱼、聪明钱、或任何你想关注的地址的钱包。 Footrace 帮助投资者保护他…

有了这几个软件安全测试工具,编写安全测试报告再也不愁

软件的安全是开发人员、测试人员、企业以及用户共同关心的话题,尤其是软件产品的使用者,因为系统中承载着用户的个人信息、人际互动、管理权限等各类隐私海量关键数据。软件安全测试工作不仅是为了用户,更牵扯到许多的利益共同体。因此软件安…

2854-40-2,环二肽cyclo(Pro-Val)

Component of coffee flavor 咖啡香精成分 在烘焙咖啡中检测到Cyclo(Pro-Val)和其他含pro的二酮哌嗪类化合物。这些化合物的含量随着烘焙强度的增加而增加,它们增加了苦味。这种味道苦涩的环二肽也在可可、巧克力、牛肉和奶酪等其他食品中被检测到。Cyclo(Pro-Val)显…

Linux物理内存管理——会议室管理员如何分配会议室

之前学习了站在内存的角度去看内存,看到的都是虚拟内存,这些虚拟内存总是要映射到物理页面的,这一篇文章来学习物理内存是如何管理的。 物理内存的组织方式 之前学习虚拟内存的时候,当涉及物理内存的映射的时候,总是…

不会还有人不知道如何搭建【关键字驱动自动化测试框架】吧 ?

前言 这篇文章我们将了解关键字驱动测试又是如何驱动自动化测试完成整个测试过程的。关键字驱动框架是一种功能自动化测试框架,它也被称为表格驱动测试或者基于动作字的测试。关键字驱动的框架的基本工作是将测试用例分成四个不同的部分。首先是测试步骤&#xff0…

MobileNet网络模型(V1,V2,V3)

MobileNet网络中的亮点:DW卷积,增加了两个超参数,控制卷积层卷积核个数的α,控制输入图像大小的β,这两个超参数是我们人为设定的,并不是学习到的。BN batch normal批规范化,为了加快训练收敛速…

大数据MapReduce学习案例:数据去重

文章目录一,案例分析(一)数据去重介绍(二)案例需求二,案例实施(一)准备数据文件(1)启动hadoop服务(2)在虚拟机上创建文本文件&#xf…

大数据MapReduce学习案例:TopN

文章目录一,案例分析(一)TopN分析法介绍(二)案例需求二,案例实施(一)准备数据文件(1)启动hadoop服务(2)在虚拟机上创建文本文件&#…

linux把乱码文件(非文件内容)删除(Xshell中使用rz命令上传文件出现乱码,删除乱码文件)的步骤讲解

我的场景是:首先安装lrzsz:yum install lrzsz,然后后使用rz -be上传文件出现乱码问题,想要把乱码文件删除 圆圈圈出来的就是乱码文件,横线划线出来的是使用rm命令删除但是无效 解决方法是:ls | grep -v ‘…

人人都是数据分析师

一.耳熟能详的数据你真的了解吗? 1.数据的类型 根据数据的存储形式,可以将数据分为结构化数据和非结构化数据两种类型 存储在数据库中的结构化数据能够很方便地进行检索、分析以及展示分析结果。结构化数据是进 行数据分析的基本类型,大多数…

【1697. 检查边长度限制的路径是否存在】

来源:力扣(LeetCode) 描述: 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] [ui, vi, disi] 表示点 ui 和点 vi 之间有一条长度为 disi 的边。请注意,两个点之间可能有 超过一条边 。 给…

(附源码)springboot建达集团公司平台 毕业设计 141538

springboot建达集团公司平台 摘 要 随着互联网大趋势的到来,社会的方方面面,各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去,而其中最好的方式就是建立网络管理系统,并对其进行信息管理。由于现在网络的发…

DAMOYOLO:基于DAMOYOLO训练数据集详细教程

前段时间yolov7的推出引起一篇热潮,接着rmyolo紧跟潮流,后面阿里的达摩院也推出了自己的yolo算法,怎么说呢,damoyolo推出依旧不少天了,现在才写博客,因为damoyolo给我的体验感不是很好。 先看下DAMOYOLO的…

安科瑞模拟信号隔离器BM-DIS/I 经2000V隔离输出DC4-20mA 二线制

安科瑞 王晶淼/刘芳 1.信号隔离器功能 BM系列模拟信号隔离器可以对电流、电压等电量参数或温度、电阻等非电量参数进行高速精确测量,经隔离转换成标准的模拟信号输出。既可直接与指针表、数显表相接,也可以与自控仪表(如PLC)、各…

nginx负载均衡实战练习

1、简介 nginx是一个web服务器,反向代理服务器、开源并且高性能,社区里面有很多工程师在维护这个项目。可以在官网(Index of /download/)下载组件。而且nginx可以用来做流量转发,也是是负载均衡功能,分散单…

160. 相交链表

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后…

富而喜悦一年一渡专属于你的特别的礼物!快来收!

过去的一年,你过得怎么样?是否有过艰难的逆流时刻,是否拥有过快乐和满足,又是否得到了成长和收获?富而喜悦2023一年一渡财富流新年主题活动就要给你一个礼物多多!美美的“礼物”活动! 为此&…

虹科分享 | 虹科Dimetix激光测距传感器如何利用反射来测量?(上)

-01-测量原理 ● 反射调制激光 采用激光振幅的高频调制,并评估这些调制的高频信号(脉冲串)的相位和距离。激光束在短间隔内被放大调制,这使得它能够非常迅速地测量单个脉冲包的与距离有关的时间偏移,而且还能测量单个波在调制包内相互之间的…

[附源码]Nodejs计算机毕业设计基于Web学术会议投稿管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分…