来源:http://www.aisir.cn/2017/07/11/aws%E4%B8%8A%E9%83%A8%E7%BD%B2scrapy%E5%87%BA%E7%8E%B0-out-of-memory%EF%BC%8C%E5%86%85%E5%AD%98%E6%BA%A2%E5%87%BA/
项目部署在亚马逊服务器上,每小时爬去广告数据,运行一段时间后,内存溢出,贴图为证
这几天跟着小伙伴一起做项目,碰到不少平时碰不到的技术问题,真是很好玩的一件事。比如Scrapy这个爬虫框架的的内存泄露问题就是一个很让人头疼的问题。
历来OOM(OOM - Out of Memory,内存溢出)问题都是项目里最棘手的问题,这种问题debug的难度很大,原因在于问题不太好定位。因为OOM的成因往往比较复杂,不合理的对象创建,数据结构使用的不合理性,分布式架构中各系统的配合不好等情况,都有可能出现这个问题。
而爬虫这个任务,涉及网站各个页面的遍历,通常会在网站抓去期间产生大量的HTTP Request,而Request的处理往往是通过任务队列来处理的。由于不是网站的所有的页面都要抓去,但我们几乎需要遍历大部分的页面,再考虑并发的情况,爬虫任务开始后,往往会有大量的pending request进入队列。而这些队列,框架对其最常见的处理方式是放在内存中,因此,当要抓去的页面层次位于网站的较深层时,这个队列的内存占用到了任务的中后期会变得非常可观。
我的解决方案:
运行单次抓取任务,发现内存占用近 1G
1、加大实例内存
2、减小插入s3的thread并发数目