openGauss并行查询测试(二)

简介: openGauss并行查询测试

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
目录
相关文章
|
20天前
|
测试技术 API 开发者
Python 魔法:打造你的第一个天气查询小工具自动化测试框架的构建与实践
【8月更文挑战第31天】在这篇文章中,我们将一起踏上编程的奇妙旅程。想象一下,只需几行代码,就能让计算机告诉你明天是否要带伞。是的,你没有听错,我们将用Python这把钥匙,解锁天气预报的秘密。不论你是编程新手还是想拓展技能的老手,这篇文章都会为你带来新的视角和灵感。所以,拿起你的键盘,让我们一起创造属于自己的天气小工具吧!
|
1月前
|
JavaScript 前端开发 应用服务中间件
【qkl】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
|
4月前
|
测试技术
Appium 并行测试多个设备
Appium 并行测试多个设备
131 0
|
10月前
|
自然语言处理 搜索推荐 Java
【网安AIGC专题10.25】9 LIBRO方法(ICSE2023顶会自动化测试生成):提示工程+查询LLM+选择、排序、后处理(测试用例函数放入对应测试类中,并解决执行该测试用例所需的依赖)
【网安AIGC专题10.25】9 LIBRO方法(ICSE2023顶会自动化测试生成):提示工程+查询LLM+选择、排序、后处理(测试用例函数放入对应测试类中,并解决执行该测试用例所需的依赖)
235 0
|
10月前
|
关系型数据库 MySQL 测试技术
软件测试|MySQL BETWEEN AND:范围查询详解
软件测试|MySQL BETWEEN AND:范围查询详解
337 0
|
10月前
|
关系型数据库 MySQL 测试技术
软件测试|MySQL WHERE条件查询详解:筛选出需要的数据
软件测试|MySQL WHERE条件查询详解:筛选出需要的数据
53 0
|
10月前
|
关系型数据库 MySQL 测试技术
软件测试|MySQL ORDER BY详解:排序查询的利器
软件测试|MySQL ORDER BY详解:排序查询的利器
211 0
|
SQL 测试技术
软件测试|SQL指定查询条件,WHERE的使用
软件测试|SQL指定查询条件,WHERE的使用
119 1
|
8天前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
53 7
Jmeter实现WebSocket协议的接口测试方法
|
8天前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
35 3
快速上手|HTTP 接口功能自动化测试