8.4 提升性能

从一开始考虑pgbouncer的时候,性能就是一个关键的因素。为了确保高性能,有些问题必须认真对待。首先,确保参与您设置的所有节点相互之间的距离较近。这对于降低网络往返时间有很多的帮助,从而提升性能。减少调用fork()的开销和为了性能的提升而付出网络时间是没有必要的。正如在大多数情况下,降低网络时间和延迟绝对是一笔巨大的开销。

基本上,pgbouncer可以放到一台专用的pgbouncer服务器上,直接放在一个数据库节点,或者放在web服务器上。一般来说,建议不要把数据库基础设施放到web服务器上。如果您有更大的设置,专用服务器可能是一个不错的选择。

经常被遗忘的另外一个问题是和池本身相关的的问题。正如我们已经描述的,pgbouncer的思想是加速获得一个数据库连接的过程。然而,要是池没有足够的连接又怎么样呢?如果没有多余的数据库连接,将会发生什么?那么,您将会花费大量的时间通过在后端派生它们来创建这些连接。要解决这个问题,建议为min_pool_size设置一个合理的值。如果许多连接在同一时间被创建(例如,如果一个web服务器重新启动),这一点尤为重要。 务必确保您的池大小合理,以维持高性能(就创建新连接而言)。

[ min_pool_size的完美的值将取决于您正在运行的应用的类型。但是,我们的经验是使用比默认值较高的值。]

8.4.1 简单的 benchmark

在本章中,我们已经介绍,如果应用必须创建许多短连接,使用pgbouncer非常有利。为了证明我们的观点,我们编写了一个极端的例子。我们的目标是运行一个测试,做的越少越好—我们只是要测量打开一个连接我们需要多少实际。要做到这一点,我们安装了一个只有一个CPU的虚拟机。测试本身会使用pgbench(一个广泛用于检测PostgreSQL的contrib模块)。

我们可以很容易地创建我们自己的一个测试数据库:

pgbench -i p1

然后,我们可以写一个我们自己的简单的SQL命令,它应该被重复地执行:

SELECT 1;

现在 ,我们可以对我们的标准PostgreSQL安装运行一个极端的测试:

hs@VM:test$ pgbench -t 1000 -c 20 -S p1 -C -f select.sql

starting vacuum...end.

transaction type: Custom query

scaling factor: 1

query mode: simple

number of clients: 20

number of threads: 1

number of transactions per client: 1000

number of transactions actually processed: 20000/20000

tps = 67.540663 (including connections establishing)

tps = 15423.090062 (excluding connections establishing)

我们要运行20个并发连接。它们都执行1000个单个事务。–C表明,每个单个事务之后,检测将会关闭打开的连接并创建一个新的连接。这是一个没有池(每一页可能是一个单独的连接)的web服务器的一个典型的情况。

现在,请记住,这个测试的设计看起来很丑陋。我们可以看到,保持连接活着将确保在我们的单个CPU的虚拟机上我们可以每秒执行大约15,000个事务。如果每次我们必须分出一个连接,我们将下降到每秒67个事务—正如我们之前所说的:这类开销是值得深思的。

现在,让我们通过pgbouncer连接到PostgreSQL来重复那个测试:

hs@VM:test$ pgbench -t 1000 -c 20 -S p1 -C -f select.sql -p 6432

starting vacuum...end.

transaction type: Custom query

scaling factor: 1

query mode: simple

number of clients: 20

number of threads: 1

number of transactions per client: 1000

number of transactions actually processed: 20000/20000

tps = 1013.264853 (including connections establishing)

tps = 2765.711593 (excluding connections establishing)

正如您可以看到的,我们的吞吐量已经上升到了每秒1013个事务。这是之前的15倍—确实是一个不错的收益。

然而,我们也必须看到,我们的性能水平已经下降了,如果我们没有管理到pgbouncer的连接。请记住,bouncer,检测工具和PostgreSQL都运行在相同的单个CPU上。这在这里确实有影响(在虚拟化环境中,上下文开关不太便宜)。

请记住,这是一个极端的例子—如果您用较长的事务重复这个相同的测试,您将会看到差距将会逻辑地变得更小。我们设计的例子已经表明了我们的观点。

PostgreSQL Replication之第八章 与pgbouncer一起工作(4)的更多相关文章

  1. PostgreSQL Replication之第八章 与pgbouncer一起工作(5)

    8.5 维护 pgbouncer 除了我们在本章已经说明的,pgbouncer有一个很好的能够执行基本管理和监控任务的交互式管理界面. 它是如何工作的呢?pgbouncer提供给您一个虚假的称为pgb ...

  2. PostgreSQL Replication之第八章 与pgbouncer一起工作(3)

    8.3 配置您的第一个pgbouncer设置 一旦我们已经完成了pbouncer的编译与安装,我们可以容易地启动它.要做到这一点,我们已经在一个本地实例(p0和p1) 建立了两个数据库.在本例中,执行 ...

  3. PostgreSQL Replication之第八章 与pgbouncer一起工作(2)

    8.2 安装pgbouncer 在我们深入细节之前,我们将看看如何安装pgbouncer.正如PostgreSQL一样,您可以采取两种途径.您可以安装二进制包或者直接从源代码编译.在我们的例子中,我们 ...

  4. PostgreSQL Replication之第八章 与pgbouncer一起工作(1)

    当您在使用大规模的设施工作,可能有时候,您必须处理许多并发打开的连接.没有人会使用十台服务器来为两个并发用户提供服务--在许多情况下,这根本没有意义.大量的设施通常会处理成百上千的并发连接.引入连接池 ...

  5. PostgreSQL Replication之第九章 与pgpool一起工作(1)

    在前面的章节中,我们已经能够深入地理解了pgbouncer,同时也学会了如何使用它来尽可能地优化复制设置.在本章我们将了解一个经常被称作与pgbouncer相对应的工具.尽管pgpool的思想与pgb ...

  6. PostgreSQL Replication之第九章 与pgpool一起工作(7)

    9.7 处理故障转移和高可用 可以使用pgpool来解决的一些明显的问题是高可用性和故障转移.一般来讲,有使用pgpool或者不使用pgpool可以用来处理这些问题的各种方法. 9.7.1 使用Pos ...

  7. PostgreSQL Replication之第九章 与pgpool一起工作(6)

    9.6 运行pgpool和流复制 pgpool也可以和除了语句级别的复制之外的流复制一起使用.一个完美的方案是使用PostgreSQL的板载复制和仅仅使用pgpool的负载均衡与连接池. 实际上,这样 ...

  8. PostgreSQL Replication之第九章 与pgpool一起工作(4)

    9.4 设置复制和负载均衡 要配置pgpool,我们可以简单地使用一个包含一种典型的配置信息的已经存在的样本文件,将它拷贝到我们的配置目录并修改之: $ cp /usr/local/etc/pgpoo ...

  9. PostgreSQL Replication之第九章 与pgpool一起工作(3)

    9.3 理解pgpool的架构 一旦我们安装了pgpool,是时候来讨论软件架构了.从一个用户的角度看,pgpool就像一个 正常的数据库服务器,您可以想连接任何其他服务器一样连接到它: pgpool ...

随机推荐

  1. Oracle Table Function

    Oracle Table Function在Oracle9i时引入.完美的兼容了view和存储过程的长处: 应用举例: 1.Table()函数: set feedback off create or ...

  2. Java虚拟机的类载入机制

    Java虚拟机类载入过程是把Class类文件载入到内存.并对Class文件里的数据进行校验.转换解析和初始化,终于形成能够被虚拟机直接使用的java类型的过程. 在载入阶段,java虚拟机须要完毕下面 ...

  3. dev c++与VC assist的杂记

    最近要处理一些数据,于是把旧本拿出来用用.但是发现旧本运行速度很慢. 分析之后发现是瑞星的老版本程序里面加了游戏的云存储节点的注册表键.果断把该键删了之后,CPU使用率从66%以上降到24%左右. 然 ...

  4. js字符串日期yyyy-MM-dd转化为date示例代码

    最近遇到一个问题,就是获取表单中的日期往后台通过json方式传的时候,遇到Date.parse(str)函数在ff下报错: NAN 找了些资料,发现是由于Date.parse()函数对日期格式有要求: ...

  5. MSSQL读取xml字符串到临时表

    DECLARE @hdoc int DECLARE @doc xml SET @doc ='<CityValueSet> <CityItem> <CityId>20 ...

  6. 【参考】.class文件的JDK编译版本查看

    使用 UltraEdit  打开 .class 文件,第一行内容: 00000000h: CA FE BA BE 00 00 00 32 00 A9 07 00 02 01 00 37 ; 漱壕... ...

  7. 「JavaSE 重新出发」02. 数据类型与运算符

    「TOC」 Java 程序基本要求 Java 数据类型 基本数据类型 复合数据类型 运算符 逻辑运算符 位运算符 运算符优先级 Java 程序基本要求 public class : 一个 Java 文 ...

  8. Caffe Loss分析

    Caffe_Loss 损失函数为深度学习中重要的一个组成部分,各种优化算法均是基于Loss来的,损失函数的设计好坏很大程度下能够影响最终网络学习的好坏.派生于 \(LossLayer\),根据不同的L ...

  9. 一个php处理图片裁剪,压缩,水印的小代码

    插件地址:https://github.com/cigua/imagefilter

  10. 批量kill 某个用户session

    SELECT 'alter system kill session '''||SID || ',' || SERIAL#||''';'   FROM V$SESSION  where username ...