为什么我的PostgreSQL服务器cpu受到限制?

Jah*_*tal 2 postgresql debian ruby-on-rails pg sidekiq

我的数据库非常受cpu限制,我找不到问题的根本原因.我目前有两个应用程序服务器,每个服务器都有一个通过ruby-pg gem连接到PostgreSQL的Rails api.两个应用程序服务器都有sidekiq运行后台作业,我有一些支持服务器通过sidekiq处理来自国家feed的新帖子.如果我的内存耗尽,解决方案似乎很简单.为什么我受CPU约束的任何一般想法?

数据库规格:

  • Rackspace 8GB性能层云VM(8GB RAM,8x核CPU,SSD)
  • Debian 7 Wheezy Linux OS
  • 带有PostGIS扩展的PostgreSQL 9.1

可能的问题:

  • PostgreSQL 9.1对索引不好

该数据库有近10GB的索引.我要将我的数据库升级到PostgreSQL版本> = 9.2.在9.2版中,引入了仅索引扫描.

  • 太多联系

在postgresql.conf中,我将max connection设置为'500'.通常在一天中,只使用175个连接,但在高峰时段,sidekiq任务会将当前连接增加到350.建议与8GB服务器实例建立多少个连接?

  • 偶像连接

当我在psql控制台中查看pg_stat_activity时,我看到sidekiq留下了很多IDLE连接.这些连接会导致CPU通胀吗?修复是否存在于api或sidekiq中?

  • 需要更强大的服务器

也许没有错误.我可能只需要增加服务器实例.如果我受到记忆限制,这将更有意义.但是,app服务器和3个支持sidekiq服务器都是4gb性能层实例.实质上,与数据库交互的服务器组合了数据库资源的两倍以上.这甚至不重要吗?

其他问题:

  • 我应该使用哪些工具/技术来解决问题?
  • postgresql.conf中与cpu使用有关的任何基本设置?
  • 是否有任何与rails,sidekiq或pg gem相关的已知问题可能是一个影响因素?(我没有看到任何未解决的问题.)
  • CPU使用是否有一般的postgreSQL指南?
  • 还有其他想法可能有助于我的搜索吗?

Cra*_*ger 10

您正在使用大量并发连接.PostgreSQL将浪费大量时间用于管理和处理并发查询.所有并发工作都将争夺CPU和缓冲空间,自旋锁上会有很多争用,而且一般都是一团糟.

在8核机器上,如果您主要受CPU限制,则可能不应该有超过20个正常工作的连接.如果你的I/O有限,你可以走得更高,但350只是荒谬的.

如果可能的话,将PgBouncer放在PostgreSQL实例前面的事务池模式中,这样查询就会排队并快速执行,而不是慢速并行执行.

请参阅数据库连接数(Pg wiki).

此外,PostGIS可能非常耗费CPU.它有时需要进行非常复杂的计算.我建议使用该auto_explain模块记录长时间运行的查询,并使用pg_stat_statements/ pg_stat_plans记录占用资源的内容.检查这些查询以查看它们是否需要改进.

你的idle in transaction会话也必须处理.根据他们为什么闲置以及他们是否有交易ID,他们可能会导致严重的表格膨胀.他们还在PostgreSQL中创建了不必要的信令开销,因为它必须与积极做事的后端进行更多的协调.最后,自己开放交易的数量增加了一些内部管家操作的成本.

所以.如果减少连接数,将PgBouncer置于事务池模式中并修复这些空闲连接,则数据库可能会表现得更好.