diff --git a/docs/index.rst b/docs/index.rst index a7503db3e..a442c0fd3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -139,6 +139,7 @@ Solving specific problems topics/ubuntu topics/scrapyd topics/autothrottle + topics/benchmarking topics/jobs topics/djangoitem @@ -178,6 +179,9 @@ Solving specific problems :doc:`topics/autothrottle` Adjust crawl rate dynamically based on load. +:doc:`topics/benchmarking` + Check how Scrapy performs on your hardware. + :doc:`topics/jobs` Learn how to pause and resume crawls for large spiders. diff --git a/docs/topics/benchmarking.rst b/docs/topics/benchmarking.rst new file mode 100644 index 000000000..1dcd8357d --- /dev/null +++ b/docs/topics/benchmarking.rst @@ -0,0 +1,58 @@ +.. _benchmarking: + +============ +Benchmarking +============ + +Scrapy comes with a simple benchmarking suite that spawns a local HTTP server +and crawls it at the maximum possible speed. The goal of this benchmarking is +to get a measurement of how Scrapy performs in your hardware, and compare it to +other machines using a simple spider as baseline. + +To run it use:: + + scrapy bench + +You should see an output like this:: + + 2013-05-16 13:08:46-0300 [scrapy] INFO: Scrapy 0.17.0 started (bot: scrapybot) + 2013-05-16 13:08:47-0300 [follow] INFO: Spider opened + 2013-05-16 13:08:47-0300 [follow] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:48-0300 [follow] INFO: Crawled 74 pages (at 4440 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:49-0300 [follow] INFO: Crawled 143 pages (at 4140 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:50-0300 [follow] INFO: Crawled 210 pages (at 4020 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:51-0300 [follow] INFO: Crawled 274 pages (at 3840 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:52-0300 [follow] INFO: Crawled 343 pages (at 4140 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:53-0300 [follow] INFO: Crawled 410 pages (at 4020 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:54-0300 [follow] INFO: Crawled 474 pages (at 3840 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:55-0300 [follow] INFO: Crawled 538 pages (at 3840 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:56-0300 [follow] INFO: Crawled 602 pages (at 3840 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:57-0300 [follow] INFO: Closing spider (closespider_timeout) + 2013-05-16 13:08:57-0300 [follow] INFO: Crawled 666 pages (at 3840 pages/min), scraped 0 items (at 0 items/min) + 2013-05-16 13:08:57-0300 [follow] INFO: Dumping Scrapy stats: + {'downloader/request_bytes': 231508, + 'downloader/request_count': 682, + 'downloader/request_method_count/GET': 682, + 'downloader/response_bytes': 1172802, + 'downloader/response_count': 682, + 'downloader/response_status_count/200': 682, + 'finish_reason': 'closespider_timeout', + 'finish_time': datetime.datetime(2013, 5, 16, 16, 8, 57, 985539), + 'log_count/INFO': 14, + 'request_depth_max': 34, + 'response_received_count': 682, + 'scheduler/dequeued': 682, + 'scheduler/dequeued/memory': 682, + 'scheduler/enqueued': 12767, + 'scheduler/enqueued/memory': 12767, + 'start_time': datetime.datetime(2013, 5, 16, 16, 8, 47, 676539)} + 2013-05-16 13:08:57-0300 [follow] INFO: Spider closed (closespider_timeout) + +That tells you that Scrapy is able to crawl about 3900 pages per minute in the +hardware where you run it. Note that this is a very simple spider intended to +follow links, any custom spider you write will probably do more stuff which +results in slower crawl rates. How slower depends on how much your spider does +and how well it's written. + +In the future, more cases will be added to the benchmarking suite to cover +other common scenarios. diff --git a/docs/topics/commands.rst b/docs/topics/commands.rst index 5e27afaaf..5ccc75129 100644 --- a/docs/topics/commands.rst +++ b/docs/topics/commands.rst @@ -149,6 +149,7 @@ Project-only commands: * :command:`genspider` * :command:`server` * :command:`deploy` +* :command:`bench` .. command:: startproject @@ -457,6 +458,18 @@ deploy Deploy the project into a Scrapyd server. See `Deploying your project`_. +.. command:: bench + +bench +----- + +.. versionadded:: 0.17 + +* Syntax: ``scrapy bench`` +* Requires project: *no* + +Run quick benchmark test. :ref:`benchmarking`. + Custom project commands ======================= diff --git a/scrapy/commands/bench.py b/scrapy/commands/bench.py new file mode 100644 index 000000000..93b3a0552 --- /dev/null +++ b/scrapy/commands/bench.py @@ -0,0 +1,20 @@ +from scrapy.command import ScrapyCommand +from scrapy.tests.spiders import FollowAllSpider +from scrapy.tests.mockserver import MockServer + +class Command(ScrapyCommand): + + default_settings = { + 'LOG_LEVEL': 'INFO', + 'LOGSTATS_INTERVAL': 1, + 'CLOSESPIDER_TIMEOUT': 10, + } + + def short_desc(self): + return "Run quick benchmark test" + + def run(self, args, opts): + with MockServer(): + spider = FollowAllSpider(total=100000) + self.crawler.crawl(spider) + self.crawler.start()