python - 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
关于此时去哪里或尝试什么的任何建议?
解决方案
看来这是由于客户端数量和前面缺少反向代理(例如 nginx)的组合。与客户端数量相比,没有足够的工作人员开始排队请求,这使工作人员不堪重负,以至于他们将停止响应。我将工人增加到 60 人,并且吞吐量更加稳定。
推荐阅读
- vb.net - gpg 加密文件不在目录中
- php - Laravel 与 UUID 的同表关系
- ansible - 在多主机部署中出现错误时继续 Ansible
- php - 使用 htaccess 和 mod_rewrite 将 URL 重写到不同的域
- spring - 原因:java.lang.IllegalArgumentException:值不是数组 [java.util.ArrayList]
- python - 获取一个 PDF 文件的文件夹并将它们转换为 CSV 并将它们保存在另一个具有相同名称但以 csv 结尾的文件夹中
- python - 使用 Swagger 制作的 Python Flask 应用程序意外崩溃
- firebase - 我可以通过编程方式获取 FCM 服务器密钥吗?
- python - 导出到 csv 时重复爬取的数据
- ios - 如何存储包含自定义用户类型的属性以调节用户看到的视图控制器?