线上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. 修复后做回归采样对比快照。

相关推荐
d***9352 小时前
springboot3.X 无法解析parameter参数问题
android·前端·后端
q***71013 小时前
Spring Boot(快速上手)
java·spring boot·后端
n***84073 小时前
十七:Spring Boot依赖 (2)-- spring-boot-starter-web 依赖详解
前端·spring boot·后端
QxQ么么5 小时前
移远通信(桂林)26校招-助理AI算法工程师-面试纪录
人工智能·python·算法·面试
执笔论英雄6 小时前
Slime异步原理(单例设计模式)4
开发语言·python·设计模式
q***96587 小时前
Spring Cloud Data Flow 简介
后端·spring·spring cloud
凌波粒7 小时前
Springboot基础教程(3)--自动装配原理/静态资源处理/欢迎页
java·spring boot·后端
小徐敲java7 小时前
python使用s7协议与plc进行数据通讯(HslCommunication模拟)
开发语言·python
凌波粒7 小时前
SpringBoot基础教程(2)--yaml/配置文件注入/数据校验/多环境配置
java·spring boot·后端·spring
猫头虎7 小时前
如何解决 pip install 编译报错 fatal error: hdf5.h: No such file or directory(h5py)问题
人工智能·python·pycharm·开源·beautifulsoup·ai编程·pip