parallel_servers_target 这个参数是一个租户级系统变量,表示租户在每个节点上可申请的并行执行线程数量。默认值是 MIN CPU * px_workers_per_cpu_quota。
OB 官网文档里对这个参数含义的介绍比较模糊,说用于设置每个 Server 上的并行查询排队条件。大家可以简单理解成当这个参数指定的线程资源耗尽时,并行执行请求需要排队即可。
obclient> show variables like 'parallel_servers_target';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| parallel_servers_target | 10 |
+-------------------------+-------+
1 row in set (0.00 sec)
obclient> show parameters like 'px_workers_per_cpu_quota'\G
*************************** 1. row ***************************
zone: zone1
svr_type: observer
svr_ip: 1.2.3.4
svr_port: 22602
name: px_workers_per_cpu_quota
data_type: INT
value: 10
info: the ratio(integer) between the number of system allocated px workers vs the maximum number of threads that can be scheduled concurrently. Range: [0, 20]
section: TENANT
scope: TENANT
source: DEFAULT
edit_level: DYNAMIC_EFFECTIVE
default_value: 10
isdefault: 1
1 row in set (0.02 sec)
auto dop 的目的是优化慢 SQL 的 rt,但是会利用更多的线程资源。这里最大的问题就是会出现少量 AP 大查询和大量 TP 小查询(小 DML)之间的资源争用。AP 慢查询如果通过开 auto dop 占用大量线程并行执行,在一定程度上,会影响分配给小查询的资源。
auto dop 不是神仙,肯定感知不到用户心中的 SQL 优先级,怎么办?那就需要人告诉数据库,SQL 的优先级是怎样的?
解决方法就是在租户内,让小查询和大查询各有各的资源组,用资源组(resource group)去进行隔离。OceanBase 在租户内,支持两种粒度的资源隔离,一种是 User 级,一种是 SQL 级。可以通过配置各个 resource group 的 max cpu,让不同 User 或者不同类型的 SQL 使用不同资源组的资源。