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. hdu-3401-Trade-单调队列优化的DP

    单调队列入门题... dp[i][j]:第i天.手中拥有j个股票时,获得的最大利润. 若第i天不买不卖:dp[i][j]=max(dp[i][j],dp[i-1][j]); 若第i天买         ...

  2. node--20 moogose demo2

    db.js /** * Created by Danny on 2015/9/28 16:44. */ //引包 var mongoose = require('mongoose'); //创建数据库 ...

  3. node18---Mongoose

    二.索引index 数据库中,根据一个字段的值,来寻找一个文档,是很常见的操作.比如根据学号来找一个学生. 这个学号,是唯一的,只要有学号,就能唯一确认一个学生的文档.学号这个属性,就非常适合建立索引 ...

  4. hihoCoder 1403 后缀数组 重复旋律

    思路: 后缀数组 第一次写 留个模板吧 先求出后缀数组,问题转换为询问height数组中连续k-1个数的最小值的最大值,单调队列扫描一遍即可.-yousiki 手懒用得STL //By SiriusR ...

  5. BZOJ 3339 线段树

    思路: 考虑离线处理 显然 l固定时 r越大 ans越大 那我们不妨按照l从小到大排序 l->l+1的时候 l到next[l]这段区间都跟a[l]取min就好了 搞颗线段树维护一下 //By S ...

  6. PostgreSQL 数据库性能调优的注意点

    PostgreSQL提供了一些性能调优的功能.主要有如下几个方面.1.使用EXPLAIN   EXPLAIN命令可以查看执行计划,这个方法是我们最主要的调试工具. 2.及时更新执行计划中使用的统计信息 ...

  7. js中es5 使用call方法继承实现 1.0

    function Parent(name){ this.name = name; this.showMess = function(){ return this.name; } } Parent.pr ...

  8. span文本自动换行

    .span{ word-wrap: break-word; word-break: break-all; overflow: hidden; }

  9. java上传文件工具类

    这个是之前整理之前所学时与使用java向邮箱发送邮件一块找到的,一起贴出来供大家参考: import java.awt.image.BufferedImage; import java.io.File ...

  10. POJ-3436 ACM Computer Factory 最大流 为何拆点

    题目链接:https://cn.vjudge.net/problem/POJ-3436 题意 懒得翻,找了个题意. 流水线上有N台机器装电脑,电脑有P个部件,每台机器有三个参数,产量,输入规格,输出规 ...