您的位置:今日热点 > 人工智能 > 大数据 > 一文了解PG空闲连接对性能的影响

一文了解PG空闲连接对性能的影响

【今日热点网】

PG空闲毗邻对性能的影响

该系列的第一篇为:PG空闲毗邻的资源消耗讨论PG若何治理毗邻以及空闲毗邻若何消耗内存和CPU。本文讨论空闲毗邻对PG性能的影响。

事务率影响

PG获取数据的时刻,首先看请求页在没在共享内存。若是共享内存没有请求页,则从操作系统缓存取,若是也没有,则需要请求磁盘上的数据页。共享内存最快,操作系统缓存次之,磁盘最慢。随着PG毗邻的增进,操作系统缓存的可用内存就会减小,从而从操作系统缓存中移除数据页。下次再举行数据页查询时就会从磁盘上请求,因此性能变得更慢。

若是PG实例的空闲内存处于低水位,就会使用swap。这也是位于磁盘上,因此也很慢。使用swap空间可辅助释放一些内存,然则若是swapped 页再次被OS请求时,会被读回,导致IO的增添。更多信息请查看swap治理:https://www.kernel.org/doc/gorman/html/understand/understand014.html

可用内存对性能的影响取决于事情负载、数据集、总共的可用内存。若是数据集比总可用内存小,空闲内存的削减不会有显著影响,若数据集比总可用内存还大,就会发生伟大影响。

性能测试

下面小节显示了通过pgbench举行的性能测试。测试中Amazon RDS for PG实例为db.m5.large,2vCPU,8GB内存。1个EBS的IO为3000IOPS。

每个测试都有两个阶段,第一阶段pgbench执行1个小时,没有其他事情负载。这个提供了一个基准事务率。

第二个阶段,再次执行pgbench前打开1000个毗邻,每个毗邻从information_schema表获取一行数据。下面是步骤:

1)打开一个毗邻

2)获取所有表名及information_schema视图:

 SELECT table_schema||'.'||table_name as relname from information_schema.tables WHERE table_schema='information_schema';

3)循环执行select:

 SELECT * FROM information_schema.columns LIMIT 1;

4)对于1000个毗邻重复以上步骤

5)事务提交后不举行断开,保持空闲状态

重启实例后,内存中没有缓存任何数据页。第一次执行pgbench会加载请求的数据页到内存,随后再次执行pgbench,cache中的数据页可以重用,此时不再需要从磁盘加载。

为了最小化页缓存的影响,在执行测试案例前执行一个初始步骤。下图显示了打开1000个毗邻时,实例内存时若何从4.88GB下降到90MB的。

正如前系列先容,虽然毗邻是空闲的,他们也会消耗内存和CPU资源。这个效果显示空闲毗邻对性能的影响。

事务率测试1:尺度pgbench

第一个测试中,使用尺度设置执行100个客户端毗邻,效果:

transaction type:

1000个毗邻下,效果:

transaction type:

效果解释,TPS从1249下降到1140,有8.7%的下降。

事务率测试2:select-only

由于空闲毗邻消耗了内存减小了页缓存可用内存,以是这些空闲毗邻对读的影响尤为显著。为测试这点,使用-S设置运行pgbench,使用内置的select only剧本。效果:

transaction type:

1000个空闲毗邻下:

transaction type:

TPS从1969下降到1610,有18.2%的下降。

事务率测试3:custom pgbench

执行剧本:

set nbranches :scaleset naccounts 100000 * :scaleset aid random(1, :naccounts)set bid random(1, :nbranches)BEGIN;SELECT * FROM pgbench_accounts WHERE aid >= :aid AND aid < (:aid 5000) AND bid=:bid LIMIT 1;END;

剧本中每个事物从pgbench_accounts表读取5000行数据,然后仅返回1条。效果:

transaction type: pgbench_script.sqlscaling factor: 5000query mode: simplenumber of clients: 100number of threads: 2duration: 600 snumber of transactions actually processed: 227484latency average = 264.140 mstps = 378.586790 (including connections establishing)tps = 378.592772 (excluding connections establishing)

1000个空闲毗邻下,效果为:

transaction type: pgbench_script.sqlscaling factor: 5000query mode: simplenumber of clients: 100number of threads: 2duration: 600 snumber of transactions actually processed: 124114latency average = 484.485 mstps = 206.404854 (including connections establishing)tps = 206.507645 (excluding connections establishing)

效果显示TPS从378下降到206,有46%的下降。通过Amazon RDS Performance Insights可以看到引擎wait events详细信息。下面两个图显示了DataFileRead守候事宜中花费时间最多的。即守候从表数据文件中读取数据。

下图显示了Amazon CloudWatch指标中的读负载:

第一次执行时读为87MB/s,第二次1000个毗邻下,增进到117MB/s。空闲毗邻消耗了操作系统内存,导致OS cache变小。因此需要从磁盘读取更多数据页,从而导致性能的衰减。

毗邻池

毗邻池可辅助减小数据库毗邻带来的影响。可以使用pgbouncer或者Amazon RDS Proxy。这些毗邻池可以限制毗邻数目。

Pgbouncer

Pgbouncer是轻量级的毗邻池组件,支持下面三种模式:

Session mode:每个应用毗邻绑定到一个数据库毗邻上。若是毗邻处于空闲状态,pgbouncer不能将它给其他应用毗邻重用。

Transaction mode:一个事务完成后,该毗邻就可以重用

Statement mode:一个SQL语句完成后就可以将该毗邻给其他客户端重用。

大多数应用中,使用transaction mode可以提供最优效果。下面测试pgbouncer设置了最大5000客户端毗邻,但我们的测试中最大毗邻设置为200.pgbench运行在pgbouncer pool中。效果:

transaction type: pgbench_script.sqlscaling factor: 5000query mode: simplenumber of clients: 100number of threads: 2duration: 600 snumber of transactions actually processed: 227064latency average = 264.600 mstps = 377.928241 (including connections establishing)tps = 377.928476 (excluding connections establishing)

运行历程中,可以查看毗邻状态:

pgbouncer=# show pools;-[ RECORD 1 ]-----------database   | pgbenchuser       | postgrescl_active  | 100cl_waiting | 0sv_active  | 100sv_idle    | 0sv_used    | 0sv_tested  | 0sv_login   | 0maxwait    | 0maxwait_us | 0pool_mode  | transaction

Pool状态显示有100个客户端毗邻(cl_active)从而有100个活跃server毗邻(sv_active)。第二次执行,打开1000个毗邻,并处于空闲状态。Pooler不需要维护任何服务端毗邻:

pgbouncer=# show pools;-[ RECORD 1 ]-----------database   | pgbenchuser       | postgrescl_active  | 1000cl_waiting | 0sv_active  | 0sv_idle    | 1sv_used    | 0sv_tested  | 0sv_login   | 0maxwait    | 0maxwait_us | 0pool_mode  | transaction

1000个空闲毗邻下,执行pgbench:

transaction type: pgbench_script.sqlscaling factor: 5000query mode: simplenumber of clients: 100number of threads: 2duration: 600 snumber of transactions actually processed: 226827latency average = 264.935 mstps = 377.451418 (including connections establishing)tps = 377.451655 (excluding connections establishing)

下面显示使用毗邻池是,性能没有影响:

pgbouncer=# show pools;-[ RECORD 1 ]-----------database   | pgbenchuser       | postgrescl_active  | 1100cl_waiting | 0sv_active  | 100sv_idle    | 0sv_used    | 0sv_tested  | 0sv_login   | 0maxwait    | 0maxwait_us | 0pool_mode  | transaction

总共有1100个客户端毗邻,然则仅有100个服务端毗邻活跃。

该测试,RDS实例有2个CPU,因此100个历程并行执行,导致大量上下文切换,从而造成性能衰减。Pgbouncer设置最多20个数据毗邻下性能:

transaction type: pgbench_script.sqlscaling factor: 5000query mode: simplenumber of clients: 100number of threads: 2duration: 600 snumber of transactions actually processed: 256267latency average = 234.286 mstps = 426.828543 (including connections establishing)tps = 426.828801 (excluding connections establishing)

获得了个更高的TPS,状态:

pgbouncer=# show pools;-[ RECORD 1 ]-----------database   | pgbenchuser       | postgrescl_active  | 20cl_waiting | 80sv_active  | 20sv_idle    | 0sv_used    | 0sv_tested  | 0sv_login   | 0maxwait    | 0maxwait_us | 125884pool_mode  | transaction

只有20个客户端毗邻活跃。剩下的80个毗邻守候被分配。更多的毗邻并不意味着更多的吞吐量。较少的客户端毗邻有助于上下文切换和资源争用,从而提高总体性能。

总结

毗邻数多并不意味着高吞吐。增添毗邻数,会增添上下文切换和资源争用,从而影响性能。

性感可爱丝袜女郎高清写真
High definition photo of sexy and lovely stockings girl
上一篇:腾讯2021sigmod论文Spitfire分析
下一篇:从金融科技到数据治理,如何才能发挥监管沙盒的效用?

您可能喜欢