线上python问题排查思路

下面把检查线程阻塞和排查内存增长的工具与典型用法按要点列清楚。

线程阻塞与死锁排查

  • 观测点:进程响应变慢或完全停滞,CPU/IO 异常或日志显示线程等待。

  • 日志检查:抓取线程相关日志、异常堆栈、阻塞/等待信息。先定位时间窗口和可疑线程ID。

  • gdb(动态附加查看线程栈)

用法要点:gdb -p <pid>,然后 thread apply all bt 查看每个线程的调用栈,定位互斥锁/等待点。

快速流程:附加 → 列出线程 → 对可疑线程打印 backtrace。

  • strace(跟踪系统调用/阻塞在 syscall)

用法要点:strace -f -p <pid>strace -ff -o out -p <pid>。看是否在 futex、poll、read/write 等系统调用上长时间阻塞。

  • 综合策略:先从日志缩小时间段和线程;用 gdb 看 Python 层调用栈(若是 C 扩展或解释器死锁也能看出);用 strace 判断是用户态等待还是系统调用层面阻塞。

内存泄漏/内存增长排查

  • 观测点:长期运行进程内存占用持续上涨,GC 后未回落,或 OOM 频繁。

  • 监控:top/ps/smem/pmap 定期采样记录 RSS/VSZ。结合应用日志标记时间点。

  • tracemalloc(Python 标准库,跟踪内存分配地点)

用法要点:

python 复制代码
import tracemalloc

tracemalloc.start()

# 在关键点取快照

snap1 = tracemalloc.take_snapshot()

# 运行一段时间后

snap2 = tracemalloc.take_snapshot()

stats = snap2.compare_to(snap1, 'lineno')

for stat in stats[:20]:

print(stat)

能找出按文件行号分配增长最多的地方。

  • objgraph(分析对象引用关系)

用法要点:

python 复制代码
import objgraph

objgraph.show_most_common_types(limit=20)

obj = objgraph.by_type('YourTypeName')[:10]

objgraph.show_backrefs(obj, max_depth=10, filename='leak.png')

用来发现哪些对象数量异常和它们的引用路径(可生成图片)。

  • pympler(运行时内存概览与分配追踪)

用法要点:

python 复制代码
from pympler import muppy, summary

all_objs = muppy.get_objects()

print(summary.summarize(all_objs))

可结合 asizeoftracker 做更细粒度的分配追踪。

  • 实战流程建议:先用系统工具确认增长曲线 → 用 tracemalloc 找到热点分配位置 → 用 objgraph 可视化引用链确认根对象 → 用代码修复并验证(重复采样对比快照)。

快速检查清单(按优先级)

  1. 采集日志与进程内存/线程快照。

  2. 若线程疑似阻塞,先 gdb 打栈,再用 strace 确认是 syscall 层阻塞。

  3. 若内存增长,先采样 RSS,再用 tracemalloc 定位分配源,最后用 objgraph 验证引用链。

  4. 修复后做回归采样对比快照。

相关推荐
love530love4 小时前
LiveTalking 数字人项目 Windows 部署完全指南(EPGF 架构)
人工智能·windows·python·架构·livetalking·epgf
遇事不決洛必達4 小时前
【Python基础】GIL 锁是什么及其对爬虫的影响
爬虫·python·线程·进程·gil锁
星辰徐哥4 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥4 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约4 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee4 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐4 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs4 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐4 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司4 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录