gunicorn偶尔会在带有flask的微不足道的docker web应用程序中冻结,直到工作超时

gunicorn偶尔会在带有flask的微不足道的docker web应用程序中冻结,直到工作超时,docker,flask,gunicorn,Docker,Flask,Gunicorn,我用flask和gunicorn构建了一个微不足道的docker web应用程序。一切正常,但偶尔在发出请求时,响应会挂起。我在日志中看不到任何东西,直到工人超时。因此,工作人员似乎正在忙于某件事情,超时,然后一个新的工作人员拿起请求并立即响应 我只安排了一个工人。我知道我可以再加一个工人。但是除了我的手动戳之外,没有其他要求。没有别的事情发生。所以我非常好奇这个工人或gunicorn大师工人在容器中还会做什么(心跳,那么昂贵的错误处理) 我的Dockerfile: FROM python:3.

我用flask和gunicorn构建了一个微不足道的docker web应用程序。一切正常,但偶尔在发出请求时,响应会挂起。我在日志中看不到任何东西,直到工人超时。因此,工作人员似乎正在忙于某件事情,超时,然后一个新的工作人员拿起请求并立即响应

我只安排了一个工人。我知道我可以再加一个工人。但是除了我的手动戳之外,没有其他要求。没有别的事情发生。所以我非常好奇这个工人或gunicorn大师工人在容器中还会做什么(心跳,那么昂贵的错误处理)

我的Dockerfile:

FROM python:3.6-slim

WORKDIR /app

COPY . .

RUN pip install -r requirements.txt --no-cache-dir

EXPOSE 5000

CMD ["gunicorn", "-w", "1", "-t", "30", "--worker-tmp-dir", "/dev/shm", "-b", "0.0.0.0:5000", "app:app"]
我的小应用程序:

import logging
import model
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.errorhandler(Exception)
def handle_error(e):
    code = 500
    app.log_exception(e)
    return jsonify(message=str(e)), code

@app.route("/predict", methods=["POST", "GET"])
def predict():
    result = model.predict(None)
    return jsonify(result)

model = model.mcascorer()

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0')
else:
    gunicorn_logger = logging.getLogger('gunicorn.error')
    app.logger.handlers = gunicorn_logger.handlers
    app.logger.setLevel(gunicorn_logger.level)
我的超小型“模型”我称之为:

class mcascorer:

    def predict_proba(self, features):
        return 'hello'

    def predict(self, features):
        return 'hello'
通常会立即响应,但在超时期间,日志如下所示:

[2020-05-21 18:09:28 +0000] [9] [DEBUG] Closing connection.

[2020-05-21 18:09:58 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:9)

[2020-05-21 18:09:58 +0000] [9] [INFO] Worker exiting (pid: 9)

[2020-05-21 18:09:58 +0000] [11] [INFO] Booting worker with pid: 11

[2020-05-21 18:09:58 +0000] [11] [DEBUG] GET /predict
这名工人似乎被其他事情阻止了,但我不知道那会是什么。同时传入的heartbeat查询不应该花费那么长的时间,但它会挂起很多秒——实际上是我为worker设置的整个超时时间。唯一发生的另一件事是错误日志记录,但不确定为什么会阻塞或花费这么长时间。即使它正在写入磁盘,这看起来也很奇怪

我能找到的最接近的问题是: 以下是本文的链接:

我按照他们的指导更新了tmp内存位置的Dockerfile--worker tmp dir“,“/dev/shm”


我没有增加更多的工人。我知道我可以,但我真的很想知道发生了什么,而不是盲目地投入资源。任何想法都非常感谢

我们有同样的问题。您成功地处理了描述的问题吗?对不起,我没有。最简单的第一件事可能是增加工人。基本上,一个worker在某些事情上被阻塞,必须先引导,然后重新启动,然后一切恢复正常。你可以检查我的链接,以防其他文章解决你的问题。我最好的猜测是这是我的操作系统设置(我在虚拟机中开发)。工作者可能会阻塞系统资源,比如试图访问一些虚拟内存。然后必须重新启动工作进程。这应该出现在操作系统日志的某个地方,或者可能是虚拟机。因为这似乎是在有规律的时间间隔内发生的,所以可能是心跳或写日志。