gunicorn 没有使用所有 CPU,导致大量超时请求

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

我正在 AWS EC2 机器上对 Gunicorn 服务器(使用带有 fastapi 的 Uvicorn 工作程序)进行负载测试,我将其连接到并映射到端口(做

ssh -L 8000:localhost:8000
),以便将本地机器上端口 8000 上的所有请求路由到EC2机器。

我正在使用 k6 从本地计算机为 EC2 实例中的 Gunicorn 服务器生成人工流量(负载测试)。仅使用 500-800 vus,超过 46% 的请求总是失败,但 EC2 机器的 CPU 使用率对于 8 个核心中的任何一个都不会超过 30%(来自

htop
)。我正在使用 c5a.2xlarge 机器(有 4 核或 8 线程)。

这是我从终端启动 Gunicorn 的方法(由于配置,gunicorn 启动时有 4 个工作人员):

$ gunicorn api.main:app --worker-class uvicorn.workers.UvicornWorker --user dockerd --capture-output --keep-alive 0 --port 8000

我使用的配置文件是来自tiangolo的uvicorn-gunicorn-docker

这是一个 fastapi 应用程序,提供 scikit-learn 模型,无需调用任何数据库或类似的东西。所以,这是一个完全受 CPU 限制的应用程序。

我很乐意根据需要提供更多信息。

我在 uvicorn 或 Gunicorn 中进行了哪些更改以及哪些更改,以便能够以尽可能低的失败率来服务大量请求,同时最大限度地使用所有资源(或在需要的范围内)。

performance load gunicorn fastapi uvicorn
2个回答
3
投票

我认为问题出在 UvicornWorker 上。对于 scikit-learn 模型,最好使用 CPU-bound。将其更改为 --worker-class=gthread


2
投票

请检查您实例的平均负载。 CPU 可能并未达到最大极限,因为磁盘已成为瓶颈。如果您的平均负载表明有多个作业堆积,但 CPU 百分比没有上升,则可能意味着磁盘延迟。

最好删除所有日志。平均负载可在“sudo htop”中找到。你可以查一下。我现在很确定你的问题是磁盘

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