gunicorn uvicorn worker.py如何遵守limit_concurrency设置

问题描述

https://www.uvicorn.org/settings/

所述,FastAPI使用gunicorn来启动uvicorn工作者。

然而,如https://github.com/encode/uvicorn/issues/343

所述,gunicorn不允许使用自定义设置启动uvicorn。

该问题建议覆盖源文件中的config_kwargs,例如https://github.com/encode/uvicorn/blob/master/uvicorn/workers.py

我们尝试过,但是uvicorn不遵守源代码中多个uvicorn文件中的设置limit_concurrency

https://github.com/encode/uvicorn/blob/master/uvicorn/workers.py

# fail

        config_kwargs = {
            "app": None,"log_config": None,"timeout_keep_alive": self.cfg.keepalive,"timeout_notify": self.timeout,"callback_notify": self.callback_notify,"limit_max_requests": self.max_requests,"limit_concurrency": 10000,"forwarded_allow_ips": self.cfg.forwarded_allow_ips,}

https://github.com/encode/uvicorn/blob/master/uvicorn/main.py

# fail

    kwargs = {
        "app": app,"host": host,"port": port,"uds": uds,"fd": fd,"loop": loop,"http": http,"ws": ws,"lifespan": lifespan,"env_file": env_file,"log_config": LOGGING_CONFIG if log_config is None else log_config,"log_level": log_level,"access_log": access_log,"interface": interface,"debug": debug,"reload": reload,"reload_dirs": reload_dirs if reload_dirs else None,"workers": workers,"proxy_headers": proxy_headers,"forwarded_allow_ips": forwarded_allow_ips,"root_path": root_path,"backlog": backlog,"limit_max_requests": limit_max_requests,"timeout_keep_alive": timeout_keep_alive,"ssl_keyfile": ssl_keyfile,"ssl_certfile": ssl_certfile,"ssl_version": ssl_version,"ssl_cert_reqs": ssl_cert_reqs,"ssl_ca_certs": ssl_ca_certs,"ssl_ciphers": ssl_ciphers,"headers": list([header.split(":") for header in headers]),"use_colors": use_colors,}

如何迫使uvicorn遵守此设置?我们仍然从FastAPI收到503错误

-------更新----------- 发出100个并行请求并分配给许多工作人员时,gunicorn设置--worker-connections 1000仍会导致503。

但是,我认为这是一个更为复杂的问题:我们的API端点完成了很多繁重的工作,通常需要5秒才能完成。

具有2个核心,2个工人的压力测试:

  • A。超过100个并发请求,端点重载--worker-connections 1
  • B。超过100个并发请求,端点负担很重-工人连接数为1000
  • C。超过100个并发请求,端点低负载--worker-connections 1
  • D。 100个以上并发请求,端点低负载-工人连接数1000

两个实验A和B都产生了503个响应,因此,假设worker-connections设置确实起作用,太多的模拟连接似乎不会导致我们的503错误。

我们对此行为感到困惑,因为我们期望gunicorn / uvicorn能够将工作排入队列,并且不会抛出503错误。

解决方法

gunicorn doc

worker-connections

并发客户端的最大数量。

和来自uvicorn doc

limit-concurrency

在发出HTTP 503响应之前,允许的最大并发连接数或任务数。

根据此信息,两个设置变量执行相同的操作。所以

uvicorn --limit-concurrency 100 application:demo_app

几乎相同
gunicorn --worker-connections 100 -k uvicorn.workers.UvicornWorker application:demo_app

注意:我尚未对此进行任何真实测试,如果我错了,请纠正我。


此外,您可以通过将 limit-concurrency 子类化来设置 limit_concurrency (或 uvicorn.workers.UvicornWorker )课

from uvicorn.workers import UvicornWorker


class CustomUvicornWorker(UvicornWorker):
    CONFIG_KWARGS = {
        "loop": "uvloop","http": "httptools","limit_concurrency": 100
    }

,现在将此CustomUvicornWorkergunicorn命令一起使用,

gunicorn -k path.to.custom_worker.CustomUvicornWorker application:demo_app

注意:您可以检查self.config.limit_concurrency类中的CustomUvicornWorker,以确保正确设置了值。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...