解决Scrapy性能问题——案例一(CPU饱和)
2016-04-26 14:39
357 查看
症状:有时你增加并发水平,但是性能没有增长。下载器的利用也很充分,但是似乎每个请求的平均时间都很长。在Unix/Linux上使用top命令或者在Power Shell上使用ps或者在Windows上面使用任务管理器时,发现发现CPU的负载很高。
示例:假设你运行了以下的命令:
然后就能得到抓取5000个URL所需的时间,如下面的表格所示,
在我们的实验中,没有进行任何的处理,这是我们能够使用如此高的并发的原因,在一个更复杂的系统中,这种情况在低一些的并发时就会出现。
讨论:Scrapy只使用一个线程,当你达到高并发的水平时,CPU就有可能变成了瓶颈。如果你没有使用线程池,那么Scrapy建议只使用80%-90%的CPU。其他的系统资源也有可能出现相同的问题,比如网络带宽、内存和磁盘吞吐量,但是所有的这些资源出现问题的可能性没有CPU那么大,而且就算出现了也是普通的系统管理方面的研究内容了,所以此处不会再涉及。
解决方案:假设你的代码写得还算是有效率,你可以通过在相同的服务器上面运行多个Scrapy爬虫来得到比
示例:假设你运行了以下的命令:
$ for concurrent in 25 50 100 150 200; do time scrapy crawl speed -s SPEED_TOTAL_ITEMS=5000 -s CONCURRENT_REQUESTS=$concurrent done
然后就能得到抓取5000个URL所需的时间,如下面的表格所示,
Expected栏是基于前面的分析得到的公式得来的,CPU负载是由top命令观察到的。
在我们的实验中,没有进行任何的处理,这是我们能够使用如此高的并发的原因,在一个更复杂的系统中,这种情况在低一些的并发时就会出现。
讨论:Scrapy只使用一个线程,当你达到高并发的水平时,CPU就有可能变成了瓶颈。如果你没有使用线程池,那么Scrapy建议只使用80%-90%的CPU。其他的系统资源也有可能出现相同的问题,比如网络带宽、内存和磁盘吞吐量,但是所有的这些资源出现问题的可能性没有CPU那么大,而且就算出现了也是普通的系统管理方面的研究内容了,所以此处不会再涉及。
解决方案:假设你的代码写得还算是有效率,你可以通过在相同的服务器上面运行多个Scrapy爬虫来得到比
CONCURRENT_REQUESTS更大的并发水平。如果其他的服务器或者你程序中的pipeline衍生出去的线程对CPU的要求不高的话,这样可以更好地利用CPU。如果你还是需要更高的并发,那就可以多个服务器来做个分布式的爬虫,在这种情况下你也会同时需要更多的内存、网络带宽和硬盘的吞吐量。一定要记得高并发水平下,CPU是主要的限制因素。
相关文章推荐
- cnn中权值共享理解
- 防火墙学习随笔
- Visual Studio2010简体中文版/旗舰版安装教程
- jq中的ajax
- POJ 1830 开关问题 (01高斯消元)
- UNPv1第二十六章:数据链路访问
- CentOS安装jdk1.8 及服务器之间的拷贝
- 两天 写出简易数据库管理程序
- 以“不变应万变”,我们需要怎么做?
- androidstudio编译的时候报R.java类重复错误怎么搞
- solr源码入门1
- 构架相关
- 软件企业测试团队的组织架构
- Ubuntu16.04升级之后VirtualBox不能安装的问题
- 用户管理
- Cocos2d-x lua 屏幕适配
- u-boot.lds文件诠释
- 动态加载/热部署框架汇总
- linux虚拟内存
- 状态栏的透明效果实现