[TOC] # 并行查询的参数调优 Oceanbase 数据库并行查询(PX)的参数决定了并行查询的速度,主要包括并行度和 EXCHANGE 相关参数 。 ## 并行度参数 并行度相关参数主要决定每个 query 并发时的 worker 个数。 <table data-tag="table" id="table-cg4-bq4-5sk" class="table"><colgroup width="144" span="1" data-tag="col" id="col-8v7-cg1-dle" colwidth="1*" colnum="1" colname="col1" style="width:20%" class="col"></colgroup><colgroup width="144" span="1" data-tag="col" id="col-o1b-xwo-bdw" colwidth="1*" colnum="2" colname="col2" style="width:20%" class="col"></colgroup><colgroup width="144" span="1" data-tag="col" id="col-bg5-1yb-par" colwidth="1*" colnum="3" colname="col3" style="width:20%" class="col"></colgroup><colgroup width="144" span="1" data-tag="col" id="col-pu3-223-jng" colwidth="1*" colnum="4" colname="col4" style="width:20%" class="col"></colgroup><colgroup width="144" span="1" data-tag="col" id="col-d86-g9v-277" colwidth="1*" colnum="5" colname="col5" style="width:20%" class="col"></colgroup><thead id="thead-x5n-jrf-mwm" class="thead"><tr id="tr-u0c-fxb-px1"><th id="td-0a8-l8p-3jj"><p id="p-x59-hcf-k8j"><b>参数名称</b></p></th><th id="td-82a-og0-x4l"><p id="p-ocg-9qq-zjl"><b>描述</b></p></th><th id="td-qoo-13d-540"><p id="p-8l3-7bz-6zg"><b>取值范围</b></p></th><th id="td-h9k-aue-j8s"><p id="p-0kl-1h2-s1k"><b>默认值</b></p></th><th id="td-obu-nad-x2p"><p id="p-q68-yfp-1so"><b>配置建议</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-fih-veo-q6s" class="tbody"><tr data-tag="tr" id="tr-i9g-0bh-pvf" class="tr"><td data-tag="td" id="td-71o-pmq-0b3" class="td"><p id="p-0pt-w0r-xb9">parallel_max_servers</p></td><td data-tag="td" id="td-5p1-dtu-hfc" class="td"><p data-tag="p" id="p-3ot-ayr-ti7" class="p">控制每个服务器最大的并行执行线程个数,所有PX worker 加起来不能超过该值。</p></td><td data-tag="td" id="td-kal-v8l-7lk" class="td"><p id="p-tu8-lrt-pwj">[0, 1800]</p></td><td data-tag="td" id="td-zqa-lse-hy7" class="td"><p id="p-ssw-djs-ukl">10(目前会根据 CPU 个数计算得到,以实际大小为准)</p></td><td data-tag="td" id="td-qhw-lds-ltr" class="td"><p id="p-lwa-0fk-upv">该参数主要是控制 PX 场景下所有 PX worker 总数,建议值为可用 CPU个数的倍数关系。</p></td></tr><tr data-tag="tr" id="tr-5hp-8z6-lh4" class="tr"><td data-tag="td" id="td-pzf-xyi-xhp" class="td"><p data-tag="p" id="p-h5c-2hm-cz5" class="p">parallel_servers_target</p></td><td data-tag="td" id="td-bdq-fkf-7ux" class="td"><p data-tag="p" id="p-euo-ki0-buh" class="p">当 query 准备排队之前,控制检查 query 要求的并行度和已统计的 worker 总和是否超过该值。如果超过该值,则 query 需要排队,否则 query 继续执行。</p></td><td data-tag="td" id="td-q1q-qvb-vx5" class="td"><p id="p-mpk-77u-y9z">[0, 1800]</p></td><td data-tag="td" id="td-qwe-oty-waw" class="td"><p data-tag="p" id="p-ukh-3b0-l5p" class="p">10(目前会根据 CPU 个数计算得到,以实际大小为准)</p></td><td data-tag="td" id="td-enl-z3m-kea" class="td"><p data-tag="p" id="p-i5w-gbp-nrt" class="p">该参数主要是控制 PX 场景下,当 query 准备进行并行查询时,如果没有足够 worker 处理该 query,决定是否继续进行还是排队等待。</p></td></tr></tbody></table> `parallel_max_servers`参数用于控制最大的并发度,`parallel_servers_target`参数用来决策 query 在并行查询时是否排队,两者需要协同工作。如果只使用`parallel_max_servers`设置最大并行度,当查询过多时,会导致所有 worker 都被调度起来,导致 CPU 等资源紧张,查询性能下降。在 CPU 等资源有限的情况下,使用`parallel_servers_target`控制 query 进行排队可以提高整个并发的吞吐量。 可以通过`SHOW VARIABLES`来查看这些参数的值,如下例所示: ~~~ obclient>SHOW VARIABLES LIKE '%paral%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | ob_max_parallel_degree | 32 | | ob_stmt_parallel_degree | 1 | | parallel_max_servers | 5 | | parallel_servers_target | 4 | +-------------------------+-------+ 4 rows in set (0.00 sec) ~~~ **注意** `ob_stmt_parallel_degree`参数不需要设置,对 PX 框架无效。 ## EXCHANGE(Shuffle)参数 EXCHANGE(Shuffle)参数主要用来控制在每个 DFO 之间进行数据传输时的参数控制,也就是数据进行 shuffle 时的内存控制。Oceanbase 数据库将数据传输封装成了叫做 DTL(Data Transfer layer)的模块。 <table data-tag="table" id="table-2be-zd1-7ic" class="table"><colgroup width="144" span="1" data-tag="col" id="col-kzt-mcm-sdc" colwidth="1*" colnum="1" colname="col1" style="width:20%" class="col"></colgroup><colgroup width="144" span="1" data-tag="col" id="col-qih-0cl-mzv" colwidth="1*" colnum="2" colname="col2" style="width:20%" class="col"></colgroup><colgroup width="144" span="1" data-tag="col" id="col-8qt-wkc-z6k" colwidth="1*" colnum="3" colname="col3" style="width:20%" class="col"></colgroup><colgroup width="144" span="1" data-tag="col" id="col-y55-6o3-rxt" colwidth="1*" colnum="4" colname="col4" style="width:20%" class="col"></colgroup><colgroup width="144" span="1" data-tag="col" id="col-prn-8k0-4r1" colwidth="1*" colnum="5" colname="col5" style="width:20%" class="col"></colgroup><thead id="thead-s0c-yyx-s6j" class="thead"><tr id="tr-wrq-lfv-9sv"><th id="td-ijo-fud-ve0"><p id="p-wiz-w4p-al9"><b>参数名称</b></p></th><th id="td-56u-o9y-gp9"><p id="p-nv3-e5d-zaj"><b>描述</b></p></th><th id="td-43z-fsa-o8n"><p id="p-63p-8ee-nmv"><b>取值范围</b></p></th><th id="td-r13-d79-h92"><p id="p-yf7-9r9-agp"><b>默认值</b></p></th><th id="td-fo3-x91-qrx"><p id="p-5mf-rsu-a9l"><b>配置建议</b></p></th></tr></thead><tbody data-tag="tbody" id="tbody-0y9-c8v-52o" class="tbody"><tr data-tag="tr" id="tr-zxw-dcu-wm7" class="tr"><td data-tag="td" id="td-rp1-1ra-dzd" class="td"><p data-tag="p" id="p-sae-3h6-ww8" class="p">dtl_buffer_size</p></td><td data-tag="td" id="td-hxs-u17-0ax" class="td"><p data-tag="p" id="p-xmz-jf8-tkr" class="p">控制 EXCHANGE 算子之间(即transmit 和 receive 之间)发送数据时,每次发送数据的 buffer 的大小。即当数据达到了该值上限才进行发送,减少每行传输的代价。</p></td><td data-tag="td" id="td-vsr-ncf-vj1" class="td"><p id="p-666-39c-dr4">[0, 1800]</p></td><td data-tag="td" id="td-po5-5zu-pu3" class="td"><p id="p-yte-208-6k3">10(目前会根据 CPU 个数计算得到,以实际大小为准)</p></td><td data-tag="td" id="td-5u1-kj5-f75" class="td"><p data-tag="p" id="p-03k-950-ebr" class="p">PX 场景下,EXCHANGE 之间发送数据依赖于该参数大小,一般不需要调整该参数,如果是为了减少发送数据次数等可以尝试进行修改,一般不建议修改该值大小。</p></td></tr></tbody></table> 可以通过`SHOW PARAMETERS`来查看参数的值,如下例所示: ~~~ obclient>SHOW PARAMETERS LIKE '%dtl%'; +-------+----------+----------------+----------+-----------------+-----------+-------+---------------+----------+---------+---------+-------------------+ | zone | svr_type | svr_ip | svr_port | name | data_type | value | info | section | scope | source | edit_level | +-------+----------+----------------+----------+-----------------+-----------+-------+---------------+----------+---------+---------+-------------------+ | zone1 | observer | 100.81.152.114 | 36500 | dtl_buffer_size | NULL | 64K | to be removed | OBSERVER | CLUSTER | DEFAULT | DYNAMIC_EFFECTIVE | +-------+----------+----------------+----------+-----------------+-----------+-------+---------------+----------+---------+---------+-------------------+ 1 row in set (0.01 sec) ~~~