Flask应用程序锁定了多个进程

时间:2019-03-20 02:15:18

标签: python python-3.x flask gunicorn

独角兽:19.9.0

烧瓶:1.0.2

Python:3.6.7

我们有一堆内部API服务器数据科学模型,具有数千个请求/秒。我们最近推出了一个新程序,无论出于何种原因,当它与多个进程一起使用时(Gunicorn是我们的默认设置),它将处理数百个请求并锁定。

如果我在没有Gunicorn的情况下将API作为裸文件运行,则可以正常进行以下操作:

app.run(ip, port=port, threaded=True)

如果我运行多个进程,它会在启动后不久锁定:

app.run(ip, port=port, threaded=False, processes=2)

如果我将Gunicorn与workers=1一起使用,它也会锁定,这是配置:

preload_app = False
bind = "0.0.0.0:{}".format(8889)
workers = 1
debug = False
timeout = 120

我已经注释掉了端点中的所有代码,这对它的锁定没有影响。感觉像是与依赖项有某种冲突,但是我很难找到它。

如果我尝试在strace处于锁定状态时进行附加,则会在主Gunicorn进程中出现以下输出紧密循环:

strace: Process 4387 attached
select(4, [3], [], [], {tv_sec=0, tv_usec=832486}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0
select(4, [3], [], [], {tv_sec=1, tv_usec=0}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0
select(4, [3], [], [], {tv_sec=1, tv_usec=0}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0
select(4, [3], [], [], {tv_sec=1, tv_usec=0}) = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|001, st_size=0, ...}) = 0

目前有什么建议去哪里或尝试什么?

1 个答案:

答案 0 :(得分:1)

这似乎是由于客户端数量的组合以及前面没有反向代理(例如nginx)造成的。与客户端数量相比,没有足够的工人来开始排队请求,这使工人不堪重负,以至于他们将停止响应。我将工人的人数提高到60人,并且吞吐量保持了一致。