返回介绍

10.3 基准系统

发布于 2024-01-30 22:48:37 字数 2903 浏览 0 评论 0 收藏 0

为了第10章,我编写了一个简单的基准系统,可以让我们在不同场景下评估性能。该系统的代码比较复杂,你可以在speed/spiders/speed.py中找到它,但我不会详细讲解该代码。

该系统包含如下功能。

· 我们的Web服务器上http://localhost:9312/benchmark/...目录的处理器。可以通过调整URL参数/Scrapy设置控制伪站点的结构(见图10.4)以及页面加载速度。无需担心细节,我们很快就会看到更多示例。现在,可以观察http://localhost:9312/benchmark/index?p=1与http://localhost: 9312/benchmark/ id:3/rr:5/index?p=1的区别。第一个页面加载时间在半秒之内,并且每个详情页中有一个条目;而第二个页面需要5秒时间加载,但每个详情页中包含3个条目。我们还可以向页面中添加一些隐藏的垃圾数据,使其更大一些。比如,http://localhost:9312/ benchmark/ds:100/ detail?id0=0。默认情况下(参见speed/settings.py),页面渲染在SPEED_T_RESPONSE = 0.125秒内,伪站点包含SPEED_TOTAL_ITEMS = 5000个Item。

图10.4 我们的基准系统创建的具有可调整结构的伪站点

· 爬虫SpeedSpider,通过控制SPEED_START_REQUESTS_STYLE设置伪造一些获取start_requests()的方式,并提供了一个简单的parse_item()方法。默认情况下,我们使用crawler.engine.crawl()方法直接将所有启动URL提供给Scrapy的调度器。

· 管道DummyPipeline伪造一些处理。它包含该处理可能导致的4种延迟类型:阻塞/计算/同步延迟(SPEED_PIPELINE_BLOCKING_DELAY,这是一种不好的方式)、异步延迟(SPEED_PIPELINE_ASYNC_DELAY,这是一种可以接受的方式)、使用treq库的远程API调用(SPEED_PIPELINE_API_VIA_TREQ,这是一种可以接受的方式)以及使用Scrapy的crawler.engine.download()的远程API调用(SPEED_PIPELINE_API_VIA_DOWNLOADER,这是一种不太好的方式)。默认情况下,该管道不会添加任何延迟。

· 在settings.py中包含了一组高性能设置。所有可能会造成系统有任何减慢的设置都已经被禁用。由于我们只访问本地服务器,因此针对单域名请求数的限制也被禁用了。

· 与第8章类似的少量度量捕获扩展。它将周期性地打印出核心度量指标。

我们已经在前面的例子中使用了该系统,不过让我们重新运行一次模拟,并使用Linux的时间工具测量完整的执行时间。可以在如下代码中看到被打印出来的核心度量指标。

$ time scrapy crawl speed
...
INFO: s/edule d/load scrape p/line  done  mem
INFO:    0    0    0    0   0   0
INFO:  4938   14   16    0   32 16384
INFO:  4831   16    6    0  147  6144
...
INFO:   119   16   16    0  4849 16384
INFO:    2   16   12    0  4970 12288
...
real 0m46.561s

Column

Metric

s/edule

len(engine.slot.scheduler.mqs)

d/load

len(engine.downloader.active)

scrape

len(engine.scraper.slot.active)

p/line

engine.scraper.slot.itemproc_size

done

stats.get_value('item_scraped_count')

mem

engine.scraper.slot.active_size

这种级别的透明度是非常明显的。我缩短了列名,不过它们应该仍然能够清楚说明含义。初始时,在调度器中有5000个URL,而在结束时,完成列中也有5000个item。下载器作为瓶颈,已经被充分利用,根据设置始终会有16个活跃的请求。抓取操作主要是爬虫,因为如我们在p/line列所见,管道是空的,由于它通常是在瓶颈之后,因此虽然一定程度上被利用了,但是没有充分利用。抓取5000个Item花费了46秒的时间,使用的并发请求N = 16,即每个请求的平均时间是46 · 16 / 5000 = 147ms,而不是我们期望的125ms,不过这也还可以接受。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文