我已经设置了3个工人30个工人连接和使用eventlet工人类的gunicorn。它是在Nginx背后设置的。在每几个请求之后,我在日志中看到了这一点。
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
为什么会这样?我怎么能弄清楚什么是错的?
感谢
答案 0 :(得分:119)
使用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
答案 1 :(得分:17)
使用--log-level=DEBUG
运行Gunicorn。
它应该为您提供应用程序堆栈跟踪。
答案 2 :(得分:17)
在Google Cloud上
只需将--timeout 90
添加到app.yaml
entrypoint: gunicorn -b :$PORT main:app --timeout 90
答案 3 :(得分:9)
可能是这个吗? http://docs.gunicorn.org/en/latest/settings.html#timeout
其他可能性可能是你的反应时间过长或等待时间过长。
答案 4 :(得分:8)
此端点是否花费太多时间?
也许您正在使用不带有异步支持的flask,所以每个请求都将阻止该调用。要轻松创建异步支持,请添加gevent
工作器。
使用gevent,新的调用将产生一个新线程,您的应用将能够接收更多请求
pip install gevent
gunicon .... --worker-class gevent
答案 5 :(得分:6)
您需要使用其他工作类型类,如 gevent 或 tornado 等异步,请参阅此更多说明: 第一个解释:
如果您希望应用程序代码在请求处理期间需要长时间暂停,则可能还需要安装Eventlet或Gevent
第二个:
默认同步工作者假定您的应用程序在CPU和网络带宽方面受资源限制。通常这意味着您的应用程序不应该执行任何需要不确定时间的事情。例如,对互联网的请求符合此标准。在某些时候,外部网络将以客户端堆积在服务器上的方式失败。
答案 6 :(得分:6)
我遇到了类似的问题,我也尝试使用“runserver”来查看是否能找到任何内容,但我所拥有的只是一条消息Killed
所以我认为这可能是资源问题,我继续为实例提供更多内存,并且它有效。
答案 7 :(得分:6)
用于在 Azure 应用服务(Linux 应用)上运行 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
答案 8 :(得分:3)
WORKER TIMEOUT
表示您的应用程序无法在定义的时间内响应请求。您可以使用gunicorn timeout settings进行设置。某些应用程序需要比其他应用程序更多的时间来响应。
可能会影响此的另一件事是choosing the worker type
默认同步工作器假定您的应用程序在CPU和网络带宽方面受资源限制。通常,这意味着您的应用程序不应执行任何花费时间不确定的事情。花费时间不确定的一个例子是对互联网的请求。在某些时候,外部网络将以客户端将堆积在您的服务器上的方式失效。因此,从这个意义上讲,任何向API发出传出请求的Web应用程序都将从异步工作程序中受益。
当遇到与您相同的问题时(我试图使用Docker Swarm部署应用程序),我试图增加超时时间并使用另一种类型的worker类。但是都失败了。
然后我突然意识到我将我的资源限制为太低,用于我的撰写文件中的服务。就我而言,这就是使应用程序变慢的原因
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
因此,我建议您首先检查哪些因素会使您的应用程序变慢
答案 9 :(得分:3)
这对我有用:
gunicorn app:app -b :8080 --timeout 120 --workers=3 --threads=3 --worker-connections=1000
如果您有eventlet
,请添加:
--worker-class=eventlet
如果您有gevent
,请添加:
--worker-class=gevent
答案 10 :(得分:1)
如果使用的是GCP,则必须为每种实例类型设置工作程序。
链接到GCP最佳做法https://cloud.google.com/appengine/docs/standard/python3/runtime
答案 11 :(得分:1)
超时是解决此问题的关键参数。
但是这不适合我。
当我设置worker = 1时,我发现没有gunicorn超时错误。
当我查看我的代码时,我在服务器初始化中发现了一些 socket连接(socket.send和socket.recv)。
socket.recv将阻止我的代码,这就是为什么当worker> 1
时总是超时的原因希望向对我有问题的人提供一些想法
答案 12 :(得分:0)
我在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
答案 13 :(得分:0)
对我来说,解决方案是将--timeout 90
添加到我的入口点,但是没有用,因为我定义了两个入口点,一个在app.yaml中,另一个在我的Dockerfile中。我删除了未使用的入口点,并在另一个入口点添加了--timeout 90
。
答案 14 :(得分:0)
对我来说,这是因为我忘记为Django在数据库服务器上设置防火墙规则。
答案 15 :(得分:0)
弗兰克的回答为我指明了正确的方向。我有一个Digital Ocean小滴正在访问一个托管的Digital Ocean Postgresql数据库。我要做的就是将我的小滴添加到数据库的“受信任的源”中。
(在DO控制台中单击数据库,然后单击设置。编辑Trusted Sources并选择Droplet名称(在可编辑区域中单击,将向您建议)。