非常慢:ActiveRecord :: QueryCache#调用

时间:2016-02-18 21:11:02

标签: ruby-on-rails-4 activerecord heroku rack query-cache

我在heroku上有一个应用程序,在Puma上运行:

workers 2
threads_count 3
pool 5

看起来有些请求卡在中间件中,它使应用程序非常慢(非常!)。 到目前为止,我已经看到其他人对这个问题有所了解但没有解决方案。

如果您有任何提示,请告诉我。

aactiverecord_querycache_1

aactiverecord_querycache_2

3 个答案:

答案 0 :(得分:7)

我为Heroku支持工作,array.each { |a, b| hash[a] += b } #=> {172=>3, 173=>1, 174=>6} 是New Relic常见的问题。不幸的是,每当问题的根源出现在其他地方时,它通常都是红鲱鱼。

Middleware/Rack/ActiveRecord::QueryCache#call是Rails首先尝试检查连接以供使用的地方,因此连接的任何问题都将在此处显示为请求“卡住”等待。这并不意味着数据库服务器必然没有连接(如果你有Postgres的Librato图表,他们会显示这个)。这可能意味着某些事情导致某些数据库连接进入错误状态,并且新的连接请求正在等待。这可能发生在Puma的旧版本中,其中使用了多个线程并且QueryCache已设置 - 如果某些连接进入错误状态而其他连接被收到,则会导致问题。

一些高级别的建议如下:

  • 升级Ruby&彪马
  • 如果使用reaping_frequency gem,请升级

这些升级通常会有所帮助。如果没有,还有其他选项可供选择,例如从线程切换到基于工作程序的进程或使用Postgres连接池(如PgBouncer)。我们在此处提供了有关配置与Postgres一起使用的并发Web服务器的更多建议:https://devcenter.heroku.com/articles/concurrency-and-database-connections

答案 1 :(得分:4)

我会回答我自己的问题: 我只需要检查所有查询到我的数据库。其中一个是花了很长时间,即使它没有经常被要求,它也会在整个服务器上放慢一段时间(即使在完成这个过程之后,也会出现一种“交通拥堵”。服务器)。 解: 检查所有对数据库的查询,修复最慢的查询(可能只是意味着在几步中将其分解,这可能意味着在没有流量的情况下让它在晚上运行等等)。 修复此查询后,一切都应恢复正常。

答案 2 :(得分:1)

我最近开始看到在ActiveRecord :: QueryCache#call中花费了大量时间。在查看源代码之后,我决定尝试使用附加到生产环境的Rails控制台中的ActiveRecord::Base.connection.clear_query_cache清除所述缓存。我收到的错误是PG::ConnectionBad: could not fork new process for connection: Cannot allocate memory,这导致我至少Heroku Rails could not fork new process for connection: Cannot allocate memory

这个其他问题