Gunicorn:工作线程超时并且工作线程在所有容器上退出

问题描述 投票:0回答:2

我的问题的一些背景知识:
我有以下 Gunicorn 配置文件:

gunicorn_cofig.py

pidfile = 'app.pid'
worker_tmp_dir = '/dev/shm'
worker_class = 'gthread'
workers = 1
worker_connections = 1000
timeout = 30
keepalive = 1
threads = 2
proc_name = 'app'
bind = '0.0.0.0:8080'
backlog = 2048
accesslog = '-'
errorlog = '-'

最初,我运行一个 Flask 应用程序,Docker 中的 Nginx 和 Gunicorn 从未出现过问题。后来我添加了另一个应用程序并配置了我的 Nginx 将来自不同子域的请求重定向到不同端口(例如 mydomain.com -> 端口 81 和 app.mydomain.com -> 端口 5000)(如果我理解正确,因为我将所有子域绑定到来自所有子域的相同 IP(我使用 LetsEncrypt)请求到达端口 443,然后 Nginx 将它们反向代理到相应的端口)。为此,我只是在新应用程序中复制粘贴相同的

gunicorn_cofig.py
,并且工作正常。

现在我添加了 6 个应用程序,并且在所有应用程序中使用相同的配置文件,但出现以下错误:

app1           [2022-01-13 05:30:26 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:9)
app1          | [2022-01-13 05:30:26 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:10)
app1          | [2022-01-13 05:30:26 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:11)
app1          | [2022-01-13 05:30:26 +0000] [11] [INFO] Worker exiting (pid: 11)
app1          | [2022-01-13 05:30:26 +0000] [9] [INFO] Worker exiting (pid: 9)
app1          | [2022-01-13 05:30:26 +0000] [10] [INFO] Worker exiting (pid: 10)
app1          | [2022-01-13 05:30:27 +0000] [1] [WARNING] Worker with pid 9 was terminated due to signal 9
app1          | [2022-01-13 05:30:27 +0000] [1] [WARNING] Worker with pid 11 was terminated due to signal 9
app1          | [2022-01-13 05:30:27 +0000] [12] [INFO] Booting worker with pid: 12
app1          | [2022-01-13 05:30:27 +0000] [1] [WARNING] Worker with pid 10 was terminated due to signal 9
app1         | [2022-01-13 05:30:27 +0000] [13] [INFO] Booting worker with pid: 13
app2         | [2022-01-13 05:30:27 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:9)
app2         | [2022-01-13 05:30:27 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:10)
app2         | [2022-01-13 05:30:27 +0000] [10] [INFO] Worker exiting (pid: 10)
app2         | [2022-01-13 05:30:27 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:11)
app2         | [2022-01-13 05:30:27 +0000] [9] [INFO] Worker exiting (pid: 9)
app1         | [2022-01-13 05:30:27 +0000] [14] [INFO] Booting worker with pid: 14

等等,对于每个应用程序。

我尝试将

proc_name = 'app'
更改为不同的值,但发生了同样的事情。这是我的 docker compose 文件的片段,我在其中运行 Gunicorn 命令:

m:
    build:
      dockerfile: ./m/Dockerfile 
      context: ../../
    command: gunicorn --bind 0.0.0.0:82 --workers 3 ${M_FLASK_APP}:app
    environment:
      - FLASK_ENV=${FLASK_ENV}
      - PYTHONUNBUFFERED=1
    ports:
      - 82:82
    volumes:
      - ./m/src:/opt/m
  
 p:
    build:
      dockerfile: ./p/Dockerfile 
      context: ../../
    command: gunicorn --bind 0.0.0.0:83 --workers 3 ${P_FLASK_APP}:app
    environment:
      - FLASK_ENV=${FLASK_ENV}
      - PYTHONUNBUFFERED=1
    ports:
      - 83:83
    volumes:
      - ./p/src:/opt/p

有人可以引导我走向正确的方向吗?是gunicorn配置问题还是docker问题(因为我运行了6个应用程序和1个nginx服务器)?

python docker nginx flask gunicorn
2个回答
0
投票

我通过升级我的 Compute Engine 实例(我使用的是 Google Cloud)解决了这个问题。之前我有 2 个 CPU 核心和 4GB RAM,并将其更改为 4 个 CPU 核心和 4GB RAM、CPU 优化的机器。现在我可以在同一个实例上托管 6 个以上的应用程序,但成本要高得多。显然,上述错误的原因是硬件限制。


0
投票

在 GCP 应用引擎上遇到了这个问题。根本问题是用

-k gevent
添加线程到
entrypoint: gunicorn -b :$PORT core.wsgi:application
。我不确定为什么它不起作用,因为它适用于另一个尽管较小的应用程序。正如其他人提到的,这可能与内存有关,但我将大小从 F1 增加到 F2,并检查显然只使用了 110mb。但只要我删除
-k gevent
它就起作用了。

© www.soinside.com 2019 - 2024. All rights reserved.