【发布时间】:2017-08-19 17:20:31
【问题描述】:
在过去的几周里,我一直在调整和弄乱 PostgreSQL,我将在下一个项目中使用它。
我的规格是:
- DigitalOcean 8 核 16GB SSD x2(一个用于 DB,另一个用于 Web)
- Centos 7
- PHP5,Nginx
我尝试过的事情:
Pgtune
PgBouncer & Pgpool(连接池和负载平衡)
调整 php-fpm 和 nginx(worker_processes、worker_connections、 pm.max_children 等)
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