城市繁荣合并建造
94.53M · 2026-03-29
下面把检查线程阻塞和排查内存增长的工具与典型用法按要点列清楚。
观测点:进程响应变慢或完全停滞,CPU/IO 异常或日志显示线程等待。
日志检查:抓取线程相关日志、异常堆栈、阻塞/等待信息。先定位时间窗口和可疑线程ID。
gdb(动态附加查看线程栈)
用法要点:gdb -p <pid>,然后 thread apply all bt 查看每个线程的调用栈,定位互斥锁/等待点。
快速流程:附加 → 列出线程 → 对可疑线程打印 backtrace。
用法要点:strace -f -p <pid> 或 strace -ff -o out -p <pid>。看是否在 futex、poll、read/write 等系统调用上长时间阻塞。
观测点:长期运行进程内存占用持续上涨,GC 后未回落,或 OOM 频繁。
监控:top/ps/smem/pmap 定期采样记录 RSS/VSZ。结合应用日志标记时间点。
tracemalloc(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)
能找出按文件行号分配增长最多的地方。
用法要点:
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')
用来发现哪些对象数量异常和它们的引用路径(可生成图片)。
用法要点:
from pympler import muppy, summary
all_objs = muppy.get_objects()
print(summary.summarize(all_objs))
可结合 asizeof 或 tracker 做更细粒度的分配追踪。
采集日志与进程内存/线程快照。
若线程疑似阻塞,先 gdb 打栈,再用 strace 确认是 syscall 层阻塞。
若内存增长,先采样 RSS,再用 tracemalloc 定位分配源,最后用 objgraph 验证引用链。
修复后做回归采样对比快照。