2013-02-12 7 views
5

私は、イベントハンドラーを使用してgunicornを使用してHerokuにFlaskアプリを実行しています。私のアプリの特定のルートは、たいてい500KBのオーダーの、かなりチャンクなフィールドを持つPOSTデータ(x-www-form-urlencoded)を頻繁に受信します。HeraskのFlask:request.formのPOSTデータが非常に遅いですか?

これはローカルで実行しても正常に動作しますが、Herokuではそのルートへのリクエストには5〜30秒かかるため、request.formへの最初のアクセスに費やされる時間はほぼ100%です。

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

これは、Newrelicの低速要求トレースによっても確認されています。報告されたCPU時間は通常1ミリ秒以下であるため、ここではデータベースの操作に数ミリ秒、Pythonコードではかなりの時間がかかります。

私は現場環境でこれを生産する際に使用しているのと同じgunicorn/eventlet設定を使用して完全に再現することができませんでした。組み込みのデバッグWSGIサーバーであっても、これらの要求に対しては驚異的です。

誰も何が間違っているかもしれないという考えを持っていますか?それはフラスコ、または私がただHerokuのサポートに連絡する必要がある何かの問題ですか?

+2

dotcloudの無料サンドボックスにアプリを置こうとしましたか?私は最近、小さなフラスコのアプリのためにそれを使用し、それは死んでいた単純だった。たぶんあなたのアプリをどこかでテストして、HerokuやFlaskやアプリで問題を特定できるかどうかを確認してください。 –

+1

私は2番目の@AllanAnderson - 別のベンダーで同様の設定を試してください。同じ方法で問題が発生する場合は、サンプルデータを提供できますか? –

+2

* "request.formへの最初のアクセスでは、ほぼ100%の時間が費やされています" *ダイノーアイドリングの影響を受けている可能性はありますか? https://devcenter.heroku.com/articles/dynos#dyno-idling – Dominic

答えて

3

私は何が起こっていたかを正確に把握したと思います。 TL;それは実際にサーバー側では全く遅くはなかった、私はちょうどNewrelicの報告された応答時間によって誤解された!

@AllanAndersonが提案したdotCloudのサンドボックスで同じコードを実行しようとしました。私は最初にテストケースを減らしました:約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データをアップロードした結果に過ぎませんでした。ドットクラウドのセットアップは明らかに、要求全体が受信されるまで待ちます。

これにより、Newrelicのメトリクスはあまり役に立たなくなりますが、実際にエンドユーザーの経験に問題はありません。

+0

メトリックを誤解していたものを整理してくれてうれしいです。ええ、排除のプロセス! –