摘要:通过这篇文章,咱们理解了GaussDB(DWS)并行计算技术的原理以及调优策略。心愿宽广开发者敌人们可能在实践中尝试该技术,更好地进行性能优化。

随着硬件零碎的越来越好,数据库运行的CPU、磁盘、内存资源都日渐增大,SQL语句的串行执行因为不能充分利用资源,曾经不能满足日益倒退的须要。为此,GaussDB(DWS)开发了并行计算技术,在语句执行时能够充分利用硬件资源进行并行减速,进步执行的吞吐率。本文将具体介绍GaussDB(DWS)并行计算技术的原理,以及其在performance信息中的展现,帮忙各位开发者敌人更好地剖析并行的性能,从而进行并行执行方面的调优。

并行计算的原理很简略,将本来一个线程的工作平均分配到多个线程来实现,示意图如下图所示:图示中的关联操作,本来须要操作四份数据,通过并行度为4的并行计算后,每个子线程仅须要解决一份数据,实践上性能晋升能够达到4倍。

通常状况下,实践上的性能晋升是达不到的,因为并行计算也有其性能损耗,包含:启动线程的代价,以及线程之间进行数据传输的代价。因而,只能性能损耗较低,大大低于并行带来的收益时,并行计算的收益才比拟显著。所以,并行只有在数据量较大的场景下能力取得较高的性能收益,非常适合于剖析型的AP场景。

通过上述剖析,咱们能够看出,并行计算的难点不在于如何并行,而在于如何正确抉择并行度。当数据量较小时,兴许串行的性能是最好的,当数据量增大时,能够思考进行并行。对于一个简单的执行打算来说,可能蕴含多个算子,每个算子解决的数据量都不一样,如何综合思考并行度,以及解决好各算子之间的数据收发关系,将成为并行计算技术的要害难点。

GaussDB(DWS)基于代价估算,依据表的数据量信息来为打算片段生成适合的并行度,上面以TPC-DS Q48为例来看一下,GaussDB(DWS)的并行打算长什么样?

select sum (ss_quantity) from   store_sales, store, customer_demographics, customer_address, date_dim where s_store_sk = ss_store_sk and    ss_sold_date_sk = d_date_sk and d_year = 1998 and  (  (     cd_demo_sk = ss_cdemo_sk     and     cd_marital_status = 'M'     and     cd_education_status = '4 yr Degree'     and     ss_sales_price between 100.00 and 150.00      ) or  (    cd_demo_sk = ss_cdemo_sk     and     cd_marital_status = 'D'     and     cd_education_status = 'Primary'     and     ss_sales_price between 50.00 and 100.00    ) or   (    cd_demo_sk = ss_cdemo_sk    and     cd_marital_status = 'U'     and     cd_education_status = 'Advanced Degree'     and     ss_sales_price between 150.00 and 200.00  ) ) and (  (    ss_addr_sk = ca_address_sk    and    ca_country = 'United States'    and    ca_state in ('KY', 'GA', 'NM')    and ss_net_profit between 0 and 2000     ) or    (ss_addr_sk = ca_address_sk    and    ca_country = 'United States'    and    ca_state in ('MT', 'OR', 'IN')    and ss_net_profit between 150 and 3000  ) or    (ss_addr_sk = ca_address_sk    and    ca_country = 'United States'    and    ca_state in ('WI', 'MO', 'WV')    and ss_net_profit between 50 and 25000  ) );

对应的performance信息为:

通过将performance信息转变为打算树,能够失去该打算的打算树如下图所示:其中1-3号算子在CN上执行,DN上以跨线程数据传输的Stream算子进行分隔,一共会启动5个线程。GaussDB(DWS)采纳pipeline的迭代执行模式,线程4和5从磁盘读取数据,其它每个Stream算子分隔的线程从子线程读取数据,进行执行,并将后果返回给下层算子,顶层DN线程将数据返回给CN解决。通过这个图,咱们能够看出,线程1,4,5采纳的并行度是1,而线程2,3采纳的并行度是26。通过打算信息,咱们能够看出,8-13号算子解决的数据量较大,刚好是线程2,3解决的范畴,所以抉择了较高的并行度。

并行计算的Stream线程依然沿用DN间的Stream线程进行启动和进行,但DN外部的数据传输改为内存拷贝进行,更节俭网络资源,但带来肯定水平的内存开销。同时,并行度的增大也使得跨DN间数据传输的数据缓冲区增大,内存开销变大。因而,大内存也是进步并行度的一个必备因素。那么线程之间是如何进行并行度的连接呢?

通过打算,咱们能够看出,并行场景下,Stream线程均显示为:Streaming(type: T dop:N/M),这是在串行场景根底上的扩大,同时也能够以线程为级别看到每个线程执行工夫,解决的行数和应用的内存。在串行场景下,咱们反对三种类型的Stream算子,别离为redistribute, broadcast和gather,具体介绍参见《GaussDB(DWS)性能调优系列根底篇二:大道至简explain分布式打算》中第一章节介绍。

并行场景是对串行场景中DN上的redistribute和broadcast类型Stream算子进行裁减,包含以下几类:

1)Streaming(type: SPLIT REDISTRIBUTE):同串行场景下的Redistribute,但以线程为单位进行数据传输,每条元组发送给一个目标线程。

2)Streaming(type: SPLIT BROADCAST):同串行场景下的Broadcast,但以线程为单位进行数据传输,每个线程都将收到全量数据。

3)Streaming(type: LOCAL REDISTRIBUTE):作用是DN外部依据以后散布键进行数据Redistribute。通常作用于基表扫描后,因为基表扫描是按页面进行线程划分,此时线程间并不是按DN的散布键散布的,须要减少该DN内重散布操作。

4)Streaming(type: LOCAL BROADCAST):作用是DN外部进行数据Broadcast,每个线程把数据发送给这个DN的所有线程,每个线程取得该DN的全量数据。5)Streaming(type: LOCAL GATHER):作用是DN外部把数据从多线程汇总到一个线程。

留神:“dop:N/M”示意发送端的dop为M,接收端的dop为N,从而实现从M个线程的并行度转变为N个线程并行度的工作。

在GaussDB(DWS)中,咱们减少了参数query_dop,来管制语句的并行度,取值如下:

1)query_dop=1,串行执行,默认值

2)query_dop=[2..N],指定并行执行并行度

3)query_dop=0,自适应调优,依据系统资源和语句复杂度状况自适应抉择并行度

因为开启并行会占用较多的内存,所以目前GaussDB(DWS)的默认并行度为1。在内存较大的环境下,能够通过手动设置query_dop达到并行减速的目标。通常状况下,咱们能够思考首先设置query_dop=0,查看语句的执行打算、performance信息和性能。在performance信息的下方Query Summary一栏,能够看到自适应dop抉择的信息,例如:TPC-DS Q48 dop抉择信息如下图所示,能够看出初步选定的initial dop为24,最终确定的final dop为26。dop的抉择会综合思考各种因素,其信息也在图中显示进去。

因为自适应抉择并行度是依据语句复杂度和系统资源利用状况来进行抉择,而系统资源利用状况是获取前一段时间的资源利用状况,有可能呈现不精确的状况,此时就须要人为来设置并行度了。人为设置并行度,并不是设置越大越好,dop设置过大,会导致系统中的线程数量急剧增多,导致CPU抵触进行线程切换的额定开销。要想人为设置并行度,同样须要应用单机CPU核数和语句复杂程度进行考量。咱们定义单机CPU核数/单机DN数为每个DN可用的CPU核数x,而后依据串行打算中DN Stream算子的个数初步断定语句的复杂度y(例如下图TPC-H Q1打算中只有一个Stream节点,则y为1),单并发时,应用x/y的值设置query_dop。并发场景,再除以并发数p设置query_dop。因为此公式为粗略估计值,因而在设置时能够思考扩充搜寻范畴,来寻找适合的并行度。

在并发场景下,GaussDB(DWS)还反对max_active_statements来管制执行语句的个数,当语句的个数超过CPU核数时,能够思考应用该参数限度并发数,而后再设置正当的query_dop进行调优。还是以方才的示例为例,单机有96核,2个DN,则每个DN可用48核,则同时执行6个TPC-H Q1查问时,并行度能够设置为8。

通过这篇文章,咱们理解了GaussDB(DWS)并行计算技术的原理以及调优策略。心愿宽广开发者敌人们可能在实践中尝试该技术,更好地进行性能优化。

点击关注,第一工夫理解华为云陈腐技术~