前言
中启乘数科技是一家专业的PostgreSQL和Greenplum数据库服务提供商,专注于数据库极致的性能,当前PostgreSQL 14beta1已经发布,其中一个激动人心的特性就是当数据库有海量连接时,其它连接的性能基本不下降。下面我们通过实际的测试来说明。
测试环境和方法
本着不详细介绍测试方法和测试环境的测试都是耍流氓的精神,我们把测试环境和方法详细介绍如下:
我们准备在一台物理机器上准备两套环境,一套是PostgreSQL 13.3,另一套是PostgreSQL 14beta1。
物理机器的硬件为2路服务器,CPU为:Intel(R) Xeon(R) Silver 4210R CPU @ 2.40GHz,内存为256GB。
我们使用 initdb 命令初始化数据库,然后修改最大连接数:

其它参数都不修改,默认shared_buffer为128MB。
然后用pgbench造2千万行数据:

PostgreSQL 14与PostgreSQL 13在造数据上花的时间差不多,稍微快一点:
PostgreSQL 14:

PostgreSQL 13:

测试方法的思路是我们给数据库建9000个执行pg_sleep(2000)的空闲连接,然后再用pgbench做只读压力测试。
建9000个pg_sleep(2000)连接的方法为:
我们建一个sleep.sql的文件,内容如下:

然后执行下面的命令:

而我们压力测试的命令为:

实际测试
1.开启9000个空闲连接的测试
测试PostgreSQL 13.3
先开9000个执行pg_sleep()的连接:

然后压力测试:

测试PostgreSQL 14beta1
先开9000个执行pg_sleep()的连接:

然后压力测试:

可以看到在PostgreSQL 13中只能到达27万,而在PostgreSQL 14中就可以达到51万了,有近翻倍的性能提升。
2.极端测试: 20000万个空闲连接
PostgreSQL 13.3

PostgreSQL 14beta1

3.进一步的测试
我们不建空闲连接,直接不断的改变连接数,看看解结果是怎样的:

压测时只改变上面的 -c 的连接数。测试的过程这里就不写出来,直接给出结果:
| 连接数 | PostgreSQL 13.3 | PostgreSQL 14beta1 |
| 64 | 496841 | 513140 |
| 128 | 528556 | 552778 |
| 256 | 475030 | 497435 |
| 1000 | 347863 | 402369 |
| 5000 | 205857 | 310090 |
| 10000 | 124371 | 248701 |

结论
PostgtreSQL 14可以支持大量的空闲连接,这些空闲连接对执行的SQL的性能影响很小,但在PostgreSQL 13,会有很大的影响。所以从PostgreSQL 14之后,数据库可以支持上万个空闲连接,以前为了支持很多连接需要上连接池,现在可以不用了。
原理简介
PostgreSQL 14主要是优化了 GetSnapshotData() 的性能,原先是随连接数增加,这个函数的性能是线性下降,从PostgreSQL 14之后就不是了。这个优化总共提交了7个PATCH,如果想进一步了解的同学可以见:
snapshot scalability: Don’t compute global horizons while building snapshots.
snapshot scalability: Move PGXACT->xmin back to PGPROC.
snapshot scalability: Move PGXACT->vacuumFlags to ProcGlobal->vacuumFlags.
snapshot scalability: Move subxact info to ProcGlobal, remove PGXACT.
snapshot scalability: Introduce dense array of in-progress xids.
snapshot scalability: cache snapshots using a xact completion counter.
Fix race condition in snapshot caching when 2PC is used.
本站文章,未经作者同意,请勿转载,如需转载,请邮件customer@csudata.com.




