【问题标题】:Requests got stuck in ActiveRecord::QueryCache middleware请求卡在 ActiveRecord::QueryCache 中间件中
【发布时间】:2014-10-13 15:41:38
【问题描述】:

在部署我们的 Rails 应用程序(4.0.9,Ruby 2.1.2)后,我们注意到对我们应用程序的请求会在一段时间后挂起,通常是 1 天左右。

使用 gem rack_timer,我们能够找出卡在 ActiveRecord::QueryCache 中间件的请求。

Rack Timer (incoming) -- ActiveRecord::QueryCache: 925626.7731189728 ms

删除它后,我们的应用似乎恢复了正常。但是,我知道这个中间件的目的是提高性能,所以删除只是一个临时解决方案。我们使用 mysql (5.1.67) 和适配器 mysql2 (0.3.13)

更新:在我发布此问题后,服务器再次开始挂起,这次请求卡在 ActionDispatch::Routing::RouteSet

I, [2014-10-13T23:17:03.661346 #32498]  INFO -- : Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 3667661.2360477448 ms
I, [2014-10-13T23:17:03.661946 #32498]  INFO -- : Rack Timer (Application Action) -- ActionDispatch::Routing::RouteSet: 4373914.719343185 ms

你知道有什么原因会导致这种情况吗?

提前谢谢你。

【问题讨论】:

  • 查看你的其他问题,我已经回复了。
  • 您找到解决方案了吗?我在 heroku 上使用 postgres 时遇到了同样的问题。
  • 这有什么更新吗?根据提要有“另一个问题”,但我找不到它..
  • 我们也遇到了这样的问题。它随机发生。你找到解决办法了吗?是什么原因造成的?是数据库吗?还是memcached?
  • 我发现如果我增加数据库的连接池,这些问题就消失了。例如,我将默认连接池 5 更改为 75,从那时起我没有遇到任何问题。当然,这意味着更多的连接将打开到数据库,但如果您的数据库可以处理额外的连接,这应该不是任何问题。

标签: mysql ruby-on-rails rack


【解决方案1】:

最可能的原因是您与数据库的连接中断(防火墙、服务器配置...)并且 Rails 没有注意到,因此在 ActiveRecord::QueryCache 内部发生了超时。一旦 Rails 注意到连接断开,它会重新连接并继续执行流程。

尝试将 database.yml 文件中的参数 read_timeout 设置为 10 秒左右,然后检查您的连接和服务器设置。

【讨论】:

  • 如果我没记错的话,当使用QueryCache时,数据库没有到达(这就是为什么它是一个缓存),所以我认为它必须与正在使用的缓存实现有关(mem_cache等...)
  • 即使不使用,如果我没记错的话,连接就会建立,并且在那个阶段可能会发生“挂起”问题。
  • read_timeout 仅在使用 activerecord-jdbcmysql-adapter gem 时可用,顺便说一句。
猜你喜欢
  • 2016-05-31
  • 2017-08-02
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2022-07-04
  • 2015-08-13
相关资源
最近更新 更多