【问题标题】:FastAPI Gunicorn Uvicorn for Production Deployment with Google Cloud Run (Stress Testing)FastAPI Gunicorn Uvicorn 使用 Google Cloud Run 进行生产部署(压力测试)
【发布时间】:2021-05-21 01:48:20
【问题描述】:

这里想问一下,用python运行gunicorn uvicorn,和默认从tiangolo有什么区别?

我尝试使用带有线程属性的JMeter 对这些进行压力测试:

从这些,我得到了结果::

从上面我试过了:

  1. 带有 tiangolo 基础的 Dockerfile
  2. 带有 python:3.8-slim-buster 的 Dockerfile 并使用 gunicorn 命令运行它
  3. 使用 python:3.8-slim-buster 的 Dockerfile 并使用 python 运行它

这是案例 1(Tiangolo 基础)的 Dockerfile:

FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8-slim
RUN apt-get update && apt-get install wget gcc -y
RUN mkdir -p /app
WORKDIR /app
COPY ./requirements.txt /app/requirements.txt
RUN python -m pip install --upgrade pip
RUN pip install --no-cache-dir -r /app/requirements.txt
COPY . /app

这是我的案例 2 的 Dockerfile(带有 gunicorn 命令的 Python 库):

FROM python:3.8-slim-buster as builder
RUN apt-get update --fix-missing
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y libgl1-mesa-dev python3-pip git
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip3 install -U setuptools
RUN pip3 install --upgrade pip
RUN pip3 install -r ./requirements.txt
COPY . /usr/src/app
ENTRYPOINT gunicorn --bind :8080 --workers 1 --threads 8 main:app --worker-class uvicorn.workers.UvicornH11Worker --preload --timeout 60 --worker-tmp-dir /dev/shm

这是我的案例 3 的 Dockerfile(带有 python 命令的 Python 基础):

FROM python:3.8-slim-buster
RUN apt-get update --fix-missing
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y libgl1-mesa-dev python3-pip git
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip3 install -U setuptools
RUN pip3 install --upgrade pip
RUN pip3 install -r ./requirements.txt --use-feature=2020-resolver
COPY . /usr/src/app
CMD ["python3", "/usr/src/app/main.py"]

这里我很困惑,从上面的结果看起来它们的结果几乎相同,上面三种方法有什么区别?哪一个最适合生产?对不起,我是生产部署 API 的新手。我需要一些关于这个案子的建议。谢谢

这是我的 Cloud Run 命令

gcloud builds submit --tag gcr.io/gaguna3/priceengine

gcloud run deploy backend-pure-python \
    --image="gcr.io/gaguna3/priceengine" \
    --region asia-southeast2 \
    --allow-unauthenticated \
    --platform managed \
    --memory 4Gi \
    --cpu 2 \
    --timeout 900 \
    --project=gaguna3

【问题讨论】:

  • 如果您在本地环境中运行这些测试,您是否收到相同的性能差异?
  • @JanHernandez 当我在本地尝试时,它仍然得到相同的结果
  • 请直接运行单个 Uvicorn worker 进行测试,而不是通过 gunicorn 运行它。我觉得这最适合 Cloud Run 的工作方式。

标签: gunicorn fastapi stress-testing uvicorn


【解决方案1】:

根据您的示例,我注意到第一个容器使用的是微调版本的 gunicorn,在 tiangolo's github page 中也提到了

此图像包含“自动调整”机制,因此您只需添加代码并自动获得相同的高性能。

在我看来,这可以通过对 gunicorn worker 执行动态缩放和/或使用 Cpython 模块来实现。

第二个和第三个容器之间的区别在于您为服务定义的工作人员数量,在第二个容器中,您只有 1 个工作人员和 8 个线程,如果您使用您的配置,您可以提高性能,因为在这个article上提到。

使用tiangolo/uvicorn-gunicorn 不是一个坏主意,但我建议您锁定容器的版本,这是为了防止将来的更改影响您的生产环境。

另一方面,使用 vanilla python 图像可以让您自定义图像而不必担心破坏某些东西,但这需要一些时间才能获得与tiangolo docker 相同的性能。

【讨论】:

    【解决方案2】:

    有人建议通过添加gunicorn 来获得3x 超过uvicorn 的加速,例如:

    gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app

    有关更多详细信息和基准,请参阅:https://stackoverflow.com/a/63427961/2705777

    【讨论】:

      猜你喜欢
      • 2021-08-17
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      相关资源
      最近更新 更多