进程启动时 RSS 310MB,跑到第 6 小时涨到 4.2GB 被 OOM killer 杀掉,tracemalloc 排前三的都是 response 相关对象。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
import tracemalloc tracemalloc.start(10) snap1 = tracemalloc.take_snapshot()
每个响应对象都被挂在一个全局列表里做统计,请求量上来后内存只增不减。流式响应没有 close,底层连接和缓冲区也一起留着。这一点先确认清楚,后面就不用反复试。
「爬虫内存增长」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
具体做法是,用 tracemalloc 取前后两次快照对比;删掉为统计保留的全局引用;响应统一用 with 管理;大响应改流式读取不整块进内存。
改完照着核一遍,同规模任务跑 6 小时 RSS 稳定在 380MB 上下,波动不超过 40MB,没有再被 OOM 杀掉。
