【问题标题】:gunicorn uvicorn worker.py how to honor limit_concurrency settinggunicorn uvicorn worker.py 如何遵守 limit_concurrency 设置
【发布时间】:2020-12-07 20:03:24
【问题描述】:

FastAPI 使用 gunicorn 启动 uvicorn 工作者,如 https://www.uvicorn.org/settings/ 中所述

但是 gunicorn 不允许使用 https://github.com/encode/uvicorn/issues/343 中提到的自定义设置启动 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,
        "limit_concurrency": 10000,
        "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 错误

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

不过,我认为这是一个稍微复杂一点的问题:我们的 API 端点做了大量繁重的工作,通常需要 5 秒才能完成。

2 个核心、2 个工作人员的压力测试:

  • A. 100+ 并发请求,端点重负载 --worker-connections 1
  • 乙。 100+ 并发请求,端点重负载 --worker-connections 1000
  • C. 100+ 并发请求,端点低负载 --worker-connections 1
  • D. 100+ 并发请求,端点低负载 --worker-connections 1000

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

我们对这种行为感到困惑,因为我们希望 gunicorn/uvicorn 将工作排队,而不是抛出 503 错误。

【问题讨论】:

    标签: concurrency gunicorn fastapi uvicorn concurrency-limits


    【解决方案1】:

    来自gunicorn doc

    worker-connections

    同时客户端的最大数量。

    来自uvicorn doc

    limit-concurrency

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

    根据此信息,两个设置变量都在做同样的事情。所以

    uvicorn <b>--limit-concurrency 100</b> application:demo_app

    几乎一样

    gunicorn <b>--worker-connections 100</b> -k uvicorn.workers.UvicornWorker application:demo_app

    注意:我没有对此进行任何真正的测试,如果我错了,请纠正我。


    另外,您可以通过继承 uvicorn.workers.UvicornWorker 类来设置 limit-concurrency(或 limit_concurrency

    from uvicorn.workers import UvicornWorker
    
    
    class CustomUvicornWorker(UvicornWorker):
        CONFIG_KWARGS = {
            "loop": "uvloop",
            "http": "httptools",
            "limit_concurrency": 100
        }

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

    gunicorn <b>-k path.to.custom_worker.CustomUvicornWorker</b> application:demo_app

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

    【讨论】:

    • 谢谢! gunicorn --worker-connections 1000 没有任何影响,当我提出许多并行请求时,我仍然得到 503。然而,我们的 API 端点做了大量繁重的工作,通常需要 5 秒才能完成。然而,我们必须做压力测试,看看如果 100 个客户同时提出这个请求会发生什么。发生这种带有 503 响应的行为
    • 我不知道您为什么会遇到这种情况,但是您可以尝试三种解决方案。第 1 次、第 2 次以及第 1 次和第 2 次的组合。
    • 是的,我不确定 503 是由于并发连接,还是其他资源过载。我也会尝试 CustomUvicornWorker 方法并测试它
    • 你解决了吗?
    猜你喜欢
    • 2016-11-30
    • 2020-07-18
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多