
# SMP并行执行
在复杂查询场景中，单个查询的执行较长，系统并发度低，通过SMP并行执行技术实现算子级的并行，能够有效减少查询执行时间，提升查询性能及资源利用率。
通过算子并行来提升性能，同时会占用更多的系统资源，包括CPU、内存、网络、I/O等等。本质上SMP是一种以资源换取时间的方式，在合适的场景以及资源充足的情况下，能够起到较好的性能提升效果；但是如果在不合适的场景下，或者资源不足的情况下，反而可能引起性能的劣化。同时，生成SMP需要考虑更多的候选计划，将会导致生成时间较长，相比串行场景也会引起性能的劣化。
DWS的SMP特性由GUC参数query_dop控制，该参数可设置用户自定义的查询并行度。
 #### SMP适用场景与限制
**SMP适用场景：**
- 支持并行的算子 计划中存在以下算子支持并行：
  1. Scan：支持行存普通表和行存分区表顺序扫描、列存普通表和列存分区表顺序扫描、HDFS内外表顺序扫描；支持GDS数据导入的外表扫描并行。以上均不支持复制表。
  
  2. Join：HashJoin、NestLoop
  
  3. Agg：HashAgg、SortAgg、PlainAgg、WindowAgg(只支持partition by，不支持order by)
  
  4. Stream：Redistribute、Broadcast
  
  5. 其他：Result、Subqueryscan、Unique、Material、Setop、Append、VectoRow、RowToVec
   
- SMP特有算子 为了实现并行，新增了并行线程间的数据交换Stream算子供SMP特性使用。以下新增的算子可以看作Stream算子的子类：
  1. Local Gather：实现DN内部并行线程的数据汇总
  
  2. Local Redistribute：在DN内部各线程之间，按照分布键进行数据重分布
  
  3. Local Broadcast：将数据广播到DN内部的每个线程
  
  4. Local RoundRobin：在DN内部各线程之间实现数据轮询分发
  
  5. Split Redistribute：在集群跨DN的并行线程之间实现数据重分布
  
  6. Split Broadcast：将数据广播到集群所有DN的并行线程
  
  
  上述新增算子可以分为Local与非Local两类，Local类算子实现了DN内部并行线程间的数据交换，而非Local类算子实现了跨DN的并行线程间的数据交换。
  
- 示例说明 以TPCH Q1的并行计划为例：
  ![](https://support.huaweicloud.com/devg-dws/figure/zh-cn_image_0000002628857678.jpg "点击放大")
  在这个计划中，实现了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信息即可看出各个算子的并行情况。
  
  
**非适用场景**：
1. 生成计划时间占比很高的短查询场景。
2. 不支持CN上的算子并行。
3. 不支持不能下推的查询并行执行。
4. 不支持子查询subplan的并行，以及包含子查询的算子并行。
#### 资源对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自适应功能，要设置query_dop=0，需同步调整以下相关参数值，以获取更佳的dop选择：
- comm_usable_memory 当系统内存较大时，max_process_memory设置较大，可适当调大该值，建议设置为max_process_memory的5%，默认值为max_process_memory/8。
  
- comm_max_stream 设置建议值为：comm_max_stream=Min(dop_limit \* dop_limit \* 20 \* 2, max_process_memory(字节数) \* 0.025 / 总DN数 / 260)，且该值在comm_max_stream取值范围内。
  
- max_connections 设置建议值为：max_connections=dop_limit \* 20 \* 6 + 24，且该值在max_connections取值范围内。
  ![](https://support.huaweicloud.com/devg-dws/public_sys-resources/caution_3.0-zh-cn.png)
  公式中的dop_limit为集群中每个DN对应的CPU数，计算公式为：dop_limit = 单机器的CPU逻辑核数 / 单机器的DN数。
  
 
#### SMP配置方式
![](https://support.huaweicloud.com/devg-dws/public_sys-resources/notice_3.0-zh-cn.png)
系统的CPU、内存、I/O和网络带宽等资源充足。SMP架构是一种利用富余资源来换取时间的方案，计划并行之后必定会引起资源消耗的增加，当上述资源成为瓶颈的情况下，SMP无法提升性能，反而可能导致性能的劣化。同时，SMP计划的生成时间较串行要长。因此，在短查询为主的TP类业务中，或者出现资源瓶颈的情况下，建议关闭SMP，即设置query_dop=1。
**配置步骤**：
1. 观察当前系统负载情况，如果系统资源充足（资源利用率小于50%），执行步骤2；否则退出。
2. 设置query_dop=1，利用explain打出执行计划，观察计划是否符合[SMP适用场景与限制]适用场景。如果符合，进入下一步。
3. 设置query_dop=-value，在考虑资源情况和计划特征基础上，限制dop选取的范围为\[1,value\]。
4. 设置query_dop=value，不考虑资源情况和计划特征，强制选取dop为1或value。
5. 在符合条件的查询语句执行前设置合适的query_dop值，在语句执行结束后关闭query_dop。例如，
   ```
   SET query_dop = 0;
   SELECT COUNT(*) FROM t1 GROUP BY a;
   ......
   SET query_dop = 1;
   ```
   ![](https://support.huaweicloud.com/devg-dws/public_sys-resources/note_3.0-zh-cn.png)
   - 资源许可的情况下，并行度越高，性能提升效果越好。
   
   - SMP并行度支持会话级设置，推荐客户在执行符合要求的查询前，打开smp，执行结束后，关闭smp。以免在业务峰值时，对业务造成冲击。
   
   - SMP自适应（query_dop\<=0）依赖资源管理，如果资源管理禁用，那么只会产生1或2并行度的计划。
     
 
