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

问题描述 投票:1回答:1

Gunicorn:19.9.0

烧瓶:1.0.2

Python:3.6.7

我们有一堆内部API服务器数据科学模型,有数千个req./sec。我们最近推出了一个新的,无论出于何种原因,当提供多个进程(Gunicorn是我们的默认设置)时,它将服务几百个请求并锁定。

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

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

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

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

如果我使用带有workers=1的Gunicorn,它也会锁定,这是配置:

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

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

如果我在锁定时尝试使用strace进行附加,我会在主炮声进程中获得以下输出的紧密循环:

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

在这一点上有关于去哪里或尝试什么的任何建议?

python python-3.x flask gunicorn
1个回答
1
投票

看起来这是由于客户端数量的组合和前面缺少反向代理(例如nginx)。与客户端号码相比,没有足够的工作人员可以开始排队请求,这会使工作人员不堪重负,他们会停止响应。我把工人撞到了60,而且吞吐量更加一致。

© www.soinside.com 2019 - 2024. All rights reserved.