2013-03-25 2 views
11

나는 Heroku에서 Rails 3.2 앱을 호스팅하고 매일 Rails 애플리케이션에서 2-3 시간 제한을받습니다. 이들은 이 아니며 H12 요청 시간 초과가 아니라 Rails 스택 내의 어딘가에서 발생하는 시간 초과입니다. 따라서 사이트에서 실제로 예외를 생성하고 Airbrake 로그에 표시됩니다.Heroku의 Rails 앱에서 임의 시간 초과 예외가 발생했습니다.

시간 초과가 발생하는 곳에서는 완전 무작위 인 것으로 보입니다. 때로는 Formtastic, HAML보기 또는 ActiveRecord 코드 내에서 볼 수 있습니다. https://gist.github.com/dpmccabe/5238273 이 사이트는 트래픽이 많지 않으며 두 개의 다이노스에서 잘 실행됩니다 (Adept Scale 애드온 덕분에 자동으로 확장되지만). HTTP_X_HEROKU_QUEUE_WAIT_TIME 헤더는 일반적으로 낮거나 0이므로 라우팅 문제라고 생각하지 않습니다. 나는 효과가없는 씬에서 유니콘으로 전환을 시도했습니다 (위의 요지에서 unicorn.rb가 표시됨).

이러한 시간 초과 예외가 응용 프로그램 전체에서 무작위로 발생한다는 사실은 계속 진행되지 않습니다. 나는 New Relic을 가지고 있지만, 이것을 디버깅하는 방법을 잘 모릅니다. 어떤 아이디어?

+0

이것은 하루에 한두 번 우리 앱에 발생합니다 ... 나는 더 많은 도움을 줄 수 있기를 바랍니다.하지만 나는 같은 배에 있습니다! – stereoscott

+0

+1 또한 Unicorn/Rails 3.2/Rack-Timeout (15s/Heroku Cedar)에서 이걸 보았습니다. 나는이 스레드를 따라 가서 발견 할 수 있다면 더 자세한 정보를 게시 할 것입니다. –

+0

단지 궁금한 점 : 시간 초과 시점의 평균 처리량 (RPM)은 얼마입니까? – KendallB

답변

0

Heroku Dev Center에 따르면 라우터는 완료하는 데 30 초 이상이 걸리면 요청을 종료합니다. rack-timeout gem을 사용하면 병목 현상을 찾을 수 있습니다. 당신은 여러 병렬 요청이 나는 또한 같은 문제에 실행 된 Unicorn

0

사용하는 것을 고려하면 그냥 제한 시간보다 30 초

Rack::Timeout.timeout = 15 # seconds 

합니다. 아직 해결하지는 못했지만 지금까지 살펴 봤던 것과 차임을하고 싶습니다. 나는 rack-timeout gem을 사용하고있다. (backtraces에 기반하여, 당신도 그렇듯이 보인다.) timeout은 15 초로 설정했다. 새로운 유물을 살펴보면 요청에 대한 평균 앱 서버 응답 시간은 200ms 미만입니다.

undefined method `result' for #<Timeout::Error: execution expired> 

오류가 아무런 조치 하나를 생성 할 특히 가능성이 겉으로 없습니다와 행동의 넓은 범위에서 발생 : 아직, 당신처럼, 나는 2-3 오류 같이 하루를 얻는다. 오류는 간단한 CRUD DELETE 작업에서도 발생합니다. Heroku의 Cedar 스택에 레일 3.2 앱을 돌리고 있습니다. 나는 각각 3 명의 유니콘 노동자와 함께 두 개의 웹 다이노노스를 운영합니다. 그들은 각각 지속적으로 512MB 한계를 밑돌고 있습니다.

[AMBER] LOG: process 21289 acquired ShareLock on transaction 105259 after 32366.132 ms 

가 비슷한 것을 볼 수 마십시오

내가 지금까지 찾은 유일한 단서는 나는 종종 내 로그에 내 시간 제한 근처에 다음과 같은 것을 볼 수 있다는 것입니다? 레코드를 잠그고있는 DB 작업이 타임 아웃을 일으킬 가능성이 있습니다. 확실하지 않습니다.

1

heroku에서 호스팅되는 응용 프로그램에서 동일한 문제가 발생했습니다.

로그를 검사 한 결과 요청 처리 수가 30 초 이상 걸리지 않아서 heroku에서 시간 초과 오류가 발생하는 것으로 나타났습니다. 필자의 경우이 문제는 로그에 인쇄 중이 었습니다. 서버 로그에 많은 양의 입출력 데이터가 인쇄 된 스테이징 서버가있어서 30 초 이상 걸리므로 요청이 진행 중이라고 가정합니다. 원격 API에서 응답을받은 후 아직 로그에 데이터를 인쇄하지 않았습니다.

그래서 입력 (코드로 구성된 xml 데이터 입력)을 인쇄하고 로그 (api에서받은 xml 데이터) 데이터를 로그에 인쇄하는 모든 명령문을 제거했습니다.

  1. 그래서 요청하면 (디버깅 목적을위한) 데이터를 인쇄하는 경우
  2. 확인을 처리하는 데 30 초 이상 복용하는 경우 로그에 인쇄 할 시간이 걸립니다 로그를 확인하고 볼을 건의 할 것입니다.

다시 말하지만,이 질문에 대한 답변이되지 않을 수도 있지만 이것이 내가 해결 한 방법입니다. 도움이 되었기를 바랍니다.

+0

다음을 사용하여 로깅을 해제했습니다. Rack :: Timeout.unregister_state_change_observer (: logger) –

관련 문제