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