You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制FastAPI/gunicorn Worker仅处理特定端点以节省内存?

解决FastAPI多Worker下按端点分配进程以降低内存占用的方案

核心思路

通过拆分应用为子模块+反向代理路由,让特定Worker进程仅处理对应端点,每个进程只加载自身所需的大内存模型,从而大幅降低总内存消耗。

具体实现步骤

  1. 拆分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)
    
  2. 启动分组Worker进程
    分别为两个子应用启动对应数量的Worker,绑定不同端口:

    # 启动2个Worker处理端点A,监听8001端口
    uvicorn main:app1 --workers 2 --port 8001
    # 启动2个Worker处理端点B,监听8002端口
    uvicorn main:app2 --workers 2 --port 8002
    
  3. 配置反向代理做路由转发
    以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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 08:27:21