解决Scrapy性能问题——案例五(Item并发太多导致溢出)
来源:互联网 发布:5g网络华为和高通 编辑:程序博客网 时间:2024/06/05 23:57
症状:爬虫对于每个Response
都产生了多个Item
,系统的吞吐量比期望的要低,并且可能会出现和前一个案例相同的下载器开/关现象。
示例:这里我们假设有1000个请求,每个返回的页面有100个Item
,响应时间为0.25s,Item
在pipeline中的处理时间为3s。分别把CONCURRENT_ITEMS
设置成从10到150的值来运行爬虫:
for concurrent_items in 10 20 50 100 150; dotime scrapy crawl speed -s SPEED_TOTAL_ITEMS=100000 -s \SPEED_T_RESPONSE=0.25 -s SPEED_ITEMS_PER_DETAIL=100 -s \SPEED_PIPELINE_ASYNC_DELAY=3 -s \CONCURRENT_ITEMS=$concurrent_itemsdone...
结果如下:
s/edule d/load scrape p/line done mem952 16 32 180 0 243714920 16 64 640 0 487426888 16 96 960 0 731138...
讨论:需要再次提醒一下的是,这只适于用你的爬虫对每个响应都会产生很多Item
的情况。如果不是这种情况,把CONCURRENT_ITEMS
设置成1就相当于这种情况了。
第一个注意到的是,p/line
列的数值和scape
列的数值存在着某种关系,p/line = CONCURRENT_ITEMS · scape
,这种我们所期望的一样,因为scape
表示的是Response
的数目而p/line
表示的是Item
的数目。
第二个有趣的事是图11中的性能曲线,虽然图的纵轴已经经过了缩放,以便更好地展示不同设置之间的差别,但是实际上差别并没有那么大。从图上可以看出,在坐标轴左侧的延迟很高,因为Item
不能及时地处理导致Response
对象积压以致于达到了内存的限制(前一个案例讲过);而在坐标轴的右边是因为并发的数目太多,使用了太多的CPU。不过把性能正好高估在某个最优点上也不是那么重要,因为在实际使用中,很容易地就往左或者往右偏移了一点。
解决方法:如果CPU的使用率很高,那就减小CONCURRENT_ITEMS
的值;如果达到了Response
对象的5MB的内存限制,说明你的pipeline的吞吐量跟不上下载器的吞吐量了,那就增加CONCURRENT_ITEMS
的值,以加快处理Response
的速度。如果设置这个CONCURRENT_ITEMS
的值还是没有作用,那就看一下前一个案例中的建议,并仔细地分析一下你的scraper的吞吐量是否能被其余的系统所支撑。
- 解决Scrapy性能问题——案例五(Item并发太多导致溢出)
- 解决Scrapy性能问题——案例四(响应太多导致溢出)
- 解决Scrapy性能问题——案例一(CPU饱和)
- 解决Scrapy性能问题——案例二(含有阻塞的代码)
- 解决Scrapy性能问题——案例三(下载器中的“垃圾”)
- 解决Scrapy性能问题——案例六(下载器中请求太少)
- 解决Bitmap导致的内存溢出问题
- JVM内存溢出导致的CPU过高问题排查案例
- Java并发编程实践笔记(五)——chapter3(发布溢出,线程封闭)
- php fork太多进程导致整体性能下降,mysql down掉的解决.
- 解决RecyclerView删除Item导致位置错乱的问题
- 解决 width 50% 导致了宽度溢出问题
- 数据库故障诊断(Troubleshooting)之性能问题导致的数据库严重故障案例之一
- 优化案例:缺少整体规划导致DB性能问题
- Android图片太多内存溢出的问题
- 大量并发SQL导致数据库性能问题诊断优化
- 导致内存溢出的原因有哪些?内存溢出问题又如何解决
- 数据库分区技术(数据表数据量太多导致服务速度慢 ,如何优化数据库性能)
- Caffe各版本与源码全透析
- 基于Fragment的地图框架的使用
- 用java将png图片转换成jpg格式的图片
- LeetCode 343. Integer Break
- 笔记本ubuntu安装cuda7.5
- 解决Scrapy性能问题——案例五(Item并发太多导致溢出)
- Fragment
- 设置PL/SQL连接参数,连接Oracle EBS数据库
- Java线程面试题 Top 50
- c语言编写的cgi程序实现登陆模块
- the zipalign tool was not found in the sdk
- GetWindowRect和GetClientRect
- 六步实现Rest风格的API
- Android 仿qq消息 可拖动回弹的泡泡