高斯数据库 (gaussDB) - 性能调优 (8)
配置 SMP
介绍 SMP 模块的使用限制与适用场景,并给出 SMP 设置指南。
SMP 适用场景与限制
背景信息
SMP 特性通过算子并行来提升性能,同时会占用更多的系统资源,包括 CPU、内存、
网络、I/O 等等。本质上 SMP 是一种以资源换取时间的方式,在合适的场景以及资源充
足的情况下,能够起到较好的性能提升效果;但是如果在不合适的场景下,或者资源
不足的情况下,反而可能引起性能的劣化。
适用场景
- 支持并行的算子
计划中存在以下算子支持并行:
a. Scan:支持行存普通表和行存分区表顺序扫描、列存普通表和列存分区表顺
序扫描、HDFS 内外表顺序扫描;支持 GDS 数据导入的外表扫描并行。以上均
不支持复制表。
b. Join:HashJoin、NestLoop
c. Agg:HashAgg、SortAgg、PlainAgg、WindowAgg( 只支持 partition by,不支
持 order by)。
d. Stream:Redistribute、Broadcast
e. 其他:Result、Subqueryscan、Unique、Material、Setop、Append、
VectoRow、RowToVec - SMP 特有算子
为了实现并行,新增了并行线程间的数据交换 Stream 算子供 SMP 特性使用。这些
新增的算子可以看做 Stream 算子的子类。
a. Local Gather:实现 DN 内部并行线程的数据汇总
b. Local Redistribute:在 DN 内部各线程之间,按照分布键进行数据重分布
c. Local Broadcast:将数据广播到 DN 内部的每个线程
d. Local RoundRobin:在 DN 内部各线程之间实现数据轮询分发
e. Split Redistribute:在集群跨 DN 的并行线程之间实现数据重分布
f. Split Broadcast:将数据广播到集群所有 DN 的并行线程
上述新增算子可以分为 Local 与非 Local 两类,Local 类算子实现了 DN 内部并行线程
间的数据交换,而非 Local 类算子实现了跨 DN 的并行线程间的数据交换。 - 示例说明
以 TPCH Q1 的并行计划为例:
在这个计划中,实现了 Hdfs Scan 以及 HashAgg 算子的并行,并且新增了 Local
Gather 和 Split Redistribute 数据交换算子。
其中 6 号算子为 Split Redistribute 算子,上面标有的“dop: 4/4”表明 Split
Redistribute 的发送端和接收端线程的并行度均为 4。4 号算子为 Local Gather,上面
标有“dop: 1/4”,该算子的发送端线程并行度为 4,而接收端线程并行度为 1,即
下层的 5 号 Hash Aggregate 算子按照 4 并行度执行,而上层的 1~3 号算子按照串行执
行,4 号算子实现了 DN 内并行线程的数据汇总。
通过计划 Stream 算子上标明的 dop 信息即可看出各个算子的并行情况。
非适用场景
- 不支持 CN 上的算子并行。
- 不支持不能下推的查询并行执行。
- 不支持子查询 subplan 和 initplan 的并行,以及包含子查询的算子并行。
资源对 SMP 性能的影响
SMP 架构是一种利用富余资源来换取时间的方案,计划并行之后必定会引起资源消耗
的增加,包括 CPU、内存、I/O 和网络带宽等资源的消耗都会出现明显的增长,而且随
着并行度的增大,资源消耗也随之增大。当上述资源成为瓶颈的情况下,SMP 无法提
升性能,反而可能导致集群整体性能的劣化。SMP 支持自适应特性,该特性会根据当
前资源和查询特征,动态选取最优的并行度。下面对各种资源对 SMP 性能的影响情况
分别进行说明:
- CPU 资源
在一般客户场景中,系统 CPU 利用率不高的情况下,利用 SMP 并行架构能够更充
分地利用系统 CPU 资源,提升系统性能。但当数据库服务器的 CPU 核数较少,
CPU 利用率已经比较高的情况下,如果打开 SMP 并行,不仅性能提升不明显,反
而可能因为多线程间的资源竞争而导致性能劣化。 - 内存资源
查询并行后会导致内存使用量的增长,但每个算子使用内存上限仍受到 work_mem
等参数的限制。假设 work_mem 为 4GB,并行度为 2,那么每个并行线程所分到的
内存上限为 2GB。在 work_mem 较小或者系统内存不充裕的情况下,使用 SMP 并行
后,可能出现数据下盘,导致查询性能劣化的问题。 - 网络带宽资源
为了实现查询并行执行,会新增并行线程间的数据交换算子。对于 Local 类 Stream
算子,所需要进行数据交换的线程在同一个 DN 内,通过内存交换,不会增加网络
负担。而非 Local 类算子,需要通过网络进行数据交换,因此会加重网络负担。当
网络资源成为瓶颈的情况下,并行可能会导致一定程度的劣化。 - I/O 资源
要实现并行扫描必定会增加 I/O 的资源消耗,因此只有在 I/O 资源充足的情况下,并
行扫描才能够提高扫描性能。
其他因素对 SMP 性能的影响
除了资源因素外,还有一些因素也会对 SMP 并行性能造成影响。例如分区表中分区数
据不均,以及系统并发度等因素。
- 数据倾斜对 SMP 性能的影响
当数据中存在严重数据倾斜时,并行效果较差。例如某表 join 列上某个值的数据量
远大于其他值,开启并行后,根据 join 列的值对该表数据做 hash 重分布,使得某个
并行线程的数据量远多于其他线程,造成长尾问题,导致并行后效果差。 - 系统并发度对 SMP 性能的影响
SMP 特性会增加资源的使用,而在高并发场景下资源剩余较少。所以,如果在高
并发场景下,开启 SMP 并行,会导致各查询之间严重的资源竞争问题。一旦出现
了资源竞争的现象,无论是 CPU、I/O、内存或者网络资源,都会导致整体性能的
下降。因此在高并发场景下,开启 SMP 往往不能达到性能提升的效果,甚至可能
引起性能劣化。
SMP 使用建议
根据上面的分析,总结如下:
使用限制
想要利用 SMP 提升查询性能需要满足以下条件:
系统的 CPU、内存、I/O 和网络带宽等资源充足。SMP 架构是一种利用富余资源来换取
时间的方案,计划并行之后必定会引起资源消耗的增加,当上述资源成为瓶颈的情况
下,SMP 无法提升性能,反而可能导致性能的劣化。在出现资源瓶颈的情况下,建议
关闭 SMP。
配置步骤
- 观察当前系统负载情况,如果系统资源充足(资源利用率小于 50%),执行步骤
2;否则退出。 - 设置 query_dop=1(默认值),利用 explain 打出执行计划,观察计划是否符合
14.3.3.1 SMP 适用场景与限制小节中的适用场景。如果符合,进入下一步。 - 设置 query_dop=0(自适应),系统会根据资源情况和计划特征,动态为每个查询
选取 [1,8] 之间的最优的并行度,最大化提升查询性能。 - 设置 query_dop=-value,在考虑资源情况和计划特征基础上,限制 dop 选取的范围
为 [1,value]。 - 设置 query_dop=value,不考虑资源情况和计划特征,强制选取 dop 为 1 或 value。
- 在符合条件的查询语句执行前设置合适的 query_dop 值,在语句执行结束后关闭
query_dop。例如,
SET query_dop = 0 ;
SELECT COUNT(*) FROM t1 GROUP BY a ;
......
SET query_dop = 1 ;
说明
- 资源许可的情况下,并行度越高,性能提升效果越好。
- SMP 并行度支持会话级设置,推荐客户在执行符合要求的查询前,打开 smp,执行结束
后,关闭 smp。以免在业务峰值时,对业务造成冲击。 - SMP 自适应(query_dop<=0)依赖资源管理,如果资源管理禁用,那么只会产生 1 或 2 并 行度的计划。
本文内容由互联网用户自发贡献,版权归作者所有,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:jaagool@sina.cn 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。