イベントレットワーカーとgunicornを使用して、HerokuでFlaskアプリを実行しています。私のアプリの特定のルートは、かなり分厚いフィールド(最大で500KB程度)を含むPOSTデータ(x-www-form-urlencoded)を頻繁に受信します。
これはローカルで実行している場合は正常に機能しますが、Herokuでは、そのルートへのリクエストが完了するまでに5〜30秒かかります。また、時間のほぼ100%がrequest.formへの最初のアクセスに費やされます。
t = time.time()
action = str(request.form['action'])
dt = time.time() - t # Often 10 seconds or more!
これは、Newrelicの低速リクエストトレースでも確認されています。報告されたCPU時間は通常1ミリ秒未満であるため、データベース操作には数ミリ秒があり、Pythonコードでは膨大な時間がI/Oの待機に費やされているようです。
本番環境で使用しているのと同じgunicorn/eventletセットアップを使用して、ローカル環境でこれを完全に再現することはできませんでした。組み込みのデバッグWSGIサーバーでさえ、これらの要求に対して非常に高速です。
何がうまくいかないのか誰かが知っていますか?それはFlaskの問題ですか、それともHerokuサポートに連絡する必要があるものですか?