Ich benutze eine Flask-App auf Heroku mit Gunicorn mit Eventlet-Mitarbeitern. Eine bestimmte Route in meiner App empfängt häufig POST-Daten (x-www-form-urlencoded) mit einigen ziemlich großen Feldern - in der Größenordnung von höchstens 500 KB.Flask auf Heroku: request.form ist unglaublich langsam mit großen POST-Daten?
Dies funktioniert gut, wenn sie lokal ausgeführt wird, aber auf Heroku, fordert auf, dass Route zu vervollständigen überall von 5 bis 30 Sekunden dauert - und fast 100% der Zeit in dem ersten Zugriff ausgegeben request.form ist:
t = time.time()
action = str(request.form['action'])
dt = time.time() - t # Often 10 seconds or more!
Dies wird auch durch die Verfolgungsnachverfolgung von Newrelic bestätigt. Es gibt ein paar Millisekunden hier und da für die Datenbankoperationen und dann einen großen Teil der Zeit im Python-Code, der offensichtlich auf einige I/O gewartet hat, da die gemeldete CPU-Zeit normalerweise weniger als eine Millisekunde beträgt.
Ich konnte es nicht vollständig in einer lokalen Umgebung reproduzieren, die dasselbe gunicorn/eventlet-Setup verwendet, das ich in Produktion verwende. Sogar der integrierte Debug-WSGI-Server ist bei diesen Anforderungen blitzschnell.
Hat jemand eine Idee, was könnte schief gehen? Ist es ein Problem mit Flask oder etwas, mit dem ich nur den Support von Heroku kontaktieren muss?
Haben Sie versucht, die App auf die freie Sandbox von dotcloud zu setzen? Ich habe es kürzlich für eine kleine Flask-App verwendet, und es war ganz einfach. Vielleicht testen Sie Ihre App dort oder irgendwo ähnlich, um zu sehen, ob Sie das Problem mit Heroku oder mit Flask oder Ihrer App isolieren könnten? –
Ich zweite @AllanAnderson - versuchen Sie ein ähnliches Setup auf einem anderen Anbieter - wenn es auf die gleiche Weise bricht, könnten Sie einige Beispieldaten, die das Problem verursacht, zur Verfügung stellen? –
* "und fast 100% der Zeit wird für den ersten Zugriff auf request.form ausgegeben" * Ist es möglich, dass Sie die Auswirkungen von Dyno-Leerlauf erleben? https://devcenter.heroku.com/articles/dynos#dyno-idling – Dominic