当前位置: 首页 > news >正文

AI 全栈开发实战(12):性能优化与监控——从慢查询定位到 Prometheus 监控

AI 应用的性能优化与监控怎么做?从响应速度到资源管理

应用上线后,怎么知道它跑得好不好?慢了怎么优化?

本篇回答三个问题:

  1. 性能瓶颈怎么定位?
  2. 监控体系怎么搭建?
  3. 常见的优化手段有哪些?

性能瓶颈怎么定位?

慢在哪?先量化

不要凭感觉优化。先用数据定位瓶颈:

# backend/app/services/monitor.pyimporttimeimportloggingfromfunctoolsimportwraps logger=logging.getLogger(__name__)deftimed(logger=None):"""函数耗时统计装饰器。"""defdecorator(func):@wraps(func)asyncdefwrapper(*args,**kwargs):start=time.time()try:result=awaitfunc(*args,**kwargs)returnresultfinally:elapsed=time.time()-startifelapsed>0.5:# 超过 500ms 记录慢请求log=loggerorlogging.getLogger(func.__module__)log.warning(f"Slow call:{func.__name__}took{elapsed:.2f}s")returnwrapperreturndecorator

慢查询追踪

数据库查询是最常见的瓶颈。用 SQLAlchemy 的日志定位慢查询:

# backend/app/database.pyimportlogging logging.getLogger("sqlalchemy.engine").setLevel(logging.WARNING)# 只记录超过 1 秒的查询importtimefromsqlalchemyimporteventfromsqlalchemy.engineimportEngine@event.listens_for(Engine,"before_cursor_execute")defbefore_cursor(conn,cursor,statement,parameters,context,executemany):conn.info["query_start"]=time.time()@event.listens_for(Engine,"after_cursor_execute")defafter_cursor(conn,cursor,statement,parameters,context,executemany):total=time.time()-conn.info["query_start"]iftotal>1:logging.getLogger("slow_query").warning(f"Slow query ({total:.2f}s):{statement[:200]}")

监控体系怎么搭建?

关键指标

API 层面: ├─ 请求延迟:P50, P95, P99 ├─ 请求量:QPS(每秒查询数) └─ 错误率:5xx 比例 AI 层面: ├─ LLM 调用延迟 ├─ Token 消耗量 └─ 向量检索延迟 系统层面: ├─ CPU/内存/GPU 使用率 ├─ 磁盘 IO └─ 网络带宽

用 Prometheus + Grafana 搭建监控

# backend/app/services/metrics.pyfromprometheus_clientimportCounter,Histogram,Gauge,generate_latestfromfastapiimportResponseimporttime# 定义指标LLM_LATENCY=Histogram("llm_request_duration_seconds","LLM API call latency",buckets=(0.1,0.5,1.0,2.0,5.0,10.0))LLM_TOKENS=Counter("llm_tokens_total","Total tokens consumed",["model"])API_REQUESTS=Counter("api_requests_total","Total API requests",["method","endpoint","status"])API_LATENCY=Histogram("api_request_duration_seconds","API request latency")@app.get("/metrics")asyncdefmetrics():"""Prometheus 指标接口。"""returnResponse(generate_latest(),media_type="text/plain")

LLM 延迟监控采集

在 LLM 调用处加上监控:

fromapp.services.metricsimportLLM_LATENCY,LLM_TOKENSwithLLM_LATENCY.time():response=awaitclient.chat.completions.create(...)LLM_TOKENS.labels(model="deepseek-chat").inc(response.usage.total_tokens)

健康检查接口

@app.get("/api/health")asyncdefhealth_check():"""健康检查:返回各依赖服务状态。"""importredis status={"app":"ok","database":"unknown","redis":"unknown"}# 检查数据库try:withmodels.get_db()asconn:conn.execute("SELECT 1")status["database"]="ok"exceptException:status["database"]="error"# 检查 Redistry:r=redis.from_url(settings.REDIS_URL)r.ping()status["redis"]="ok"exceptException:status["redis"]="error"overall="ok"ifall(v=="ok"forvinstatus.values())else"degraded"return{"status":overall,"checks":status}

Docker 容器监控

# 查看容器资源使用dockerstats# 查看特定容器日志dockerlogs--tail50--followknow-backend# 容器级别监控(CPU/内存)dockerstats know-backend --no-stream--format"table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

常见的优化手段有哪些?

1. 数据库查询优化

# ❌ 慢:N+1 查询forkbinknowledge_bases:docs=awaitdb.execute(select(Document).where(Document.knowledge_base_id==kb.id))# ✅ 快:批量查询# 用 JOIN 一次查出result=awaitdb.execute(select(KnowledgeBase,Document).join(Document).where(...))

2. LLM 调用缓存

# backend/app/services/cache.pyimporthashlibimportjsonfromapp.configimportsettingsdefllm_cache_key(messages:list)->str:"""生成 LLM 调用的缓存 key。"""content=json.dumps(messages,ensure_ascii=False,sort_keys=True)returnf"llm:{hashlib.md5(content.encode()).hexdigest()}"asyncdefget_cached_llm(messages:list,ttl:int=3600):"""带缓存的 LLM 调用。"""importredis r=redis.from_url(settings.REDIS_URL)key=llm_cache_key(messages)# 查缓存cached=r.get(key)ifcached:returncached.decode()# 调用 LLMresult=awaitcall_llm(messages)# 写入缓存r.setex(key,ttl,result)returnresult

3. 静态文件缓存

Nginx 配置中已经做了:

location /static/ { expires 7d; add_header Cache-Control "public, immutable"; }

4. 数据库连接池

# SQLAlchemy 连接池配置engine=create_async_engine(settings.DATABASE_URL,pool_size=10,# 连接池大小max_overflow=20,# 最大溢出连接数pool_pre_ping=True,# 使用前检查连接是否有效pool_recycle=3600,# 1 小时后回收连接)

5. 前端资源优化

// Vite 配置已包含:// - 代码分割(Code Splitting)// - Tree Shaking// - CSS 压缩// - 图片压缩// 额外的优化:组件懒加载constKnowledgeBaseDetail=lazy(()=>import("./pages/KnowledgeBaseDetail"));

优化 checklist

□ 数据库查询是否有 N+1 问题? □ 慢查询是否加了索引? □ LLM 响应是否做了缓存? □ 静态资源是否设置了缓存头? □ 数据库连接池是否配置了合理大小? □ 是否有健康检查接口? □ 容器资源限制是否设置? □ 关键路径是否加了耗时监控? □ 是否有错误告警?

总结

性能优化和监控的关键:

方向做什么效果
定位瓶颈慢查询追踪 + 耗时统计知道慢在哪
LLM 缓存缓存相同请求的结果减少 50-80% 的 LLM 调用
数据库优化索引 + JOIN 替代 N+1查询速度提升 10-100x
健康检查定期检测服务状态及时发现故障
Prometheus指标采集 + Grafana 可视化实时了解系统状态

本文是《AI 全栈开发实战——做一个真正的产品》系列的第 12 篇。
本文由 Zyentor(智元界) 原创发布


本文发布于 Zyentor(智元界) —— AI 开发者社区
原文链接:https://www.zyentor.com/news/3883

http://www.gsyq.cn/news/1555426.html

相关文章:

  • 互联网行业计算机程序员IT软件开发个人求职面试简历模板 格式word简历模板可编辑
  • 终极指南:免费在Switch上使用虚拟Amiibo的完整教程
  • MC68020特权级、虚拟化与流水线架构深度解析
  • 2026常州回收普拉达包包优质门店排行, 资质合规变现首选禹竞名奢汇 - 名奢变现站
  • https://www.cnblogs.com/-1688/p/20655376 - 速递信息
  • OpenWebRL:40亿参数网页智能体实战指南
  • 构建之法5
  • 从报错到成功:手把手教你用BiocManager搞定clusterProfiler安装全流程
  • Windows微信防撤回实战:开源工具原理与安全配置指南
  • 6 家门店实地测评!2026 杭州黄金回收完整避坑教程,变现不踩雷 - 开心测评
  • 2026杭州包包回收哪家靠谱|本地正规奢包回收门店排名,高价无套路变现攻略 - 薛定谔的梨花猫
  • 如何用语音解放你的小爱音箱,打造专属私人音乐库
  • 微信接入 Codex,再接入 GPT-5.5:把 AI 编程助手真正装进口袋里
  • ChatGPT识图分析实操指南:从拍照到精准识别的完整链路
  • MLOps生产化实战:让机器学习模型稳定运行18个月
  • 广州除甲醛前五榜单,2026 品牌横向测评避坑指南 - 环保除醛知识库
  • 昆明顶奢回收|专收爱马仕 Birkin/Kelly、香奈儿经典款 - 开心测评
  • 北京31年老牌搬家|迁禧搬家 政企高校指定搬迁服务商,多所高校官方合作 - 幸福生活序曲
  • 2026东莞黄金回收机构排名|合规经营精准鉴定加急可上门 - 奢侈品回收测评
  • 2026 安徽六安市高考落榜怎么办?安徽工贸职业技术学院公办单招复读班招生简章官网发布:线上报名入口+完整报考指南、招生计划、录取条件 - cc江江
  • 从信息收集到权限获取:实战复现Windows Server RPC缓冲区溢出漏洞MS08-067
  • 飞书 Agent 集成(Channel SDK)lark-channel-sdk入门
  • 2026杭州手表回收避坑指南|正规中检备案门店,杜绝虚高引流、恶意压价套路 - 薛定谔的梨花猫
  • 机器学习生产化:从模型上线到系统韧性工程
  • 设备管理系统团队博客第五篇
  • 南宁品牌首饰回收避坑指南:2026年七大品牌实力排行榜 - 薛定谔的梨花猫
  • 颜值的降维打击!“报名管家”全版本免费,用王炸级UI撑起你的品牌门面 在这个“颜值即正义”的时代,别让丑陋的表单劝退用户 - 亲测好用工具
  • 杭州本地人私藏!2026 全城 6 家靠谱名牌包包回收门店整理 - 开心测评
  • 2026武汉黄金回收避坑干货|拆解虚高报价套路,拒绝到店扣损耗,正规门店全汇总 - 名奢变现站
  • 二手腕表哪些成色最保值?昆明市场真实行情实测 - 开心测评