2016-11-14 68 views
0

我正在使用scrapy来刮擦多个站点和Scrapyd来运行蜘蛛。Scrapy蜘蛛在AWS EC2上运行时急剧减速

我写过7个蜘蛛,每个蜘蛛处理至少50个起始URL。我有大约7000个URL。每个蜘蛛的1000个URL。

当我开始在ScrapyD中放置作业时,每个作业有50个启动URL。最初,所有的蜘蛛反应良好,但突然他们开始工作非常缓慢。在localhost上运行它可以提供很高的性能。

虽然我在本地主机上运行Scrapyd,它给了我非常高的性能。当我在Scrapyd服务器上发布作业时。请求响应时间急剧减少。

每个起始URL响应时间是指在服务器上一段时间

设置看起来像这样经过很慢:

BOT_NAME = 'service_scraper' 

SPIDER_MODULES = ['service_scraper.spiders'] 
NEWSPIDER_MODULE = 'service_scraper.spiders' 

CONCURRENT_REQUESTS = 30 

# DOWNLOAD_DELAY = 0 

CONCURRENT_REQUESTS_PER_DOMAIN = 1000 


ITEM_PIPELINES = { 
    'service_scraper.pipelines.MongoInsert': 300, 
} 

MONGO_URL="mongodb://xxxxx:yyyy" 


EXTENSIONS = {'scrapy.contrib.feedexport.FeedExporter': None} 


HTTPCACHE_ENABLED = True 

我们试图改变CONCURRENT_REQUESTSCONCURRENT_REQUESTS_PER_DOMAIN,但没有什么工作。我们已经在AWS EC2中托管了scrapyd。

+0

您正在使用什么EC2实例类型?针对CPU和网络的CloudWatch指标是什么样的? –

+0

我正在使用t2-small实例。最大CPU利用率为60%。网络最大为1,500,000。最大网络数为1,500,000。 –

+0

您是否考虑过使用更大的实例类型?它不仅增加了CPU和内存,还增加了更多的网络带宽。 –

回答

0

与所有性能测试一样,目标是找到性能瓶颈。这通常下降到一个(或多个)的:

  • 内存:使用top测量内存消耗。如果消耗的内存太多,它可能会交换到比RAM更慢的磁盘。尝试添加内存。
  • CPU:使用Amazon CloudWatch跟踪CPU。 非常小心t2实例(见下文)。
  • 磁盘速度:如果作业是磁盘密集型的,或者如果内存正在交换到磁盘,这可能会影响性能 - 特别是对于数据库。 Amazon EBS是网络连接的磁盘,因此网络速度实际上可以调节磁盘速度。
  • 网络速度:由于Amazon EC2的多租户设计,故意限制网络带宽。可用网络带宽的数量取决于使用的实例类型

您正在使用t2.small实例。它具有:

  • 内存: 2GB(这是小于4GB上自己的笔记本电脑)
  • CPU:t2家庭是非常强大的,但t2.small只接收平均20%的CPU(见下文)。
  • 网络:t2.small被评为低到中等网络带宽。

您的CPU正在记录60%,而t2.small仅限于平均20%的CPU这一事实表明该实例消耗的CPU信用比获得的速度快。这导致最终耗尽CPU积分,从而将机器限制为CPU的20%。这很可能会影响你的表现。您可以在Amazon CloudWatch中查看CPU贷记余额。

请参阅:T2 Instances documentation了解CPU积分。

对于t2.small,网络带宽相对较低。这会影响对亚马逊EBS存储卷的互联网访问和通信。鉴于您的应用程序并行下载大量网页,然后将它们写入磁盘,这也是您系统的潜在瓶颈。

底线:在比较你的笔记本电脑的性能,在使用实例少内存,可能少CPU由于CPU信贷枯竭,并能降低磁盘访问由于网络的高交通。

我建议你使用更大的实例类型,确认性能提高,然后试验不同的实例类型(无论是在t2家庭和在它之外),以确定哪些尺寸的机器给你最优惠的价格/性能权衡。

继续到显示器查看CPU,内存和网络性能,找出主要瓶颈,然后着眼于修复瓶颈。

+0

我已经尝试过使用m4.large系统,但即使它没有给我适当的结果,我在性能上没有找到任何改进。正如你所说网络带宽消耗可能是一个问题。内存不是问题,我在t2-small实例上安装了50 GB EBS卷。声称Scrapy工作速度非常快。我以前在AWS和Scrapy上托管的其他框架java或nodejs上的抓取体验似乎更慢 –