【发布时间】:2013-01-27 05:29:19
【问题描述】:
我正在 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 支持?
【问题讨论】:
-
您是否尝试过将应用程序放在 dotcloud 的免费沙盒上?我最近将它用于一个小型 Flask 应用程序,它非常简单。也许在那里或类似的地方测试你的应用程序,看看你是否可以用 Heroku、Flask 或你的应用程序找出问题?
-
我第二个 @AllanAnderson - 在另一个供应商上尝试类似的设置 - 如果它以相同的方式中断,您能否提供一些导致问题的示例数据?
-
“并且几乎 100% 的时间都花在了第一次访问 request.form 上” 您是否可能正在经历测功机空转的影响? devcenter.heroku.com/articles/dynos#dyno-idling
-
@AllanAnderson, Sean:这些都是很好的建议;我想我会尝试并报告。
-
@Dominic:绝对不是空转。该应用程序有多个专门运行的网络测功机以避免空转;我还添加了跟踪代码,以便它测量请求函数开始执行后开始的时间。
标签: python post heroku flask gunicorn