PostgreSQL性能调优和最大连接(实际上)

时间:2017-03-27 06:07:38

标签: postgresql sockets nginx pgpool pgbouncer

过去几周我一直在调整和搞乱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文件句柄限制和套接字调整。

  5. 我正在通过调用带有ApacheBench的网页来测试它。这是实用的吗?

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

    到目前为止,我只能同时处理1700-2000个连接,而不会在nginx错误日志中删除任何事务(通常过早关闭连接资源暂时不可用 <或者< strong>抱歉,已经有太多客户通过PostgreSQL返回了。

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

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

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

1 个答案:

答案 0 :(得分:5)

最佳负载测试是实际负载;越接近你的负载测试,就越好。

如果您有许多并发请求,则必须使用连接池,并且pgBouncer是标准答案。

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

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

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

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