Ruby on rails Random slow Rack::MethodOverride#在Heroku上调用rails应用程序

Ruby on rails Random slow Rack::MethodOverride#在Heroku上调用rails应用程序,ruby-on-rails,ruby,heroku,rack,newrelic,Ruby On Rails,Ruby,Heroku,Rack,Newrelic,环境: Ruby:2.1.2 轨道:4.1.4 赫罗库 在Heroku上托管的rails应用程序中,有时请求需要很长时间才能执行。这只是1%或更少的时间,但我们无法弄清楚发生了什么 我们安装了newrelic代理,它说不是请求队列,而是事务本身花费所有时间执行 但是,事务跟踪显示: (大多数情况下,执行同一请求只需100毫秒) 据我所知,在我们的控制器被调用之前,时间被消耗掉了。它是在 Rack::MethodOverride#call 这是我们无法理解的 而且,大多数情况下(甚至总是,

环境:

  • Ruby:2.1.2

  • 轨道:4.1.4

  • 赫罗库

在Heroku上托管的rails应用程序中,有时请求需要很长时间才能执行。这只是1%或更少的时间,但我们无法弄清楚发生了什么

我们安装了newrelic代理,它说不是请求队列,而是事务本身花费所有时间执行

但是,事务跟踪显示:

(大多数情况下,执行同一请求只需100毫秒)

据我所知,在我们的控制器被调用之前,时间被消耗掉了。它是在

Rack::MethodOverride#call
这是我们无法理解的

而且,大多数情况下(甚至总是,我们不确定)这种情况发生在移动设备发送的POST请求上。这可能与连接速度慢有关吗?(尽管POST有效载荷非常小)

有人经历过吗?任何关于如何继续探索这个问题的建议都将不胜感激


提前谢谢

自从Ruby代理开始在3.9.0.229版中安装中间件以来,我们看到一些用户出现了这个问题。时间较长的一个可能原因是Rack::MethodOverride需要检查POST上的请求正文,以确定POST参数是否包含方法重写。它调用,最终触发读取


这可能就是为什么您看到在这个中间件中花费的时间比预期的要多。更深入地研究帖子正文与在中间件中花费的时间之间的关系可能是一个富有成效的调查途径。

如果有人遇到这种情况:

最后,我们将独角兽转换为乘客,该问题已得到解决:

我不确定,但问题可能与慢速客户端上的POST请求有关。乘客/nginx表示:

请求/响应缓冲-包括的Nginx缓冲请求和响应 响应,从而保护您的应用程序不受慢速客户端(例如移动客户端)的影响 移动网络上的设备)并提高性能


所以这可能就是原因。

非常感谢您的快速回答!如果你们也知道的话,还有一个问题:在那个时候,请求主体已经在dyno的记忆中了?或者,读取请求主体可能会受到客户端连接的影响。我的意思是,如果客户端的连接很慢,这就是为什么要花这么多时间来阅读请求正文的原因吗?我在unicorn的工作人员面前使用nginx解决了这个问题。我们在heroku上,所以我在这里使用了这个构建包: