我已经设置了gunicorn与3个工人,30个工人连接和使用eventlet工人类。它被设置在Nginx后面。每请求几次,我就会在日志里看到这个。
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
为什么会这样?我怎样才能知道哪里出了问题呢?
我已经设置了gunicorn与3个工人,30个工人连接和使用eventlet工人类。它被设置在Nginx后面。每请求几次,我就会在日志里看到这个。
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
为什么会这样?我怎样才能知道哪里出了问题呢?
当前回答
超时是这个问题的一个关键参数。
然而,它不适合我。
当我设置workers=1时,我发现没有gunicorn超时错误。
当我看我的代码,我发现一些套接字连接(套接字。在服务器init中发送& socket.recv)。
套接字。Recv将阻塞我的代码,这就是为什么它总是超时时,工人>1
希望能给那些对我有意见的人一些建议
其他回答
除了已经建议的gunicorn超时设置,因为你在前面使用nginx,你可以检查这两个参数是否有效,proxy_connect_timeout和proxy_read_timeout默认为60秒。可以在nginx配置文件中这样设置它们,
proxy_connect_timeout 120s;
proxy_read_timeout 120s;
我在Docker中也遇到了同样的问题。
在Docker中,我保持训练过的LightGBM模型+ Flask服务请求。作为HTTP服务器,我使用gunicorn 19.9.0。当我在我的Mac笔记本电脑上本地运行我的代码时,一切都很完美,但当我在Docker中运行应用程序时,我的POST JSON请求冻结了一段时间,然后gunicorn工人已经失败了[CRITICAL]工人超时异常。
我尝试了大量不同的方法,但唯一解决我的问题的是添加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
你需要使用另一个worker类型类,比如gevent或tornado。 第一个解释:
如果您预计应用程序代码在请求处理期间可能需要暂停较长时间,您可能还需要安装Eventlet或Gevent
第二点:
默认的同步工作线程假定您的应用程序在CPU和网络带宽方面受到资源限制。通常这意味着您的应用程序不应该执行任何花费未定义时间的操作。例如,对互联网的请求就符合这个标准。在某些时候,外部网络会出现故障,客户端会堆积在您的服务器上。
如果使用GCP,则必须为每个实例类型设置worker。
链接到GCP最佳实践https://cloud.google.com/appengine/docs/standard/python3/runtime
对我来说,最简单的方法是在你的app.py存在的文件夹中创建一个新的config.py文件,并在其中放入超时和所有你想要的特殊配置:
timeout = 999
然后在指向这个配置文件的同时运行服务器
gunicorn -c config.py --bind 0.0.0.0:5000 wsgi:app
注意,要使这条语句工作,还需要将wsgi.py放在具有以下内容的同一目录中
from myproject import app
if __name__ == "__main__":
app.run()
干杯!