ActionDispatch::Routing::RouteSet#call Rails 4.1 真的很慢

Posted

技术标签:

【中文标题】ActionDispatch::Routing::RouteSet#call Rails 4.1 真的很慢【英文标题】:ActionDispatch::Routing::RouteSet#call Rails 4.1 really slow 【发布时间】:2015-04-05 18:06:36 【问题描述】:

我已经搜索了几天,但找不到与此问题相关的任何答案。

在我托管在 Heroku 上的 Rails 4.1 应用程序中,当负载增加时,一些 PUT 请求变得非常慢。今天最慢的是53秒。所有这些都没有数据库(MongoDB)注册任何慢查询。通常这个请求需要 0.3ms 非常快。无论负载是什么,请求都很慢。

安装 New Relic 后,它对情况有了更多了解,但我仍然不知道在哪里解决这个问题。

控制器中的代码很快,但是根据New Relic,慢的是ActionDispatch::Routing::RouteSet#call

以下是 New Relic 报告的转储:

Slowest components                      Count   Duration    %
ActionDispatch::Routing::RouteSet#call  1   53,000 ms   100%
Plugin::FetchablesController#update     1   38 ms       0%
Rails::Rack::Logger#call                1   1 ms        0%
ActionDispatch::Cookies#call            1   1 ms        0%
ActiveSupport::Cache::Strategy::LocalCache::Middleware#call 1   0 ms    0%
Rack::Runtime#call                      1   0 ms        0%
Total                                       53,000 ms   100%

其他一些可能有帮助或可能与此有关的信息。我有路线的别名,但我不明白为什么这很重要。

namespace :plugin do
   resources :fetchables, path: :minables
end

任何关于可能发生的事情以及我可以做些什么来解决它的想法将不胜感激。

更新 所以这似乎与内存有关。当我们升级到 Performance Dynos 时,我们不再看到这些错误。但这似乎是 Heroku 严重错误的配置。

【问题讨论】:

我也面临同样的问题。你找到任何解决方案了吗?您使用的是哪个版本的 Rails? 不,还没有解决方案。我已将问题缩小到当用户进行大型更新时发生的问题。特别是如果他们的连接速度很慢。在接收参数数据时,rails 是否可能在 RouteSet 调用中花费时间?我一直认为它会在完成的请求中作为一大块被接收? 我通过简单的 get 调用遇到了这种情况。它的参数中没有大量数据。我怀疑这可能是由于包含大型会话数据的大型 env 对象。 我遇到了同样的问题。有没有人发现任何线索? 还没有。但我刚刚在 Heroku 上切换到 Puma,我希望它可以解决问题,但还没有深入研究或测试它。 【参考方案1】:

您可以使用rack-mini-profiler 来检查真正的问题出在哪里。

【讨论】:

【参考方案2】:

减速表明它是 Heroku 特有的。这可能是您升级到 Performance Dynos 后发现问题消失的原因。

【讨论】:

以上是关于ActionDispatch::Routing::RouteSet#call Rails 4.1 真的很慢的主要内容,如果未能解决你的问题,请参考以下文章