为什么我的PostgreSQL服务器cpu受限?
问题:为什么我的PostgreSQL服务器cpu受限?
我的数据库非常受 CPU 限制,我找不到问题的根本原因。我目前有两个应用程序服务器,每个服务器都有一个 Rails api,通过 ruby-pg gem 连接到 PostgreSQL。两个应用程序服务器也有 sidekiq 运行后台作业,我有一些支持服务器通过 sidekiq 处理来自国家提要的新帖子。如果我的内存不足,解决方案似乎很简单。为什么我受 CPU 限制的任何一般想法?
数据库规格:
-
Rackspace 8GB 性能层云虚拟机(8GB RAM,8x Core CPU,SSD)
-
Debian 7 Wheezy Linux 操作系统
-
带有 PostGIS 扩展的 PostgreSQL 9.1
可能的问题:
- PostgreSQL 9.1 不擅长索引
该数据库有近 10GB 的索引。我打算将我的数据库升级到 PostgreSQL 版本 >u003d 9.2。在 9.2 版中,引入了仅索引扫描。
- 连接太多
在 postgresql.conf 中,我将最大连接设置为“500”。通常全天只使用 175 个连接,但在高峰时段,sidekiq 任务会将当前连接增加到 350。8GB 服务器实例建议使用多少连接?
- 偶像关系
当我在 psql 控制台中查看 pg_stat_activity 时,我看到 sidekiq 留下了很多 IDLE 连接。这些连接会导致 CPU 膨胀吗?该修复程序是否存在于 api 或 sidekiq 中?
- 需要更强大的服务器
也许没有错误。我可能需要简单地增加服务器实例。如果我受内存限制,这将更有意义。但是,应用服务器和 3 个支持 sidekiq 服务器都是 4GB 性能层实例。从本质上讲,与数据库交互的服务器已经组合了两倍以上的数据库资源。这应该重要吗?
附加问题:
-
我应该使用什么工具/技术来解决问题?
-
postgresql.conf中有没有与cpu使用相关的基本设置?
-
是否存在任何与 rails、sidekiq 或 pg gem 相关的已知问题,这些问题可能是促成因素? (我还没有看到任何未解决的问题。)
-
是否有任何关于 CPU 使用的通用 postgreSQL 指南?
-
任何其他想法可能有助于我的搜索?
解答
您正在使用大量的并发连接。 PostgreSQL 将把大量时间浪费在整理和处理并发查询上。所有并发的工作都将争夺 CPU 和缓冲区空间,自旋锁的竞争会很激烈,而且通常都会一团糟。
在 8 核机器上,如果您主要受 CPU 限制,您可能不应该有超过 20 个活跃的工作连接。如果你的 I/O 受限,你可以更高,但 350 太荒谬了。
如果可能的话,在你的 PostgreSQL 实例前面放置一个事务池模式的 PgBouncer,这样查询就会排队并快速串行执行,而不是缓慢并行执行。
参见数据库连接数(Pg wiki)。
此外,PostGIS 可能会占用大量 CPU。它有时需要进行非常复杂的计算。我建议使用auto_explain模块记录长时间运行的查询,并使用pg_stat_statements/pg_stat_plans记录占用资源的内容。检查这些查询以查看它们是否需要改进。
您的idle in transaction会话也必须处理。根据它们空闲的原因以及它们是否具有事务 ID,它们可能会导致严重的表膨胀。他们还在 PostgreSQL 中创建了不必要的信号开销,因为它必须与正在积极做事的后端进行更多的协调。最后,开放交易的数量本身增加了一些内部管理操作的成本。
所以。如果您减少连接数、将 PgBouncer 置于事务池模式并修复那些空闲连接,您的数据库可能会表现得更好。
更多推荐
所有评论(0)