2016-11-14 75 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上的抓取體驗似乎更慢 –