6. 其他因素对SMP性能的影响
除了资源因素外,还有一些因素也会对SMP并行性能造成影响。例如分区表中分区数据不均,以及系统并发度等因素。
- 数据倾斜对SMP性能的影响
当数据中存在严重数据倾斜时,并行效果较差。例如某表join列上某个值的数据量远大于其他值,开启并行后,根据join列的值对该表数据做hash重分布,使得某个并行线程的数据量远多于其他线程,造成长尾问题,导致并行后效果差。
- 系统并发度对SMP性能的影响
SMP特性会增加资源的使用,而在高并发场景下资源剩余较少。所以,如果在高并发场景下,开启SMP并行,会导致各查询之间严重的资源竞争问题。一旦出现了资源竞争的现象,无论是CPU、I/O、内存,都会导致整体性能的下降。因此在高并发场景下,开启SMP往往不能达到性能提升的效果,甚至可能引起性能劣化。
7. SMP 使用建议
- 使用限制
想要利用SMP提升查询性能需要满足以下条件:
系统的CPU、内存、I/O和网络带宽等资源充足。SMP架构是一种利用富余资源来换取时间的方案,计划并行之后必定会引起资源消耗的增加,当上述资源成为瓶颈的情况下,SMP无法提升性能,反而可能导致性能的劣化。在出现资源瓶颈的情况下,建议关闭SMP。
- 配置步骤
- 观察当前系统负载情况,如果系统资源充足(资源利用率小于50%),执行步骤2;否则退出。
- 设置query_dop=1(默认值),利用explain打出执行计划,观察计划是否符合SMP适用场景与限制小节中的适用场景。如果符合,进入步骤3。
- 设置query_dop=value,不考虑资源情况和计划特征,强制选取dop为1或value。
- 在符合条件的查询语句执行前设置合适的query_dop值,在语句执行结束后关闭query_dop。举例如下。
MogDB=# SET query_dop = 4; MogDB=# SELECT COUNT(*) FROM t1 GROUP BY a; ...... MogDB=# SET query_dop = 1; Copy
说明:
资源许可的情况下,并行度越高,性能提升效果越好。
SMP并行度支持会话级设置,推荐客户在执行符合要求的查询前,打开smp,执行结束后,关闭smp。以免在业务峰值时,对业务造成冲击。
5. query_dop
- 参数说明: 用户自定义的查询并行度。
- 该参数属于USERSET类型参数,请参考表GUC参数分类中对应设置方法进行设置。
- 取值范围: 整型,1~64。打开固定SMP功能,系统会使用固定并行度。
说明: 在开启并行查询后,请保证系统CPU、内存、网络等资源充足,以达到最佳效果。
- 默认值: 1
三、测试
1. 构建测试数据
[omm@node1 ~]$ gsql -d postgres -p26000 -r gsql ((openGauss 3.1.0 build 2c0ccaf9) compiled at 2022-09-25 19:32:58 commit 0 last mr ) Non-SSL connection (SSL connection is recommended when requiring high-security) Type "help" for help. openGauss=# create table test (id int,en varchar(200)); CREATE TABLE Time: 9.511 ms openGauss=# insert into test values(generate_series(1,10000000),md5(random()::text)); INSERT 0 10000000 Time: 25792.555 ms openGauss=# \d+ List of relations Schema | Name | Type | Owner | Size | Storage | Description --------+------+-------+-------+--------+----------------------------------+------------- public | test | table | omm | 657 MB | {orientation=row,compression=no} | (1 row)
2. CPU为16c时
- query_dop=1
openGauss=# \timing Timing is on. openGauss=# set query_dop=1; SET Time: 0.322 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 1603.324 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 673.562 ms
- query_dop=4
openGauss=# set query_dop=4; SET Time: 0.306 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 210.510 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 217.283 ms
- query_dop=8
openGauss=# set query_dop=8; SET Time: 0.258 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 165.018 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 157.060 ms
- query_dop=16
openGauss=# set query_dop=16; SET Time: 0.274 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 173.323 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 163.022 ms
3. CPU为8c
- query_dop=1
openGauss=# set query_dop=1; SET Time: 0.242 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 3426.668 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 990.474 ms
- query_dop=4
openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 349.525 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 381.206 ms
- query_dop=8
openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 283.316 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 277.508 ms
query_dop=16
openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 189.836 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 188.878 ms
4. CPU为4c
- query_dop=1
openGauss=# \timing Timing is on. openGauss=# set query_dop=1; SET Time: 0.314 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 3119.898 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 972.142 ms
- query_dop=4
openGauss=# set query_dop=4; SET Time: 0.267 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 380.970 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 337.972 ms
- query_dop=8
openGauss=# set query_dop=8; SET Time: 0.297 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 258.877 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 266.643 ms
- query_dop=16
openGauss=# set query_dop=16; SET Time: 0.306 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 224.949 ms openGauss=# select * from test where id=999; id | en -----+---------------------------------- 999 | 4b9d69053e3de0ed30e1b9e3283f7270 (1 row) Time: 216.097 ms
汇总
并行度 | 16c SQL执行时间 | 8c SQL 执行时间 | 4c SQL执行时间 |
query_dop=1 | 660 ms | 990 ms | 972 ms |
query_dop=4 | 215 ms | 349 ms | 380 ms |
query_dop=8 | 165 ms | 277 ms | 258 ms |
query_dop=16 | 166 ms | 188 ms | 224 ms |
query_dop=32 | 200 ms | 243 ms | 305 ms |
query_dop=64 | 325 ms | 387 ms | 440 ms |