我已经建立了与3名工人,30名工人连接并使用eventlet worker类的gunicorn。它在Nginx后面设置。在每隔几个请求之后,我就会在日志中看到这一点。
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
为什么会这样呢?我如何找出问题所在?
谢谢
我已经建立了与3名工人,30名工人连接并使用eventlet worker类的gunicorn。它在Nginx后面设置。在每隔几个请求之后,我就会在日志中看到这一点。
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
为什么会这样呢?我如何找出问题所在?
谢谢
Answers:
我们在使用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
pip install gevent
,然后worker_class gevent
在配置文件中或-k gevent
在命令行上。
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
用运行Gunicorn --log-level=DEBUG
。
它应该给您一个应用程序堆栈跟踪。
--log-level debug
可能是这个吗? http://docs.gunicorn.org/en/latest/settings.html#timeout
其他可能性可能是您的响应时间太长或等待时间太长。
您需要使用其他工人类型的类与gevent或龙卷风类似的异步类,以了解更多说明:第一次移植:
如果您希望应用程序代码在请求处理期间可能需要暂停较长时间,则可能还需要安装Eventlet或Gevent。
第二个 :
默认的同步工作程序假定您的应用程序在CPU和网络带宽方面受资源限制。通常,这意味着您的应用程序不应执行任何花费不确定时间的事情。例如,对Internet的请求符合此条件。在某些时候,外部网络将以客户端将堆积在您的服务器上的方式失效。
我遇到了非常类似的问题,我也尝试使用“ runserver”来查看是否可以找到任何东西,但我所收到的只是一条消息 Killed
因此,我认为这可能是资源问题,因此我继续为实例提供更多的RAM,并且它可以正常工作。
WORKER TIMEOUT
意味着您的应用程序无法在规定的时间内响应请求。您可以使用gunicorn超时设置进行设置。某些应用程序比其他应用程序需要更多时间来响应。
可能会影响此的另一件事是选择工作人员类型
默认的同步工作程序假定您的应用程序在CPU和网络带宽方面受资源限制。通常,这意味着您的应用程序不应执行任何花费不确定时间的事情。花费时间不确定的一个例子是对互联网的请求。在某些时候,外部网络将以客户端将堆积在您的服务器上的方式失效。因此,从这个意义上讲,任何向API发出传出请求的Web应用程序都将从异步工作程序中受益。
当遇到与您相同的问题时(我试图使用Docker Swarm部署应用程序),我试图增加超时时间并使用另一种类型的worker类。但是一切都失败了。
然后我突然意识到我对我的撰写文件中的服务而言,资源限制太低了。在我看来,这是减慢应用程序速度的原因
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
因此,我建议您首先检查哪些因素会使您的应用程序变慢
该端点是否花费太多时间?
也许您正在使用不带有异步支持的flask,所以每个请求都将阻止该调用。要创建异步支持而不造成困难,请添加gevent
工作程序。
使用gevent,新的调用将产生一个新线程,您的应用将能够接收更多请求
pip install gevent
gunicon .... --worker-class gevent
我在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
如果使用的是GCP,则必须为每种实例类型设置工作程序。
链接到GCP最佳做法https://cloud.google.com/appengine/docs/standard/python3/runtime
Gunicorn==19.3.1
和gevent==1.0.1