随机慢速Rack :: MethodOverride#调用Heroku上的rails应用程序
环境:
-
Ruby:2.1.2
-
Rails:4.1.4
-
Heroku的
在我们在Heroku上托管的rails应用程序中,有时请求需要很长时间才能执行。 它只有1%或更少,但我们无法弄清楚它发生了什么。
我们安装了newrelic代理,它说它不是请求排队 ,它是占用所有时间执行的事务本身。
但是,事务跟踪显示如下:
(同样的要求大多数时间只需要100毫秒执行)
据我所知,在我们的控制器被调用之前消耗的时间。 它消耗了
Rack::MethodOverride#call
这就是我们无法理解的。
此外,大多数时候(甚至总是,我们不确定)这种情况发生在移动设备发送的POST请求上。 这可能与缓慢的连接有关吗? (虽然POST-payload非常小)。
有没有人经历过这个? 关于如何继续探索这个问题的任何建议表示赞赏。
提前致谢!
由于Ruby代理开始在版本3.9.0.229中使用中间件,我们已经看到这个问题出现在一些用户身上。 更长时间的一个可能原因是Rack :: MethodOverride需要检查POST上的请求体,以确定POST参数是否包含方法覆盖。 它调用Rack :: Request#POST ,最终触发读取整个请求体的读取 。
这可能就是为什么你会发现在这个中间件上花费的时间比预期的多。 更深入地了解POST主体如何与中间件所花费的时间相关可能是一个富有成效的调查途径。
如果有人遇到这种情况:
最后,我们已经从独角兽转为乘客,这个问题已经解决:
https://github.com/phusion/passenger-ruby-heroku-demo
我不确定,但问题可能与慢速客户端上的POST请求有关。 Passenger / nginx说:
请求/响应缓冲 – 包含的Nginx缓冲请求和响应,从而保护您的应用程序免受慢速客户端(例如移动网络上的移动设备)和提高性能。
所以这可能是原因。