如何限制FastAPI/gunicorn Worker仅处理特定端点以节省内存?
解决FastAPI多Worker下按端点分配进程以降低内存占用的方案
核心思路
通过拆分应用为子模块+反向代理路由,让特定Worker进程仅处理对应端点,每个进程只加载自身所需的大内存模型,从而大幅降低总内存消耗。
具体实现步骤
拆分FastAPI子应用
将不同端点拆分到独立的FastAPI实例中,每个实例仅初始化自身依赖的模型:# main.py from fastapi import FastAPI # 子应用1:仅包含端点A,加载模型A app1 = FastAPI() model_a = load_large_model("model_a.pth") # 占用2GB @app1.get("/endpoint-a") def endpoint_a(param: str): return calculation(model_a, param) # 子应用2:仅包含端点B,加载模型B app2 = FastAPI() model_b = load_large_model("model_b.pth") # 占用2GB @app2.get("/endpoint-b") def endpoint_b(param: str): return calculation(model_b, param)启动分组Worker进程
分别为两个子应用启动对应数量的Worker,绑定不同端口:# 启动2个Worker处理端点A,监听8001端口 uvicorn main:app1 --workers 2 --port 8001 # 启动2个Worker处理端点B,监听8002端口 uvicorn main:app2 --workers 2 --port 8002配置反向代理做路由转发
以Nginx为例,配置域名路由规则,将不同端点请求转发到对应Worker集群:server { listen 80; server_name your-domain.com; # 转发端点A请求到8001端口的Worker location /endpoint-a { proxy_pass http://localhost:8001; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 转发端点B请求到8002端口的Worker location /endpoint-b { proxy_pass http://localhost:8002; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
方案优势
- 内存占用优化:每个Worker仅加载一个模型,4个Worker总内存为2GB×4=8GB,相比原方案节省50%内存
- 轻量性:无需拆分微服务,所有逻辑仍在同一代码库,避免调度器、多层转发带来的延迟与可靠性问题
- 适配Python进程模型:规避了多进程共享大对象的技术障碍,符合Python内存隔离的特性
注意事项
- 确保路由规则无冲突,避免请求转发错误
- 可使用Supervisor、systemd等工具统一管理多个Worker进程的启停与监控
内容的提问来源于stack exchange,提问作者jdm
相关产品推荐
相关产品推荐

