在 PostgreSQL 中,每个连接都有一个专用的后端。该后端不仅保存连接和会话状态,而且还是一个执行引擎。后端闲置起来并不是特别便宜,即使在空闲时它们也会消耗内存和同步开销。
对于任何给定的工作负载,任何给定的 Pg 服务器都有一个最佳数量的活跃工作后端,其中添加更多工作后端会减慢而不是加快速度。您想找到那个点,并将后端的数量限制在该级别附近。不幸的是,这没有什么灵丹妙药,它主要涉及基准测试——在你的硬件和你的工作负载上。
如果您需要更多的连接,则应使用代理或池系统,允许您将“连接状态”与“执行引擎”分开。两个流行的选择是PgBouncer和PgPool-II。您可以维护从您的应用程序到代理/池程序的轻量级连接,并让它安排工作负载以保持数据库服务器以最佳负载工作。如果有太多查询进来,一些查询会在执行之前等待,而不是竞争资源并减慢服务器上的所有查询。
请参阅postgresql 维基。
请注意,如果您的工作负载以读取为主,特别是如果它具有不经常更改的项目,您可以确定可靠的缓存失效方案,您还可以潜在地使用 memcached 或 Redis 来减少数据库工作负载。这需要更改应用程序。PostgreSQL 将帮助您进行合理的LISTEN
缓存NOTIFY
失效。
许多数据库引擎在核心数据库引擎的设计中内置了执行引擎和连接状态的一些分离。Sybase ASE 确实如此,我认为Oracle 也是如此,但我不太确定后者。不幸的是,由于 PostgreSQL 的每个连接一个进程的模型,它在后端之间传递工作并不容易,这使得 PostgreSQL 更难在本地执行此操作,因此大多数人使用代理或池。
我强烈建议您阅读PostgreSQL High Performance。我与 Greg Smith 或出版商*没有任何关系/从属关系,我只是认为这很棒,如果您担心数据库的性能,这将非常有用。
* ...好吧,我写这篇文章的时候没有。我现在在同一家公司工作。