首页 > 解决方案 > Flask 应用程序被多个进程锁定

问题描述

独角兽: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

关于此时去哪里或尝试什么的任何建议?

标签: pythonpython-3.xflaskgunicorn

解决方案


看来这是由于客户端数量和前面缺少反向代理(例如 nginx)的组合。与客户端数量相比,没有足够的工作人员开始排队请求,这使工作人员不堪重负,以至于他们将停止响应。我将工人增加到 60 人,并且吞吐量更加稳定。


推荐阅读