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. mysql数据库连接工具类C3P0

    package com.dl.network_flow.db; import java.sql.Connection; import java.sql.PreparedStatement; impor ...

  2. [luogu P4197] Peaks 解题报告(在线:kruskal重构树+主席树 离线:主席树+线段树合并)

    题目链接: https://www.luogu.org/problemnew/show/P4197 题目: 在Bytemountains有N座山峰,每座山峰有他的高度$h_i$.有些山峰之间有双向道路 ...

  3. Redis常用命令速查 <第二篇>【转】

    一.Key Key命令速查: 命令 说明 DEL 删除给定的一个或多个 key,不存在的 key 会被忽略,返回值:被删除 key 的数量 DUMP 序列化给定 key,返回被序列化的值,使用 RES ...

  4. asp.net 汉字转拼音的车祸现场

    asp.net 汉字转拼音 需求背景: 昨天遇到个问题,就是面对系统中集中性的要设置大批量的用户设置默认的用户名,密码,权限(角色),同时要求用户名是姓名的全拼,回头看看旁边那个哥们撸胳膊挽袖子准备一 ...

  5. Android开发中,9-patch (九宫格)图片作为背景带来的问题

    9-patch 为了解决不同分屏下的图片适应性,对图片做了padding,而在android中,要给一个控件设置背景图,最终是要调用 setBackgroundDrawable  方法来设置图片资源, ...

  6. rman参数

    rman 参数 RMAN> show all; 参数是存放在控制文件中的 改参数:(直接改) eg: CONFIGURE RETENTION POLICY TO REDUNDANCY 3 参数: ...

  7. Servlet中文乱码原因 解决 Get 和 Post 和客户端

    一.Get方式的中文乱码 1) 使用如下页面表单内容: <form action="http://127.0.0.1:8080/day07/params" method=&q ...

  8. 有趣的console

    博文第一篇,就以前端调试的“座上客”---console开始

  9. POJ 3134 Power Calculus (迭代剪枝搜索)

    题目大意:略 题目里所有的运算都是幂运算,所以转化成指数的加减 由于搜索层数不会超过$2*log$层,所以用一个栈存储哪些数已经被组合出来了,不必暴力枚举哪些数已经被搜出来了 然后跑$iddfs$就行 ...

  10. centos7 jumpserver 部署和使用手册(一)

    测试推荐环境 CPU: 64位双核处理器 内存: 4G DDR3 数据库:mysql 版本大于等于 5.6 mariadb 版本大于等于 5.5.6 环境 系统: CentOS 7.2 IP: 192 ...