Ruby on rails 4 非常慢:ActiveRecord::QueryCache#调用

Ruby on rails 4 非常慢:ActiveRecord::QueryCache#调用,ruby-on-rails-4,activerecord,heroku,rack,query-cache,Ruby On Rails 4,Activerecord,Heroku,Rack,Query Cache,我在heroku上有一个应用程序,在Puma上运行: workers 2 threads_count 3 pool 5 看起来有些请求卡在了中间件中,这使得应用程序非常慢(非常!)。 我见过其他人在讨论这个问题,但到目前为止还没有解决办法 如果你有任何提示,请告诉我 ! ! 我最近开始看到在ActiveRecord::QueryCache调用中花费的时间急剧增加。在查看源代码之后,我决定尝试使用连接到生产环境的Rails控制台中的ActiveRecord::Base.connection.

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

workers 2
threads_count 3
pool 5
看起来有些请求卡在了中间件中,这使得应用程序非常慢(非常!)。 我见过其他人在讨论这个问题,但到目前为止还没有解决办法

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

!


!

我最近开始看到在ActiveRecord::QueryCache调用中花费的时间急剧增加。在查看源代码之后,我决定尝试使用连接到生产环境的Rails控制台中的
ActiveRecord::Base.connection.clear\u query\u cache
清除所述缓存。我得到的错误是
PG::ConnectionBad:无法为连接派生新进程:无法分配内存
,这导致了另一个问题,所以至少

我为Heroku支持部门工作,
中间件/Rack/ActiveRecord::QueryCache#调用
是NewRelic经常报告的问题。不幸的是,这通常是一种转移注意力的手段,因为每次问题的根源都在别处

QueryCache
是Rails第一次尝试签出连接以供使用的地方,因此任何连接问题都会在这里显示为请求“卡住”等待。这并不意味着数据库服务器必须断开连接(如果你需要Postgres的图表,他们会显示出来)。这可能意味着某些原因导致某些数据库连接进入错误状态,新的连接请求正在等待。这可能发生在Puma的旧版本中,其中使用了多个线程,并且设置了
reaping\u频率
——如果某些连接进入坏状态,而其他连接被reaping,则会导致问题

一些高层建议如下:

  • 升级Ruby&Puma
  • 如果使用
    机架超时
    gem,也要升级

这些升级通常会有所帮助。如果没有,还有其他选择可以考虑,比如从线程切换到基于工作进程,或者使用Postgres连接池,比如PgBouncer。关于配置并发web服务器以用于Postgres,我们有更多建议:

我将回答我自己的问题: 我只需检查数据库中的所有查询。其中一个需要很长的时间,即使不经常请求,它也会使整个服务器慢下来相当长的一段时间(即使在流程完成后,服务器上也会出现某种“交通堵塞”)。 解决方案: 检查对数据库的所有查询,修复最慢的查询(这可能意味着只需几步就可以将其分解,也可能意味着在夜间没有流量时运行,等等)。
一旦这些查询被修复,一切都应该恢复正常。

回答我自己:只需检查最慢的数据库查询,即使它们很少被请求,它们对其余查询的影响也是巨大的。您使用的是什么缓存存储?要调试的第一件事是,为什么存储需要这么长时间才能响应,或者(如果缓存存储是基于文件的)缓存存储中的数据需要太长时间才能反序列化?这是如何回答问题的?我遇到了与OP相同的体验,并且做了更多的研究,我分享了我的发现,而不是完全不回答这个问题,希望它能帮助别人。