Gunicorn工人超时错误

Joh*_*ohn 152 gunicorn

我设置了gunicorn与3名工人30个工人连接并使用eventlet工人类.它是在Nginx背后设置的.在每几个请求之后,我在日志中看到了这一点.

[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我怎么能弄清楚什么是错的?

谢谢

Ami*_*mor 129

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

经过一些测试,我们找到了解决方案,配置的参数是:timeout(而不是graceful timeout).它就像一个时钟..

所以,做:

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
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这是正确的答案.然后,为了节省许多并发连接的资源:`pip install gevent`,然后在配置文件中使用`worker_class gevent`或在命令行使用`-k gevent`. (7认同)
  • 与主管一起运行,因此将其添加到** conf.d / app.conf **中:`command = / opt / env_vars / run_with_env.sh / path / to / environment_variables / path / to / gunicorn --timeout 200 --workers 3-绑定unix:/ path / to / socket server.wsgi:application (2认同)

Apo*_*wal 24

在Google Cloud上只需添加--timeout 90到入口点即可app.yaml

entrypoint: gunicorn -b :$PORT main:app --timeout 90
Run Code Online (Sandbox Code Playgroud)


gwi*_*wik 18

运行Gunicorn --log-level=DEBUG.

它应该给你一个应用程序堆栈跟踪.

  • 它不在我的情况下. (40认同)
  • 它现在是`--log-level debug` (15认同)
  • 此处相同,启用标志后没有堆栈跟踪 (5认同)
  • 我很想得到一个stracktrace,但没有一个在这里工作,使用gunicorn 19.4.5.显示调试内容,所以我想标志已被识别,但超时时没有堆栈跟踪. (3认同)

has*_*ash 12

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

可能影响此的另一件事是选择工人类型

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

当我遇到和你一样的问题时(我试图使用 Docker Swarm 部署我的应用程序),我试图增加超时并使用另一种类型的工作类。但都失败了。

然后我突然意识到我将我的资源限制在我撰写文件中的服务中太低了。在我的情况下,这就是减慢应用程序的原因

deploy:
  replicas: 5
  resources:
    limits:
      cpus: "0.1"
      memory: 50M
  restart_policy:
    condition: on-failure
Run Code Online (Sandbox Code Playgroud)

所以我建议你首先检查是什么导致了你的应用程序变慢


Ram*_*ros 11

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

也许您使用的flask 没有异步支持,所以每个请求都会阻塞调用。要在不困难的情况下创建异步支持,请添加gevent工作人员。

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

pip install gevent
gunicon .... --worker-class gevent
Run Code Online (Sandbox Code Playgroud)


Ran*_*anc 9

可能是这个吗? http://docs.gunicorn.org/en/latest/settings.html#timeout

其他可能性可能是你的反应太长或者等待时间过长.

  • 此URL现在是http://docs.gunicorn.org/en/latest/settings.html#timeout (5认同)

Art*_*ika 8

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

在 Docker 中,我保持训练LightGBM模型 +Flask服务请求。作为我使用的 HTTP 服务器gunicorn 19.9.0。当我在 Mac 笔记本电脑上本地运行我的代码时,一切都运行得非常完美,但是当我在 Docker 中运行应用程序时,我的 POST JSON 请求冻结了一段时间,然后gunicorn工作人员一直失败并出现[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
Run Code Online (Sandbox Code Playgroud)


小智 6

您需要使用其他工作类型类,如geventtornado这样的异步,请参阅此更多解释:第一个解释:

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

第二个 :

默认的同步工作者假定您的应用程序在CPU和网络带宽方面受资源限制.通常这意味着您的应用程序不应该执行任何需要不确定时间的事情.例如,对互联网的请求符合此标准.在某些时候,外部网络将以客户端堆积在服务器上的方式失败.


Jam*_*Lin 6

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

因此,我认为这可能是资源问题,因此我继续为实例提供更多的RAM,并且它可以正常工作。

  • 即使使用 gevent 并且超时设置正确,我也看到了这个问题,内存不足是问题所在 (2认同)

Cha*_*sal 6

在 Azure 应用服务(Linux 应用)上运行 Flask 应用的 Microsoft Azure 官方文档声明使用超时为 600

gunicorn --bind=0.0.0.0 --timeout 600 application:app
Run Code Online (Sandbox Code Playgroud)

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

  • 似乎有点过分,但我确实很欣赏这是官方文档,所以我会同意它。 (2认同)

小智 5

这对我有用:

gunicorn app:app -b :8080 --timeout 120 --workers=3 --threads=3 --worker-connections=1000
Run Code Online (Sandbox Code Playgroud)

如果您有eventlet添加:

--worker-class=eventlet
Run Code Online (Sandbox Code Playgroud)

如果您有gevent添加:

--worker-class=gevent
Run Code Online (Sandbox Code Playgroud)

  • 有趣的事实,“--worker-class”和“-k”是类似的,还有“--timeout”和“-t” (4认同)