FastAPI Gunicorn Uvicorn 用于使用 Google Cloud Run 进行生产部署(压力测试)

Rud*_*tra 7 stress-testing gunicorn fastapi uvicorn

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

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

截图来自2021-02-18 12-29-26

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

截图来自 2021-02-18 12-20-05

从上面我尝试过:

  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
Run Code Online (Sandbox Code Playgroud)

这是我的 Dockerfile 案例 2(带有 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
Run Code Online (Sandbox Code Playgroud)

这是我的 Dockerfile 案例 3(带有 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"]
Run Code Online (Sandbox Code Playgroud)

这里我就糊涂了,从上面的结果看,它们的结果是差不多的,上面三种方法有什么区别呢?哪一种最适合生产?对不起,我是生产部署 API 的新手。我需要一些关于这个案子的建议。谢谢

这是我的 Cloud Run 命令

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
Run Code Online (Sandbox Code Playgroud)

Nei*_*eil 11

有人建议可以通过添加以下内容来获得3x加速:uvicorngunicorn

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

有关更多详细信息和基准,请参阅:/sf/answers/4439957301/


Jan*_*dez 8

根据你的例子,我注意到第一个容器正在使用gunicorn的微调版本,也在tiangolo的github页面中提到

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

从我的角度来看,这可以通过对 Gunicorn 工作线程执行动态缩放和/或使用 Cpython 模块来实现。

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

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

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