Fastapi 资源分析相关方案

以下是调试FastAPI应用和监控资源占用的完整方案:

  1. 调试模式配置
# 启动命令(带调试参数)
uvicorn app:app --reload --workers 1 --timeout-keep-alive 600

# 关键参数说明:
# --reload       热重载代码
# --workers 1    单进程模式便于调试
# --timeout-keep-alive 600 延长连接保持时间
  1. 实时资源监控方案

(1)内置性能分析中间件

from fastapi import Request, Response
from fastapi.middleware.gzip import GZipMiddleware

app.add_middleware(GZipMiddleware)

@app.middleware("http")
async def add_process_time_header(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    response.headers["X-Process-Time"] = str(process_time)
    return response

(2)内存监控模块

import tracemalloc

tracemalloc.start(10)  # 记录前10个内存分配点

@app.get("/memory_snapshot")
async def get_memory_snapshot():
    snapshot = tracemalloc.take_snapshot()
    top_stats = snapshot.statistics('lineno')
    return {"memory_stats": [str(stat) for stat in top_stats[:5]]}
  1. 系统级监控工具

(1)使用psutil生成资源报告

import psutil
import os

def get_resource_usage():
    process = psutil.Process(os.getpid())
    return {
        "cpu_percent": process.cpu_percent(interval=1),
        "memory_mb": process.memory_info().rss / 1024 / 1024,
        "open_files": len(process.open_files()),
        "thread_count": process.num_threads()
    }

(2)定时记录日志

from fastapi import BackgroundTasks

async def log_resources():
    while True:
        logger.info(get_resource_usage())
        await asyncio.sleep(60)  # 每分钟记录一次

@app.on_event("startup")
async def startup_event():
    asyncio.create_task(log_resources())
  1. 高级调试技巧

(1)性能分析装饰器

import cProfile
import pstats
from io import StringIO

def profile(func):
    def wrapper(*args, **kwargs):
        pr = cProfile.Profile()
        pr.enable()
        result = func(*args, **kwargs)
        pr.disable()
        s = StringIO()
        ps = pstats.Stats(pr, stream=s).sort_stats('cumulative')
        ps.print_stats()
        print(s.getvalue())
        return result
    return wrapper

# 在需要分析的接口上添加装饰器
@app.get("/heavy_task")
@profile
async def heavy_operation():
    # 复杂操作

(2)Docker监控命令

# 实时监控容器资源
docker stats <container_id> --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"

# 生成性能报告
docker exec <container_id> sh -c "ps aux | grep uvicorn"
  1. 可视化方案

(1)Prometheus + Grafana 配置

from prometheus_fastapi_instrumentator import Instrumentator

Instrumentator().instrument(app).expose(app)

(2)使用py-spy进行火焰图分析

# 安装工具
pip install py-spy

# 生成火焰图
py-spy record -o profile.svg --pid <PID> --duration 60

建议调试流程:

  1. 本地开发时使用–reload模式
  2. 通过/memory_snapshot接口检查内存泄漏
  3. 使用X-Process-Time头定位慢请求
  4. 生产环境部署Prometheus监控
  5. 定期生成火焰图分析热点代码

这些方法可根据实际需求组合使用,建议从轻量级的中间件监控开始,逐步过渡到专业级监控方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风吹落叶花飘荡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值