问题:为什么我的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 置于事务池模式并修复那些空闲连接,您的数据库可能会表现得更好。

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐