如何解决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错误。
解决方法
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
}
,现在将此CustomUvicornWorker
与gunicorn
命令一起使用,
gunicorn -k path.to.custom_worker.CustomUvicornWorker application:demo_app
注意:您可以检查self.config.limit_concurrency
类中的CustomUvicornWorker
,以确保正确设置了值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。