Oceanbase 数据库并行查询(Parallel Execution,PX)的参数决定了并行查询的快慢,主要包括并行度和 exchange 相关参数 。

并行度参数

并行度相关参数主要决定每个 query 并发时的 worker 个数。

参数名称

描述

取值范围

默认值

配置建议

parallel_max_servers

控制每个服务器最大的并行执行线程个数,所有PX worker 加起来不能超过该值。

[0, 1800]10(目前会根据 CPU 个数计算得到,以实际大小为准)该参数主要是控制PX 场景下所有 PX worker 总数,建议值为可用CPU个数的倍数关系。

parallel_servers_target

当 query 准备排队之前,控制检查 query 要求的并行度和已统计的 worker 总和是否超过该值。如果超过该值,则 query 需要排队,否则 query 继续执行。

[0, 1800]

10(目前会根据 CPU 个数计算得到,以实际大小为准)

该参数主要是控制 PX 场景下,当 query 准备进行并行查询时,如果没有足够 worker 处理该query,决定是否继续进行还是排队等待。

上述两个参数一个是控制最大的并发度,一个是用来决策 query 在并行查询时是否排队。两者需要协同工作,如果只使用 parallel_max_servers 设置最大并行度,当查询过多时,会导致所有 worker 都被调度起来,导致 CPU 等资源紧张,查询性能下降。在 CPU 等资源有限的情况下,使用 parallel_servers_target 控制 query 进行排队可以提高整个并发的吞吐量。

可以通过 show variables 来查看这些参数的值,如下例所示:

  1. OceanBase(root@oceanbase)>show variables like '%paral%';
  2. +-------------------------+-------+
  3. | Variable_name | Value |
  4. +-------------------------+-------+
  5. | ob_max_parallel_degree | 32 |
  6. | ob_stmt_parallel_degree | 1 |
  7. | parallel_max_servers | 5 |
  8. | parallel_servers_target | 4 |
  9. +-------------------------+-------+
  10. 4 rows in set (0.00 sec)

注意:

ob_stmt_parallel_degree 参数不需要设置,对 PX 框架无效。

Exchange(Shuffle)参数

Exchange(Shuffle) 参数主要用来控制在每个 DFO 之间进行数据传输时的参数控制,也就是数据进行 shuffle 时的内存控制。Oceanbase 将数据传输封装成了叫做 DTL(Data Transfer layer) 的模块。

参数名称

描述

取值范围

默认值

配置建议

dtl_buffer_size

控制 exchange 算子之间(即transmit 和 receive 之间)发送数据时,每次发送数据的 buffer 的大小。即当数据达到了该值上限才进行发送,减少每行传输的代价。

[0, 1800]10(目前会根据 CPU 个数计算得到,以实际大小为准)

PX 场景下,exchange 之间发送数据依赖于该参数大小,一般不需要调整该参数,如果是为了减少发送数据次数等可以尝试进行修改,一般不建议修改该值大小。

可以通过 show parameters 来查看参数的值,如下例所示:

  1. OceanBase(root@oceanbase)>show parameters like '%message%';
  2. +-------+----------+----------------+----------+----------------------------+-----------+-------+---------------------------------------------------------------------------------------------------+---------+--------+---------+-------------------+
  3. | zone | svr_type | svr_ip | svr_port | name | data_type | value | info | section | scope | source | edit_level |
  4. +-------+----------+----------------+----------+----------------------------+-----------+-------+---------------------------------------------------------------------------------------------------+---------+--------+---------+-------------------+
  5. | zone1 | observer | 100.81.152.114 | 36500 | _px_max_message_pool_pct | NULL | 40 | The maxinum percent of tenant memory that DTL message buffer pool can alloc memory. Range: [0,90] | TENANT | TENANT | DEFAULT | DYNAMIC_EFFECTIVE |
  6. | zone1 | observer | 100.81.152.114 | 36500 | _parallel_min_message_pool | NULL | 400M | DTL message buffer pool reserve the mininum size after extend the size. Range: [16M,8G] | TENANT | TENANT | DEFAULT | DYNAMIC_EFFECTIVE |
  7. +-------+----------+----------------+----------+----------------------------+-----------+-------+---------------------------------------------------------------------------------------------------+---------+--------+---------+-------------------+
  8. 2 rows in set (0.00 sec)
  9. OceanBase(root@oceanbase)>show parameters like '%dtl%';
  10. +-------+----------+----------------+----------+-----------------+-----------+-------+---------------+----------+---------+---------+-------------------+
  11. | zone | svr_type | svr_ip | svr_port | name | data_type | value | info | section | scope | source | edit_level |
  12. +-------+----------+----------------+----------+-----------------+-----------+-------+---------------+----------+---------+---------+-------------------+
  13. | zone1 | observer | 100.81.152.114 | 36500 | dtl_buffer_size | NULL | 64K | to be removed | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE |
  14. +-------+----------+----------------+----------+-----------------+-----------+-------+---------------+----------+---------+---------+-------------------+
  15. 1 row in set (0.01 sec)