当前位置: 首页 > 知识库问答 >
问题:

FastAPI Gunicorn Uvicorn用于通过Google云运行进行生产部署(压力测试)

单于越
2023-03-14

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

我曾尝试使用JMeter和线程属性对它们进行压力测试:

通过这些,我得到了结果:

从上面我试过:

  1. 带天戈罗基地的Dockerfile

这是我案例1(天戈罗基地)的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 base):

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的新手。我需要一些关于这个案子的建议。非常感谢。

这是我的云运行命令

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

共有2个答案

郎鹤龄
2023-03-14

有人建议,可以通过添加Gunicorn来获得比uvicorn更快的3x

gunicorn-w4-kuvicorn。工人。UvicornWorker主:应用程序

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

慕容越泽
2023-03-14

根据您的示例,我注意到第一个容器使用的是经过微调的gunicorn版本,也在tiangolo的github页面中提到

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

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

第二个容器和第三个容器之间的区别是您为服务定义的工作线程的数量,在第二个容器中,您只有一个工作线程和8个线程,如果您使用配置,您可以提高性能,如本文所述。

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

另一方面,使用普通python图像可以定制图像,而不用担心会破坏某些东西,但这需要一些时间才能获得与tiangolodocker相同的性能。

 类似资料:
  • 压力测试很有趣,一开始好像压测的目的是找出系统在负载下能不能工作。现实中,系统在负载下确实能工作,但在负载足够重的某些情况下不能工作。我把这叫做碰壁或撞响[1]。可能会有例外,但大多数情况下会有这么一堵“墙”。压测的目的是为了指出墙在哪里,然后弄清楚怎么把墙移得更远些。 压测计划需要在工程的早期就规划好,因为它经常有助于弄清楚到底什么是被期望的。两秒的网页请求是一个悲伤的失败还是一个了不起的成功?

  • 问题内容: 是否可以对Android系统进行压力测试,以检查如果可用内存减少(以及因此杀死了哪些应用程序,…)会发生什么情况。 我目前有一个测试应用程序,该应用程序会定期在向量中分配10MB。但是,抛出OutOfMemory异常达到500MB。但是被测系统没有受到足够的影响。我需要获取更多的内存。 是否有任何已知的库/程序要使用,或者有其他任何方法可以使应用程序使用超过500MB的内存。 补充:我

  • 问题内容: 我正在尝试使用的插件(jmeter- websocket )对服务器进行压力测试。关键是该插件没有附带文档说明如何使用它,因此我不确定是否支持我的期望。 我设法使用提到的插件运行了一个示例测试,它已成功连接到服务器。它也设法与服务器进行通信,但是一旦完成接收到第一个响应,它就会断开连接。我希望以某种方式配置此插件,以便它将与服务器保持持久的连接几分钟,在断开连接之前发送和接收一些消息。

  • 我正在使用Maven将WAR文件部署到AWS。我计划使用'MVN Deploy',这将把war文件ssh到AWS。我关注http://maven.apache.org/plugins/maven-deploy-plugin/examples/deploy-ssh-external.html。 这是我的POM文件 但是当我运行mvn clean deploy时,我收到了这个… 提前谢了。

  • 嗨,我是JMeter的新手,我知道如何使用JMeter执行负载测试。我试图弄清楚压力测试或容量测试是如何通过JMeter执行的。是不是通过逐渐增加JMeter中的线程数,我们可以确定何时出现性能问题,并获得阈值,在阈值以上运行测试。那它会做压力测试吗? 在如何执行压力测试和能力测试与Jeter工具混淆。

  • 二进制运行 git clone https://github.com/apache/shardingsphere-ui.git; 运行 mvn clean install -Prelease; 获取安装包 /shardingsphere-ui/shardingsphere-ui-distribution/target/apache-shardingsphere-${latest.release.v