Gunicorn worker 超时错误

Posted

技术标签:

【中文标题】Gunicorn worker 超时错误【英文标题】:Gunicorn worker timeout error 【发布时间】:2012-06-06 23:38:33 【问题描述】:

我已经设置了 gunicorn,有 3 个工作人员 30 个工作人员连接并使用 eventlet 工作人员类。它是在 nginx 后面设置的。每隔几个请求后,我就会在日志中看到这一点。

[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514

为什么会这样?我怎样才能弄清楚出了什么问题?

谢谢

【问题讨论】:

你能解决问题吗?请分享您的想法,因为我也坚持下去。 Gunicorn==19.3.1gevent==1.0.1 找到了解决方案。将超时增加到非常大的值,然后我能够看到堆栈跟踪 【参考方案1】:

用于在 Azure App Services (Linux App) 上运行 Flask 应用程序的 Microsoft Azure 官方文档将超时的使用规定为 600

gunicorn --bind=0.0.0.0 --timeout 600 application:app

https://docs.microsoft.com/en-us/azure/app-service/configure-language-python#flask-app

【讨论】:

【参考方案2】:

这个端点是否花费了太多时间?

也许你使用的flask没有异步支持,所以每个请求都会阻塞调用。要轻松创建异步支持,请添加 gevent worker。

使用 gevent,新调用将产生一个新线程,您的应用将能够接收更多请求

pip install gevent
gunicon .... --worker-class gevent

【讨论】:

【参考方案3】:

弗兰克的回答为我指明了正确的方向。我有一个访问托管 Digital Ocean Postgresql 数据库的 Digital Ocean 液滴。我需要做的就是将我的 Droplet 添加到数据库的“可信来源”中。

(点击 DO 控制台中的数据库,然后点击设置。编辑 Trusted Sources 并选择 droplet 名称(点击可编辑区域,它将向您建议)。

【讨论】:

【参考方案4】:

对我来说,这是因为我忘记在数据库服务器上为我的 Django 设置防火墙规则。

【讨论】:

【参考方案5】:

使用--log-level debug 运行 Gunicorn。

它应该为您提供应用堆栈跟踪。

【讨论】:

我很想得到一个 stracktrace,但他们都没有在这里工作,使用 gunicorn 19.4.5。调试的东西被显示了,所以我猜这个标志被识别了,但在超时时没有堆栈跟踪。 这里一样,没有启用标志的堆栈跟踪【参考方案6】:

这对我有用:

gunicorn app:app -b :8080 --timeout 120 --workers=3 --threads=3 --worker-connections=1000

如果你有eventlet 添加:

--worker-class=eventlet

如果你有gevent 添加:

--worker-class=gevent

【讨论】:

有趣的事实,--worker-class-k 是类似的,还有 --timeout-t【参考方案7】:

超时是这个问题的一个关键参数。

但它不适合我。

我发现当我设置workers=1 时没有gunicorn 超时错误。

当我查看我的代码时,我在服务器初始化中发现了一些 socket connect (socket.send & socket.recv)。

socket.recv 会阻塞我的代码,这就是为什么当worker>1

时它总是超时的原因

希望能给对我有问题的人一些想法

【讨论】:

【参考方案8】:

对我来说,解决方案是将--timeout 90 添加到我的入口点,但它不起作用,因为我定义了两个入口点,一个在 app.yaml 中,另一个在我的 Dockerfile 中。我删除了未使用的入口点,并在另一个入口点添加了--timeout 90

【讨论】:

【参考方案9】:

如果您使用 GCP,则必须为每个实例类型设置工作器。

链接到 GCP 最佳做法https://cloud.google.com/appengine/docs/standard/python3/runtime

【讨论】:

【参考方案10】:

我在 Docker 中遇到了同样的问题。

在 Docker 中,我不断训练 LightGBM 模型 + Flask 服务请求。作为 HTTP 服务器,我使用了gunicorn 19.9.0。当我在我的 Mac 笔记本电脑上本地运行我的代码时,一切正常,但是当我在 Docker 中运行应用程序时,我的 POST JSON 请求冻结了一段时间,然后gunicorn worker 因[CRITICAL] WORKER TIMEOUT 异常而失败。

我尝试了很多不同的方法,但唯一解决我的问题的是添加worker_class=gthread

这是我的完整配置:

import multiprocessing

workers = multiprocessing.cpu_count() * 2 + 1
accesslog = "-" # STDOUT
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(q)s" "%(D)s"'
bind = "0.0.0.0:5000"
keepalive = 120
timeout = 120
worker_class = "gthread"
threads = 3

【讨论】:

赞成你的其他一些答案,只是这个还不够:P【参考方案11】:

WORKER TIMEOUT 表示您的应用程序无法在定义的时间内响应请求。您可以使用gunicorn timeout settings 进行设置。某些应用程序需要比其他应用程序更多的时间来响应。

可能会影响到这一点的另一件事是choosing the worker type

默认的同步工作器假定您的应用程序在 CPU 和网络带宽方面是资源受限的。一般来说,这意味着您的应用程序不应该做任何花费未定义时间的事情。花费未定义时间的示例是对 Internet 的请求。在某些时候,外部网络会出现故障,导致客户端堆积在您的服务器上。因此,从这个意义上说,任何向 API 发出传出请求的 Web 应用程序都将受益于异步工作线程。

当我遇到与您相同的问题时(我试图使用 Docker Swarm 部署我的应用程序),我尝试增加超时并使用另一种类型的工作人员类。但都失败了。

然后我突然意识到对于撰写文件中的服务,我的资源太低了。就我而言,这就是减慢应用程序速度的原因

deploy:
  replicas: 5
  resources:
    limits:
      cpus: "0.1"
      memory: 50M
  restart_policy:
    condition: on-failure

所以我建议你首先检查一下是什么降低了你的应用程序的速度

【讨论】:

【参考方案12】:

在谷歌云上 只需将--timeout 90 添加到app.yaml 中的入口点

entrypoint: gunicorn -b :$PORT main:app --timeout 90

【讨论】:

【参考方案13】:

会是这样吗? http://docs.gunicorn.org/en/latest/settings.html#timeout

其他可能性可能是您的响应时间过长或等待等待。

【讨论】:

【参考方案14】:

我遇到了非常相似的问题,我也尝试使用“runserver”来查看是否可以找到任何东西,但我得到的只是一条消息Killed

所以我认为这可能是资源问题,我继续为实例提供更多 RAM,并且它起作用了。

【讨论】:

我看到这个问题,即使 gevent 和超时设置正确,内存不足是问题 是的。超时是因为在服务器内存不足的情况下与工作人员交谈花费了太长时间。我看了docker stats,修复了占用内存的代码,很好。【参考方案15】:

我们在使用 Django+nginx+gunicorn 时遇到了同样的问题。从 Gunicorn 文档中,我们配置了几乎没有任何区别的优雅超时。

经过一些测试,我们找到了解决方案,要配置的参数是:超时(而不是优雅超时)。它像时钟一样工作..

所以,做:

1) 打开gunicorn配置文件

2) 将 TIMEOUT 设置为您需要的值 - 值以秒为单位

NUM_WORKERS=3
TIMEOUT=120

exec gunicorn $DJANGO_WSGI_MODULE:application \
--name $NAME \
--workers $NUM_WORKERS \
--timeout $TIMEOUT \
--log-level=debug \
--bind=127.0.0.1:9000 \
--pid=$PIDFILE

【讨论】:

谢谢这是正确的答案。然后,为了节省大量并发连接的资源:@​​987654322@,然后在配置文件中使用worker_class gevent,或者在命令行中使用-k gevent 我正在与主管一起运行,因此将其添加到 conf.d/app.confcommand=/opt/env_vars/run_with_env.sh /path/to/environment_variables /path/to/gunicorn --timeout 200 --workers 3 --bind unix:/path/to/socket server.wsgi:application【参考方案16】:

您需要使用其他工作类型类,如 geventtornado 之类的异步类,请参阅此以获得更多说明: 第一次解释:

如果您预计您的应用程序代码可能需要在请求处理期间暂停较长时间,您可能还需要安装 Eventlet 或 Gevent

第二个:

默认同步工作器假定您的应用程序在 CPU 和网络带宽方面是资源受限的。一般来说,这意味着您的应用程序不应该做任何花费未定义时间的事情。例如,对 Internet 的请求符合此标准。在某些时候,外部网络会出现故障,导致客户端堆积在您的服务器上。

【讨论】:

我将如何真正利用如此不同的工人阶级?

以上是关于Gunicorn worker 超时错误的主要内容,如果未能解决你的问题,请参考以下文章

gunicorn 使用主管启动时会引发数据库错误,手动启动时是不是正常工作?

覆盖金字塔/ gunicorn中的请求超时

Gunicorn:HaltServer 'Worker 无法启动。'

NGINX 502 坏网关 gunicorn 超时

Python3+Gunicorn+Nginx 部署Flask项目

对Gunicorn文档的学习