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