GaussDB作为企业级的数据库,经过了多年的技能发展,具备丰富的技能特性,使用LLVM技能后提拔了体系的查询性能,使得开辟者在OLAP和OLTP多场景中均受益。 Hi,别急!让技能触达每一个角落,赋能更多的人,GaussTech第3期《LLVM技能在GaussDB等数据库中的应用》,不仅带来满满的技醒目货,还推出【分享集赞回帖赢好礼】运动,参与就能赢好礼,点击链接参与!
万物互联的态势下,数据量的激增使得“怎样提拔数据处理处罚性能”成为各家数据库共同面临的寻衅。作为编译优化技能的代表,基于LLVM的CodeGen技能,能为每个查询天生定制的机器码更换原本的通用函数,减少实际查询时冗余的条件逻辑判断、虚函数调用并提高数据局域性,从而达到提拔查询团体性能的目的,成为数据库性能优化的一项重要技能。
LLVM能在分析类场景中给用户带来较大的收益,也能在特定的交易性场景中给用户带来一定的收益。接下来详细解读一下LLVM技能在GaussDB中的应用吧。
LLVM和数据库
LLVM(Low Level Virtual Machine)是一款盛行的开源编译器框架,是CodeGen(天生源代码的工具)技能的事实标准,被广泛运用于数据库(如KES,AnalyticDB,GaussDB)、大数据(如Spark)、AI平台(如tensorflow)等领域,用于提拔数据处理处罚的性能。
在没有引入LLVM这类CodeGen技能之前,数据库会使用通用的处理处罚逻辑来处理处罚数据,但通用逻辑“笨重”(递归、封装、类型判断转换)的代码实现方式,存在虚函数开销、缓存使用率低下、对指令集不敏感等性能短板。
引入LLVM之后,可以为具体的查询天生定制化的机器码,并尽可能的将数据存储在CPU的寄存器中进一步加速计算的速度:
- LLVM天然支持JIT,该技能可以办理条件逻辑冗余的问题;
- 减少大量的虚函数调用;
- 将数据尽可能的从内存加载到Cache上;
- LLVM做了很多自动矢量化的工作;
比如,下图左侧是通用代码,右侧是CodeGen之后的代码。CodeGen根据实际情况消除了不须要的循环和判断。
图1 通用性处理处罚逻辑和LLVM代码示意
另外,LLVM技能可以有不同的实现粒度。比如:可使用LLVM加速表达式计算,或再进一步,将多个算子融合编译成定制的机器码,或将自界说函数、存储过程等编译成定制的机器码。
图2 LLVM的实现粒度
数据库在实行引擎中,运用LLVM技能提拔SQL的实行速度。如下图所示:
图3 LLVM技能运用于实行引擎
LLVM适用场景
LLVM对所有类型的SQL都会有收益吗?
答案是否定的。
因为实行及时编译自己需要耗费一定的时间(简朴表达式能做到毫秒级,复杂情况在百毫秒级),对于查询自己耗时较少的场景,加入LLVM反而会导致性能劣化。
因此,目前LLVM在OLAP/HTAP分析型业务场景中收益较大,有着广泛应用,而在OLTP交易型业务场景中,则相对没有那么广泛。
LLVM在OLTP中就一定没有收益吗?
答案同样是否定的。
找对场景,一样有收益。比如根据ISPRAS 2017年发表的实验结果 jit-compiling sql queries in postgresql using llvm可知:pgbench测试下,OLTP场景中简朴的查询加上JIT(Just-in-time及时编译,LLVM天然支持)扩展没有带来性能的提拔,甚至将TPS(事务数/秒)从21.8低沉到了7.8。
但是在Prepared query(plan cached)的情况下,叠加 JIT技能之后将TPS从20.7提拔到了43,性能上有了两倍的提拔。
GaussDB中的LLVM
1. LLVM在华为应用于数据库的时间线
华为云数据库在LLVM上的研究还是非常超前的。早在2015年,华为就作为某盛行开源数据库社区的全球开辟者大会的赞助商,在会上发表的动态编译(Go Faster with Native Compilation)演讲,引起了很大的反响。
当时社区领袖Josh Burkus在其博客里面,用一节篇幅专门详细介绍了华为动态编译的议题。
图5 2015年社区领袖Josh Burkus介绍华为的动态编译议题
在2017年,华为在面向OLAP场景的数据库内核中突破了LLVM动态编译技能,并在多个运营商、金融证券的POC项目中帮助客户提拔数据处理处罚性能,同时,在软件开辟过程中充分模块化、通用化接口设计,将LLVM同年落地到面向OLTP的数据库设计中。
目前,GaussDB数据库对于LLVM也在不断的演进开辟。
2. GaussDB LLVM实现简析
GaussDB针对向量化引擎(主要用于分析场景)、行存(主要用于交易场景)都实现了CodeGen。如下图所示,从代码模块层次来看:
1) GaussDB通过API接口层封装处理处罚了LLVM环境、资源、基本元素等。
2) GaussDB在CodeGen层调用API接口进行了不同粒度的实现。
3) GaussDB在实行引擎侧根据情况使用CodeGen技能进行性能优化。
图6 GaussDB LLVM 模块层次图
GaussDB启动后会进行LLVM的初始化工作,查抄CPU对CodeGen的支持情况,并进行环境初始化。
在实行启动阶段,以表达式为例,步伐会判断当前表达式是否可JIT,是的话,则会进行IR函数的天生和天生定制机器码,及原本表达式实行函数的入口更换工作。
在实际实行过程中,运行处理处罚函数(该函数已经在上一阶段进行了入口更换)进行实际实行工作。
在实行竣事后的清算阶段,释放LLVM相干资源。
图7 GaussDB CodeGen编译实行流程简图
GaussDB使用了阈值codegen_cost_threshold来估算当前查询使用LLVM技能是否能带来收益。假如处理处罚数据的规模大于该阈值后,才会继续使用LLVM技能进行相干处理处罚。该阈值代表行数,也可以明白成处理处罚数据的规模,默认值为100000行,可以调治。
在OLAP场景中,GaussDB在判断是否能够对于一个算子进行CodeGen后(如:数据类型,算子类型判断等),开始天生对应的IR bytecode片段,之后MCJIT模块会调用天生的LLVM Module单元进行实行。
在OLTP场景中,GaussDB则会在Plan Cache场景下结合CodeGen框架,通过缓存机器码的方式,节省下编译天生中间语言IR Func以及优化成机器码的时间,整个过程是异步的。因此,在大量重复查询的场景下,后续的查询也会因为LLVM技能而受益。
另外,为了避免行数估计错误而选择CodeGen导致性能劣化,GaussDB还研发了当前业界独有的异步编译功能,即在查询语句确定要使用CodeGen的时间,将编译工作转交给后台线程,工作线程在JIT函数编译完成前继续使用原始实行逻辑实行,编译完成后,再更换成JIT函数实行。
3. GaussDB LLVM支持加速的场景
支持LLVM的表达式:
行存表达式计算支持的数据类型不受限制。
在向量化实行引擎中,仅当表达式出现在Scan节点的filter、Hash Join节点中的complicate hash condition,hash join filter,hash join target, Nested Loop节点中的filter,join filter, Merge Join节点的merge join filter, merge join target, Group节点中的filter表达式时,才会思量是否使用LLVM动态编译优化。
在行存实行引擎中,除一次性的表达式计算外,会思量为所有算子的filter和Targetlist表达式都使用LLVM动态编译优化。
支持LLVM的算子:
Join :HashJoin(仅向量化实行引擎支持)
Agg :HashAgg
Sort(仅向量化实行引擎支持)
此中,HashJoin算子仅支持Hash Inner Join,对应的hash cond仅支持int4、bigint、bpchar类型的比力;HashAgg算子仅支持针对bigint、numeric类型的sum及avg操纵,且group by语句仅支持int4、bigint、bpchar,text,varchar,timestamp类型操纵,同时支持count(*)聚集操纵。Sort算子仅支持对int4,bigint,numeric,bpchar,text,varchar数据类型的比力操纵。除此之外,无法使用LLVM动态编译优化,具体可通过explain performance工具进行显示。
4. GaussDB LLVM使用建议
GUC参数:
enable_codegen:控制LLVM特性的打开和关闭。目前数据库内核侧默认打开。
codegen_cost_threshold:使用处理处罚行数控制是否开启codegen,默认为10000。10000是通过实验验证得出的优化值,不建议将此值设置的过低。
另外,在开启LLVM特性的条件下,建议在允许的条件下尽可能设置较大的work_mem,假如出现大量下盘,则建议关闭LLVM动态编译优化。用户可通过analysis_options为on(LLVM_COMPILE),实行对应查询语句,在User Define Profiling中就可以看到LLVM的编译时间。结合此数据,可对codegen_cost_threshold进一步调解以获取更好的查询性能。
5. GaussDB LLVM性能表现
GaussDB实验室分别就codegen打开和关闭进行了TPCH性能测试。
操纵体系 | EulerOS release 2.0 (SP8) | CPU | 128核 * aarch64 | 内存 | 2.0Ti | 表1 测试环境
测试结果显示,打开codegen时,带有qual的SQL,查询性能都有明显提拔,且提拔比例与qual在整个SQL中的占比相干,像Q6、Q12、Q19等qual占比力高的查询,性能提拔也较多。
TPCH | 数据量 | qual(Expr) | 测试结果(s) | 性能提拔 | 关 | 开 | Q6 | 0.9亿 | l_shipdate >= '1994-01-01'::dateand l_shipdate < '1994-01-01'::date + interval '1 year'and l_discount between 0.06 - 0.01 and 0.06 + 0.01and l_quantity < 24; | 66 | 52 | 21% | Q12 | 6.0亿 | and l_shipmode in ('MAIL', 'SHIP')and l_commitdate < l_receiptdateand l_shipdate < l_commitdateand l_receiptdate >= date '1994-01-01'and l_receiptdate < date '1994-01-01' + interval '1 year' | 306 | 210 | 31% | Q19 | 6.0亿 | and l_shipmode in ('AIR', 'AIR REG')and l_shipinstruct = 'DELIVER IN PERSON' | 296 | 208 | 30% | 表2 TPCH 部分Query的测试结果
TPCC的性能提拔并没有TPCH那么多,但据实验室数据,打开codegen后,tpmC提拔了约7%。
总结
LLVM被广泛运用于数据库、大数据、AI等领域。在数据库领域,多家贸易数据库和开源数据库都应用其加速数据库处理处罚。GaussDB作为企业级的数据库,经过了多年的技能发展,具备丰富的技能特性,使用该技能后提拔了体系的查询性能,使得客户在OLAP和OLTP多场景中均受益。
“【分享集赞回帖赢好礼】LLVM技能在GaussDB等数据库中的应用”运动来啦!参与就有时机赢取华为背包、华为云定制短袖、蓝牙音箱、册本等好礼!
运动时间:2024/5/28-6/17
怎样参与?
点击链接:https://bbs.huaweicloud.com/forum/thread-0249152272038530018-1-1.html
HDC 2024,6月21日-23日,东莞松山湖,期待与您相见!
更多详情请关注官网:
中文:华为开辟者大会2024_HDC 2024
英文:华为开辟者大会2024_HDC 2024
点击关注,第一时间了解华为云奇怪技能~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |