Gunicorn Worker超时错误


182

我已经建立了与3名工人,30名工人连接并使用eventlet worker类的gunicorn。它在Nginx后面设置。在每隔几个请求之后,我就会在日志中看到这一点。

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

为什么会这样呢?我如何找出问题所在?

谢谢


2
您能够解决问题?请分享您的想法,因为我也坚持这样做。Gunicorn==19.3.1gevent==1.0.1
Black_Rider 2015年

2
找到了解决方案。将超时增加到非常大的值,然后我能够看到堆栈跟踪
Black_Rider 2015年

Answers:


154

我们在使用Django + nginx + gunicorn时遇到了同样的问题。从Gunicorn文档中,我们配置了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

9
谢谢,这是正确的答案。然后,为了节省具有许多并发连接的资源: pip install gevent,然后worker_class gevent在配置文件中或-k gevent在命令行上。
little_birdie

2
与主管一起运行,因此将其添加到conf.d / app.conf中command=/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
lukik


21

用运行Gunicorn --log-level=DEBUG

它应该给您一个应用程序堆栈跟踪。


41
就我而言,这不是。
2012年

16
现在--log-level debug
psychok7年7

4
我很想获得stracktrace,但是在使用gunicorn 19.4.5的情况下,它们都不在这里工作。显示调试内容,因此我猜该标志已被识别,但超时时未跟踪堆栈。
Orzel


6

您需要使用其他工人类型的类与gevent龙卷风类似的异步类,以了解更多说明:第一次移植:

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

第二个 :

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


我实际上将如何利用这种不同的工人阶级?
Frederick Nord

6

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

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


1
我甚至在使用gevent和正确设置超时的情况下都看到了这个问题,内存不足是问题所在
不足 bcattle 2016年

6

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

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

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

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

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

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

因此,我建议您首先检查哪些因素会使您的应用程序变慢


4

该端点是否花费太多时间?

也许您正在使用不带有异步支持的flask,所以每个请求都将阻止该调用。要创建异步支持而不造成困难,请添加gevent工作程序。

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

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

1
简单的调整..保存了我的一天!
penduDev

2

我在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

还支持其他一些答案,只是这个答案还不够:P
Achala Dissanayake


1

超时是此问题的关键参数。

但是这不适合我。

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

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

socket.recv将阻止我的代码,这就是为什么当worker> 1时总是超时的原因

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


1

这对我有用:

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

如果您eventlet添加:

--worker-class=eventlet

如果您gevent添加:

--worker-class=gevent

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.