以下是调试FastAPI应用和监控资源占用的完整方案:
- 调试模式配置
# 启动命令(带调试参数)
uvicorn app:app --reload --workers 1 --timeout-keep-alive 600
# 关键参数说明:
# --reload 热重载代码
# --workers 1 单进程模式便于调试
# --timeout-keep-alive 600 延长连接保持时间
- 实时资源监控方案
(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)使用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)性能分析装饰器
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)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
建议调试流程:
- 本地开发时使用–reload模式
- 通过/memory_snapshot接口检查内存泄漏
- 使用X-Process-Time头定位慢请求
- 生产环境部署Prometheus监控
- 定期生成火焰图分析热点代码
这些方法可根据实际需求组合使用,建议从轻量级的中间件监控开始,逐步过渡到专业级监控方案。