我在 Heroku 上运行一个 Flask 应用程序,使用 gunicorn 和 eventlet 工作人员。我的应用程序上的一个特定路由经常接收带有一些相当大的字段的 POST 数据(x-www-form-urlencoded)——最多大约 500KB。
这在本地运行时工作正常,但在 Heroku 上,对该路由的请求需要 5 到 30 秒才能完成——并且几乎 100% 的时间都花在了第一次访问 request.form 上:
t = time.time()
action = str(request.form['action'])
dt = time.time() - t # Often 10 seconds or more!
Newrelic 慢速请求跟踪也证实了这一点。数据库操作在这里或那里有几毫秒,然后是 Python 代码中的大量时间,显然花在等待一些 i/o 上,因为报告的 CPU 时间通常不到一毫秒。
我完全无法在本地环境中使用我在生产中使用的相同 gunicorn/eventlet 设置来重现这一点。即使是内置的调试 WSGI 服务器也能以闪电般的速度处理这些请求。
有人知道可能出了什么问题吗?是 Flask 的问题,还是我需要联系 Heroku 支持的问题?