讲师中心 微信公众号

工具推荐

视频效率加速
Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

Python tracemalloc 的线上内存快照采集

风强小哥_1857

风强小哥_1857

发布时间:2026-02-14 22:59:02

|

896人浏览过

|

来源于php中文网

原创

tracemalloc 必须在 Python 入口第一行启动,否则无法捕获框架初始化阶段的内存分配;快照需启用 traceback_limit=25 并用 statistics('traceback') 对比,过滤 site-packages 干扰,结合 gc 和 objgraph 定位真实泄漏源。

python tracemalloc 的线上内存快照采集

tracemalloc 启动时机必须早于所有业务代码

线上内存问题往往在服务启动几小时后才暴露,但 tracemalloc 如果晚于框架初始化(比如 Django 的 setup()、FastAPI 的 app = FastAPI())再启用,就捕获不到关键对象的分配源头。它只记录启用后的分配行为,之前的所有堆内存分配完全不可见。

常见错误现象:get_traced_memory() 返回值很小,take_snapshot() 里几乎全是 <frozen importlib._bootstrap></frozen> 或空路径,说明没抓到业务逻辑的分配链。

  • 在 Python 解释器最顶层入口(如 main.py 开头第一行)调用 tracemalloc.start()
  • 避免放在 if __name__ == "__main__": 块内——WSGI/ASGI 服务器(如 gunicorn)可能不走这个分支
  • 若用 systemd 或容器启动,确认 PYTHONPATH 和入口文件加载顺序,防止被中间层 wrapper 覆盖

快照采集要带 traceback 且限制深度

默认 take_snapshot() 不包含调用栈,只返回每个分配地址的大小,基本没法定位到哪行代码触发了内存增长。必须显式传参启用追踪,但又不能无限制记录——线上服务扛不住全栈帧开销。

使用场景:排查某个接口反复调用后 RSS 持续上涨,需要对比两次快照中新增的 top 分配点。

立即学习“Python免费学习笔记(深入)”;

Biopython
Biopython

全面的分子生物学工具集。适用于序列操作、文件解析(FASTA/GenBank/PDB)、系统发育分析,以及通过 Bio.Entrez 以编程方式访问 NCBI/

下载
  • 启动时加参数:tracemalloc.start(traceback_limit=25)(25 是实测平衡点,再高 GC 压力明显上升)
  • 采集快照务必用:snapshot = tracemalloc.take_snapshot(),不要省略括号
  • 避免在请求处理中高频调用 take_snapshot() —— 单次耗时约 1–5ms,QPS 高时会拖慢响应
  • 如果用 psutil.Process().memory_info().rss 发现内存涨了 100MB,但快照里最大单条才 2MB,说明有大量小对象累积,此时需用 filter_traces 聚合相同 traceback

对比快照时别直接用 statistics('lineno')

statistics('lineno') 按「文件+行号」聚合,看似直观,但对动态生成代码(Jinja 模板、SQLAlchemy lazy loader、Pydantic model 实例化)极不友好——同一行可能对应 N 个语义完全不同的分配源,数据严重失真。

性能影响:当 trace 数超 10 万,statistics() 内部排序会吃掉 200+MB 临时内存,可能触发 OOM。

  • 优先用 statistics('traceback'),能保留函数名和上下文层级
  • 做 diff 时用 snapshot1.compare_to(snapshot2, 'traceback'),而非手动遍历 stat.traceback
  • 过滤干扰项:加上 Filter(inclusive=False, filename_pattern="*/site-packages/*") 排除第三方包噪音
  • 如果发现 top 项全是 dict.__init__ 或 list.__init__,说明问题在上层业务逻辑反复构造容器,而不是底层 C 扩展泄漏

线上跑着不能只靠 tracemalloc 定结论

它只能告诉你“哪些 Python 对象被分配了”,但无法区分是引用未释放、循环引用未被 GC 回收、还是底层 C 扩展(如 numpy array、PIL Image)持有的独立内存块。线上看到 RSS 涨了 500MB,tracemalloc 只统计出 80MB,剩下那 420MB 就得换工具查。

容易被忽略的地方:gunicorn worker 进程复用导致 tracemalloc 累积统计跨请求,而 get_traced_memory() 返回的是当前总分配量,不是增量。你看到的“涨了 50MB”可能是前 1000 个请求的累计,不是最近一次请求干的。

  • 配合 gc.get_stats() 看分代回收频率,若 collected 长期为 0,说明有对象逃逸出 GC 范围
  • 用 objgraph.show_most_common_types(limit=20) 快速看存活对象类型分布(需提前装 objgraph)
  • 对疑似 C 扩展内存,用 malloc_info()(Python 3.4+)或 cat /proc/PID/smaps_rollup 查 Anonymous 和 Heap 区域

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

613

2026.02.04

Python Django REST Framework接口安全与认证体系实践
Python Django REST Framework接口安全与认证体系实践

本专题围绕 Django REST Framework 展开,深入讲解 API 认证、JWT 鉴权、权限控制、接口安全防护以及防攻击策略设计。通过完整后端案例,帮助开发者构建安全可靠的 Web API 服务体系。

280

2026.06.29

Python FastAPI异步API开发_Python怎么用FastAPI构建异步API
Python FastAPI异步API开发_Python怎么用FastAPI构建异步API

Python FastAPI 异步开发利用 async/await 关键字,通过定义异步视图函数、使用异步数据库库 (如 databases)、异步 HTTP 客户端 (如 httpx),并结合后台任务队列(如 Celery)和异步依赖项,实现高效的 I/O 密集型 API,显著提升吞吐量和响应速度,尤其适用于处理数据库查询、网络请求等耗时操作,无需阻塞主线程。

119

2025.12.22

Python 微服务架构与 FastAPI 框架
Python 微服务架构与 FastAPI 框架

本专题系统讲解 Python 微服务架构设计与 FastAPI 框架应用,涵盖 FastAPI 的快速开发、路由与依赖注入、数据模型验证、API 文档自动生成、OAuth2 与 JWT 身份验证、异步支持、部署与扩展等。通过实际案例,帮助学习者掌握 使用 FastAPI 构建高效、可扩展的微服务应用,提高服务响应速度与系统可维护性。

594

2026.02.06

Python Web框架FastAPI 全栈开发教程合集
Python Web框架FastAPI 全栈开发教程合集

以 FastAPI 为核心,讲解现代 Python Web API 的高效开发方式,涵盖路由定义与路径参数/查询参数/请求体绑定、Pydantic 模型的数据校验与序列化、依赖注入(Depends)系统的分层设计、中间件与 CORS 配置、OAuth2 + JWT 认证流程、后台任务(BackgroundTasks)、WebSocket 实时通信、SQLAlchemy 异步 ORM 集成、自动生成 OpenAPI/Swagger 交互文

756

2026.05.09

Python FastAPI异步微服务与高性能接口设计
Python FastAPI异步微服务与高性能接口设计

本专题聚焦 Python FastAPI 框架在高性能接口与微服务开发中的应用,讲解异步请求处理、依赖注入机制、路由设计、数据库异步操作以及接口性能优化策略。结合实际项目案例,帮助开发者构建高并发、低延迟的现代化后端服务架构。

639

2026.06.16

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3248

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

5469

2025.10.17

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn