2013-02-12 2 views
5

저는 헬레 쿠에서 이벤트 릿 (eventlet) 작업자와 함께 gunicorn을 사용하여 Flask 앱을 ​​실행하고 있습니다. 내 응용 프로그램의 특정 경로는 자주 500KB의 순서로 상당히 복잡한 구역이있는 POST 데이터 (x-www-form-urlencoded)를 자주 수신합니다.Heroku에서 Flask : request.form은 큰 POST 데이터로 인해 속도가 매우 느립니까?

로컬에서 실행할 때 제대로 작동하지만 Heroku에서는 해당 경로에 대한 요청이 완료되기까지 5 ~ 30 초가 소요되며 요청 시간의 거의 100 %가 첫 번째 액세스에 소요됩니다.

t = time.time() 
action = str(request.form['action']) 
dt = time.time() - t # Often 10 seconds or more! 

이것은 Newrelic의 느린 요청 추적에서도 확인됩니다. 데이터베이스 연산에 몇 밀리 초가 있고, Python 코드에서 거대한 시간대가 있습니다.보고 된 CPU 시간이 보통 1 밀리 초보다 짧기 때문에 일부 I/O를 기다리는 데 걸리는 것으로 보입니다.

프로덕션 환경에서 사용하는 것과 동일한 gunicorn/eventlet 설정을 사용하여 로컬 환경에서이를 재현 할 수 없었습니다. 내장 된 디버그 WSGI 서버조차도 이러한 요청에 번개 같이 빠릅니다.

아무도 어떤 문제가 생길지 모르는 사람이 있습니까? 그것은 플라스크, 또는 그냥 Heroku 지원에 연락해야 할 일이 문제가 있습니까?

+2

dotcloud의 무료 샌드 박스에 앱을 올리려고 했습니까? 나는 최근에 작은 술병 응용 프로그램을 위해 그것을 사용했고, 그것은 죽었습니다. 어쩌면 거기 또는 어딘가에 Heroku 또는 Flask 또는 귀하의 응용 프로그램과 문제를 분리 수있는 당신의 애플 리케이션을 테스트 할 수 있습니까? –

+1

두 번째 @AllanAnderson - 다른 공급 업체에서도 비슷한 설정을 시도하십시오. 동일한 방식으로 문제가 발생하면 예제 데이터를 제공 할 수 있습니까? –

+2

* "거의 100 %의 시간이 request.form에 처음 액세스하는 데 소비됩니다."* dyno 공회전의 영향을받을 가능성이 있습니까? https://devcenter.heroku.com/articles/dynos#dyno-idling – Dominic

답변

3

정확히 무슨 일이 벌어 졌는지 알았습니다. TL; 실제로 서버 측에서 느린 것은 아니지만, Newrelic의보고 된 응답 시간에 잘못 표시되었습니다!

dotCloud의 샌드 박스에서 @AllanAnderson이 제안한대로 동일한 코드를 실행 해 보았습니다. 먼저 약 900KB의 데이터가 미리로드 된 몇 개의 숨겨진 필드가있는 간단한 HTML 양식과 request.form 사전에서 읽는 것 외에는 아무것도 수행하지 않고 각 액세스에 대한 경과 시간을 측정하는보기 기능을 사용하여 간단한 테스트 케이스를 만들었습니다. time.time().

0.00096 seconds: read field "p1": 786432 bytes 
0.00019 seconds: read field "p2": 131072 bytes 
0.00003 seconds: read field "p3": 12288 bytes 
0.00001 seconds: read field "p4": 1024 bytes 

그러나, 두 테스트는 브라우저에서 동일한 시간이 걸릴 듯 ... 그리고 :

5.87100 seconds: read field "p1": 786432 bytes 
0.00019 seconds: read field "p2": 131072 bytes 
0.00003 seconds: read field "p3": 12288 bytes 
0.00001 seconds: read field "p4": 1024 bytes 

그리고 dotCloud에 :

는 Heroku가에, 결과는이처럼 보였다 이제는이 "문제"에 대한 진정한 해답을 짐작할 수있을 것입니다. :-)

Heroku의 gunicorn이 헤더가 수신되는 즉시 뷰 기능을 실행하고 나머지 요청이 수신 될 때까지 request.form에 대한 첫 번째 액세스가 차단 된 것으로 나타났습니다. 따라서 Newrelic은이 모든 엄청나게 느린 응답 시간을 보았습니다. 그 이유는 실제로 진부한 네트워크 연결을 통해 POST 데이터를 업로드 한 결과 일뿐입니다. dotCloud의 설정은 전체 요청이 수신 될 때까지 대기합니다.

이 때문에 Newrelic의 메트릭은 덜 유용하지만 실제로 최종 사용자 경험에는 문제가되지 않습니다.

+0

메트릭을 오도하는 내용을 정리해 주셔서 감사합니다. 예전의 제거 과정! –

관련 문제