2014-07-08 4 views
12

환경 :임의의 느린 랙 ::에게 Heroku에 레일 응용 프로그램에 MethodOverride 번호 호출

  • 루비 : 2.1.2

  • 레일 : 4.1.4

  • Heroku가

Heroku에서 호스팅하는 Google의 레일 앱에서 요청을 실행하는 데 시간이 오래 걸리는 경우가 있습니다. 그것은 단지 1 % 이하의 시간이지만, 우리는 그것이 무엇이 일어나고 있는지 알 수 없습니다.

newrelic 에이전트가 설치되어 있고 은 요청 대기열이 아니며이라는 메시지가 표시됩니다. 실행하는 데 걸리는 시간은 트랜잭션 자체입니다.

그러나, 트랜잭션 추적이 보여줍니다

enter image description here

지금까지 내가 말할 수있는

(이 같은 요청이 시간의 대부분을 실행하는이 100ms 만 소요), 시간이되고있다 우리 컨트롤러가 호출되기 전에 소모되었습니다. 그것은에 소비된다

Rack::MethodOverride#call 

그것은 우리가 이해할 수없는 것이다.

또한 대부분의 경우 (또는 항상 확실하지는 않지만) 모바일 장치에서 보낸 POST 요청에서 발생합니다. 이것은 느린 연결과 관련이있을 수 있습니까? (POST-payload는 매우 작지만).

누구에게 경험이 있습니까? 이 문제를 계속 탐구하는 방법에 대한 조언을 주시면 감사하겠습니다. 사전에

감사합니다!

답변

7

Ruby 에이전트는 버전 3.9.0.229에서 미들웨어를 계측하기 시작했기 때문에 일부 사용자에게는이 문제가 발생했습니다. 더 긴 타이밍의 가능한 원인 중 하나는 POST 매개 변수가 메소드 오버라이드를 포함하는지 여부를 결정하기 위해 Rack :: MethodOverride가 POST에서 요청 본문을 검사해야한다는 것입니다. reads in the entire request body 읽기를 트리거하는 결국 Rack::Request#POST 호출합니다.

예상보다 많은 시간이이 미들웨어에서 소비되는 것을 볼 수 있습니다. POST 바디가 미들웨어에서 보낸 시간과 어떻게 관련되는지 더 자세히 살펴보면 조사가 유익한 길일 수 있습니다.

마지막으로 우리는 승객 유니콘에서 스위치를 만든이 문제가 해결되었습니다 : 경우 사람에

+1

빠른 답변 주셔서 감사합니다. 당신이 알고 있다면 또 하나의 질문 : 그 시점에서, 요청 몸은 이미 dyno의 기억에 있습니까? 또는 요청 본문을 읽는 것이 클라이언트의 연결에 영향을받을 수 있습니다. 내 말은, 클라이언트의 연결이 느린 경우 요청 본문을 읽는 데 너무 많은 시간이 걸리는 이유 일 수 있습니까? – alex

2

이 발생하는

https://github.com/phusion/passenger-ruby-heroku-demo

내가 잘 모르겠지만, 문제 수도 저속 클라이언트에서 POST 요청과 관련이 있습니다.승객/nginx를 말한다 :

요청/응답 버퍼링 - 포함 된 Nginx에 버퍼 요청과 응답, 따라서 속도가 느린 고객에 대한 귀하의 응용 프로그램 (모바일 네트워크에 예를 들어, 모바일 장치)를 보호하고 성능을 향상시킬 수있다.

이것이 이유 일 수 있습니다.

+0

유니콘 작업자 앞에 nginx를 사용하여이 문제를 해결했습니다. 우리는 heroku에, 그래서이 buildpack 여기에 사용 : https://github.com/ryandotsmith/nginx-buildpack –