【问题标题】:PostgreSQL performance tuning and max connections (practically)PostgreSQL 性能调优和最大连接数(实际)
【发布时间】:2017-08-19 17:20:31
【问题描述】:

在过去的几周里,我一直在调整和弄乱 PostgreSQL,我将在下一个项目中使用它。

我的规格是:

  • DigitalOcean 8 核 16GB SSD x2(一个用于 DB,另一个用于 Web)
  • Centos 7
  • PHP5,Nginx

我尝试过的事情:

  1. Pgtune

  2. PgBouncer & Pgpool(连接池和负载平衡)

  3. 调整 php-fpm 和 nginx(worker_processes、worker_connections、 pm.max_children 等)

  4. Linux 文件句柄限制和套接字调整。

我正在通过调用带有 ApacheBench 的网页插入来测试它。实用吗?

ab -n 17500 -c 1750 -r http://example.com/insert.php

到目前为止,我只能让它同时处理 1700-2000 个连接而不会丢弃任何事务(通常是 过早关闭的连接资源暂时不可用在 nginx 错误日志或 抱歉,PostgreSQL 已经返回了太多客户)。

我为 php-fpm 尝试了 TCP/IP 和 unix 套接字,而 TCP/IP 似乎比 unix 套接字更具可扩展性。

PHP 可以使用连接池吗?由于我从 Web 服务器调用数据库的方式仍然相同(与 pgpool 或 pgbouncer 建立很多单独的连接)。

我的目标是同时处理至少 10,000 笔交易。决定因素是什么?它是 Web 服务器到 db (php-fpm) 还是 PostgreSQL 本身之间的瓶颈?通常,大公司(PHP Web 应用程序)如何处理这样的数量?

【问题讨论】:

  • 您期望什么样的负载?我们有大约 600 万活跃客户,他们每天最多只使用 21 个活跃的数据库连接来处理 2 亿笔交易。为什么你认为你需要 10,000 个并发连接?
  • @FrankHeikens 真的吗?这就是我想听到的。那么你有没有进行任何性能调整?连接池?我可以知道什么样的应用程序?什么语言?谢谢
  • 您始终必须针对工作负载优化配置。默认设置足以开始使用,仅此而已。数据模型和所有 SQL 代码 (pl/pgsql) 也针对性能进行了优化。前端是一个巨大的java应用程序,但它只能执行一些存储过程。否则我们永远不会有这种表现。

标签: postgresql sockets nginx pgpool pgbouncer


【解决方案1】:

最好的负载测试是使用真实负载;越接近你的负载测试越好。

如果你有很多并发请求,连接池是必须的,而 pgBouncer 是标准答案。

不可能在答案的范围内进行性能调整,确实这个问题可能会因为过于宽泛而被关闭,但我会给你一些一般性的线索:

目标是找到瓶颈,即系统处于极限的资源。缩小范围:是应用程序、Web 服务器还是数据库?一旦您知道哪个组件限制了您,请找到单独的限制资源。是 I/O 吗? CPU时间?记忆?建立数据库连接所需的时间?锁?

一个重要的规则是不要在你知道问题出在哪里之前就开始随机旋转旋钮。这可能会给您一个配置错误的系统。找到一个理论,尝试一个解决方案,如果没有达到预期的效果,将设置重置为之前的值

我不明白你的设置:首先你说你有一台用于数据库的机器和一台用于应用程序的机器,然后你说你尝试了本地套接字连接。

【讨论】:

  • 嗯...谢谢,关于套接字,我从这里看到了:softwareprojects.com/resources/programming/…。不知道它实际上是如何工作的。
  • 我的问题是您不能使用 UNIX 套接字从一台机器连接到另一台机器,所以很明显我不了解您的架构(可能是因为没有详细解释)。关于链接:会说如果你需要 1000 个连接,你需要一个连接池,而不是 TCP。您可能想阅读this Wiki article
  • 我认为瓶颈在于服务器之间的连接或 postgresql 最大连接。我提到的 php-fpm 返回的“连接过早关闭”和“资源暂时不可用”这三个错误可以解释为 - pgsql 或 php 由于过载或等待时间过长而关闭了连接。最后,“对不起,已经有太多客户端了”表示 pgsql 不愿意接受连接。
  • 是的,我确实为连接池设置了 pgpool 或 pgbouncer。但是由于php是一种脚本语言,我不知道如何保持与php的连接。
  • 不要将 max_connections 设置为远高于 100 的任何值。如果这是您的瓶颈,那么 pgBouncer 就是解决方案。
猜你喜欢
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多