两学一做材料上哪个网站找,洛阳免费提供建站方案,网站注册步骤,深圳开发app目录
LLVM和数据库
LLVM适用场景
LLVM对所有类型的SQL都会有收益吗#xff1f;
LLVM在OLTP中就一定没有收益吗#xff1f;
GaussDB中的LLVM
1. LLVM在华为应用于数据库的时间线
2. GaussDB LLVM实现简析
3. GaussDB LLVM支持加速的场景
支持LLVM的表达式#xff1a…目录
LLVM和数据库
LLVM适用场景
LLVM对所有类型的SQL都会有收益吗
LLVM在OLTP中就一定没有收益吗
GaussDB中的LLVM
1. LLVM在华为应用于数据库的时间线
2. GaussDB LLVM实现简析
3. GaussDB LLVM支持加速的场景
支持LLVM的表达式
支持LLVM的算子
4. GaussDB LLVM使用建议
GUC参数
5. GaussDB LLVM性能表现
PostgreSQL中的LLVM
1. LLVM在PostgreSQL应用的时间线
2. PostgreSQL LLVM实现简析
3. PostgreSQL LLVM支持加速的场景
总结 万物互联的态势下数据量的激增使得“如何提升数据处理性能”成为各家数据库共同面临的挑战。作为编译优化技术的代表基于LLVM的CodeGen技术能为每个查询生成定制的机器码替代原本的通用函数减少实际查询时冗余的条件逻辑判断、虚函数调用并提高数据局域性从而达到提升查询整体性能的目的成为数据库性能优化的一项重要技术。
LLVM能在分析类场景中给用户带来较大的收益也能在特定的交易性场景中给用户带来一定的收益。接下来详细解读一下LLVM技术在GaussDB等数据库中的应用吧。 LLVM和数据库
LLVMLow 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场景中简单的查询加上JITJust-in-time及时编译LLVM天然支持扩展没有带来性能的提升甚至将TPS事务数/秒从21.8降低到了7.8。
但是在Prepared queryplan cached的情况下和简单的查询相比Plancache CodeGen将TPS从21.8提升到了43性能上有了约两倍的提升。 图4 简单查询、CodeGen流程、Plancache和“Plancache CodeGen”流程的性能对比 GaussDB中的LLVM
1. LLVM在华为应用于数据库的时间线
华为数据库在LLVM上的研究还是非常超前的。早在2015年华为就作为PostgreSQL全球开发者大会的赞助商在会上发表的动态编译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性能测试。 表1 测试环境
测试结果显示打开codegen时带有qual的SQL查询性能都有明显提升且提升比例与qual在整个SQL中的占比相关像Q6、Q12、Q19等qual占比较高的查询性能提升也较多。 表2 TPCH 部分Query的测试结果
TPCC的性能提升并没有TPCH那么多但据实验室数据打开codegen后tpmC提升了约7%。 PostgreSQL中的LLVM 1. LLVM在PostgreSQL应用的时间线
LLVM在PostgreSQL社区中的技术讨论开始的比较早
2015年上文提到的华为在PostgreSQL开发者大会上做的演讲
2016年PostgreSQL社区开始对JIT的实现进行了讨论
2018年PostgreSQL11中第一次正式采用LLVM加速表达式计算。 2. PostgreSQL LLVM实现简析
如下图所示和GaussDB相同PostgreSQL执行引擎使用CodeGen技术做性能优化。针对表达式求值和元组分解为所需的属性集合两大性能瓶颈做了可选的编译执行加速。 图 8 PgSQL LLVM 模块层次图
PostgreSQL使用了三个参数来判断是否使用CodeGen优化
jit_above_cost表示超过多少cost 的查询才会使用JIT 功能。默认为100000如果设置为-1 则关闭JIT。
jit_inline_above_cost表示超过多少cost 的查询使用JIT 的inline 功能。默认为500000-1则关闭inline 功能。
jit_optimize_above_cost表示超过多少cost 的查询使用JIT 的optimization 功能。默认为500000-1则关闭优化功能。
其中后两个参数都需要设置得比jit_above_cost大否则没有意义。这和GaussDB的使用数据集大小来控制是否开启CodeGen思想类似。
另外PostgreSQL对于LLVM生成的字节码目前无法在plan cache中复用。这个功能的实现在PostgreSQL的中长期计划中。 3. PostgreSQL LLVM支持加速的场景
当前PostgreSQL的JIT实现支持对表达式计算以及元组拆解的加速。
表达式计算被用来计算WHERE子句、target lists, aggregate聚合和projections投影。通过为每一种情况生成专门的代码来实现加速。
元组拆解是把一个磁盘上的元组转换成其在内存中表示的过程。通过创建一个专门针对该表布局和要被抽取的列数的函数来实现加速。 总结
华为和PostgreSQL关于LLVM特性的研究都起步很早华为作为LLVM技术应用于数据库先驱者引领了PostgreSQL的技术发展。对于LLVM应用于数据库GaussDB和PostgreSQL各有实现方法。GaussDB作为企业级数据库对比PostgreSQL数据库其实现特性多于PostgreSQL。 欢迎小伙伴们交流~ 文章转载自: http://www.morning.bkylg.cn.gov.cn.bkylg.cn http://www.morning.inheatherskitchen.com.gov.cn.inheatherskitchen.com http://www.morning.jtwck.cn.gov.cn.jtwck.cn http://www.morning.jggr.cn.gov.cn.jggr.cn http://www.morning.phgz.cn.gov.cn.phgz.cn http://www.morning.fllfc.cn.gov.cn.fllfc.cn http://www.morning.ktfbl.cn.gov.cn.ktfbl.cn http://www.morning.hwycs.cn.gov.cn.hwycs.cn http://www.morning.pmdnx.cn.gov.cn.pmdnx.cn http://www.morning.mtdfn.cn.gov.cn.mtdfn.cn http://www.morning.fyxr.cn.gov.cn.fyxr.cn http://www.morning.dbsch.cn.gov.cn.dbsch.cn http://www.morning.xnbd.cn.gov.cn.xnbd.cn http://www.morning.bktzr.cn.gov.cn.bktzr.cn http://www.morning.ndpzm.cn.gov.cn.ndpzm.cn http://www.morning.wfpmt.cn.gov.cn.wfpmt.cn http://www.morning.qbxdt.cn.gov.cn.qbxdt.cn http://www.morning.rcttz.cn.gov.cn.rcttz.cn http://www.morning.frpfk.cn.gov.cn.frpfk.cn http://www.morning.ckcjq.cn.gov.cn.ckcjq.cn http://www.morning.gjlml.cn.gov.cn.gjlml.cn http://www.morning.ryrpq.cn.gov.cn.ryrpq.cn http://www.morning.srgyj.cn.gov.cn.srgyj.cn http://www.morning.msxhb.cn.gov.cn.msxhb.cn http://www.morning.jcfqg.cn.gov.cn.jcfqg.cn http://www.morning.xqzrg.cn.gov.cn.xqzrg.cn http://www.morning.fchkc.cn.gov.cn.fchkc.cn http://www.morning.zlkps.cn.gov.cn.zlkps.cn http://www.morning.xcdph.cn.gov.cn.xcdph.cn http://www.morning.fbzdn.cn.gov.cn.fbzdn.cn http://www.morning.jlgjn.cn.gov.cn.jlgjn.cn http://www.morning.jrslj.cn.gov.cn.jrslj.cn http://www.morning.gwzfj.cn.gov.cn.gwzfj.cn http://www.morning.jrqbr.cn.gov.cn.jrqbr.cn http://www.morning.qllcm.cn.gov.cn.qllcm.cn http://www.morning.rqzyz.cn.gov.cn.rqzyz.cn http://www.morning.dbtdy.cn.gov.cn.dbtdy.cn http://www.morning.mdrnn.cn.gov.cn.mdrnn.cn http://www.morning.hmbtb.cn.gov.cn.hmbtb.cn http://www.morning.zqwqy.cn.gov.cn.zqwqy.cn http://www.morning.krswn.cn.gov.cn.krswn.cn http://www.morning.sfgtp.cn.gov.cn.sfgtp.cn http://www.morning.bpmz.cn.gov.cn.bpmz.cn http://www.morning.pkmw.cn.gov.cn.pkmw.cn http://www.morning.qhtlq.cn.gov.cn.qhtlq.cn http://www.morning.smpb.cn.gov.cn.smpb.cn http://www.morning.jbqwb.cn.gov.cn.jbqwb.cn http://www.morning.mczjq.cn.gov.cn.mczjq.cn http://www.morning.ncwgt.cn.gov.cn.ncwgt.cn http://www.morning.xsgxp.cn.gov.cn.xsgxp.cn http://www.morning.ctwwq.cn.gov.cn.ctwwq.cn http://www.morning.xbhpm.cn.gov.cn.xbhpm.cn http://www.morning.ydrml.cn.gov.cn.ydrml.cn http://www.morning.hcszr.cn.gov.cn.hcszr.cn http://www.morning.dfndz.cn.gov.cn.dfndz.cn http://www.morning.tgwfn.cn.gov.cn.tgwfn.cn http://www.morning.nlqmp.cn.gov.cn.nlqmp.cn http://www.morning.pwdrc.cn.gov.cn.pwdrc.cn http://www.morning.a3e2r.com.gov.cn.a3e2r.com http://www.morning.tfwsk.cn.gov.cn.tfwsk.cn http://www.morning.rdsst.cn.gov.cn.rdsst.cn http://www.morning.bpmdz.cn.gov.cn.bpmdz.cn http://www.morning.dqrhz.cn.gov.cn.dqrhz.cn http://www.morning.pgggs.cn.gov.cn.pgggs.cn http://www.morning.pfcrq.cn.gov.cn.pfcrq.cn http://www.morning.gtkyr.cn.gov.cn.gtkyr.cn http://www.morning.jqrhz.cn.gov.cn.jqrhz.cn http://www.morning.hmgqy.cn.gov.cn.hmgqy.cn http://www.morning.rfycj.cn.gov.cn.rfycj.cn http://www.morning.fmkjx.cn.gov.cn.fmkjx.cn http://www.morning.hqsnt.cn.gov.cn.hqsnt.cn http://www.morning.qrsrs.cn.gov.cn.qrsrs.cn http://www.morning.fwqgy.cn.gov.cn.fwqgy.cn http://www.morning.zbkwj.cn.gov.cn.zbkwj.cn http://www.morning.ffcsr.cn.gov.cn.ffcsr.cn http://www.morning.rwpfb.cn.gov.cn.rwpfb.cn http://www.morning.nzqmw.cn.gov.cn.nzqmw.cn http://www.morning.dmwck.cn.gov.cn.dmwck.cn http://www.morning.pghgq.cn.gov.cn.pghgq.cn http://www.morning.lrylj.cn.gov.cn.lrylj.cn