【问题标题】:Web Scraping Performance issues EC2 vs Home PCWeb Scraping 性能问题 EC2 与家用 PC
【发布时间】:2019-06-24 09:57:00
【问题描述】:

我用 Python 编写了一个网络爬虫,它在我家里的笔记本电脑上运行良好。将其部署到 AWS EC2 后,刮板的性能会下降。现在我对 EC2 实例的性能感到困惑(即使是微型和小型实例,请参阅下面的更多详细信息)。

python中的刮刀: 一般来说,scrapes 的内部循环执行以下操作: (1) 抓取工具在站点上查找 url(每个站点 20 个,一个站点 = 一个“site_break”)。在第二步中,它 (2) 获取每个 url 的源代码,在第三步中,它 (3) 将必要的信息提取到数据帧中,在第四步中,它 (4) 将数据帧保存为 pkl。 在所有循环之后,它会打开并合并数据帧并将其保存为 csv。

关键(最耗时的部分)是: (2) 源代码下载(I/O受下载速度限制):程序将源代码填满RAM (3) 源代码处理(CPU 100%)

为了充分利用 RAM 并将相似的进程结合在一起,每个循环由 site_break = 100 组成,即 100 个站点 * 20 个 URL/站点 = 2000 个 URL。这会将我的 PC 的 RAM 填充到 96%(见下文)。由于我必须在第 1 步和第 2 步中等待服务器响应,因此我使用 maxWorkers=15 实现了线程(或者 20-35 具有相似的结果)。此实现将运行时间缩短了 80%。我确信我可以通过实现 asyncio 获得其他的 .%。不过,我想从精益 MVP 开始。在处理器消耗步骤 3 中,我(还)没有实现多处理,因为我的目标是在 t2.micro(只有一个处理器)上实现具有成本效益/免费的实现。

规格: 家用 PC:Intel Core i7-6500 CPU,2.59 Ghz(2 个内核,4 个逻辑处理器),RAM 8.00 GiB,64 位,x64,50Mbit/s 下载速率(有效高达 45 Mbit/s),Python 3.7。 3、conda环境

EC2 t2.micro:vCPUs = 1,RAM 1.0 GiB,网络性能“低到中等”(论坛中的研究告诉我这可能超过 50 Mbit),Ubuntu 18.04,Python 3.7.3,conda env

EC2 t3a.small:vCPUs = 2,RAM 2.0 GiB,网络性能“低到中等”,但另一个 AWS 站点告诉我:“最高 5 Gbit/s”,Ubuntu 18.04,Python 3.7.3,conda env

由于 t2.micro 的 RAM 只有 1 GiB,我将 site_break 从 100 降低到 25。之后,RAM 仍然满了,所以我进一步将它从 25 降低到 15、12、10,最后5. 对于 12、10,尤其是 5,效果很好: 我需要 5:30 分钟在我的 PC 上使用 site_break = 100 进行循环。 t2.micro site_break = 5 需要 8-10 秒,这导致类似的 100 个站点需要 3:00 分钟,这让我第一时间感到满意。 不幸的是,出现了以下问题: 20-30 次循环后性能下降。循环时间从 8 秒迅速增加到超过 2 分钟。我的第一个假设是它是低 RAM,在小循环期间它似乎没有运行满。停止并清理 RAM 后,第二次或第三次循环后性能下降。如果我在几个小时后开始它,第一个案例(在 20-30 循环后下降)重复。

因为我首先认为它与 RAM 有关,所以我在 t3a.small 上启动了第二个实例,具有更多 CPU、RAM 和“高达 5 Gbit/a”的网络性能。我切片查看 site_break = 25 并启动脚本。我仍然以每个循环 1:39-1:55 分钟的恒定速度运行(这是 t2.micro 在其最佳阶段的一半速度(5 秒为 10 秒 => 25 秒为 50 秒)。 Parallely,我从我的家用 PC 上使用 site_break = 25 启动脚本,并且每次循环 1:15-1:30 分钟,它的速度越来越快。 (手动停止时间会导致下载速度慢 10-15 秒,处理速度慢 10-15 秒)。 这一切都让我感到困惑。

现在我的问题:

  1. 为什么 t2.micro 在几个循环后会变差,为什么性能变化如此之大?
  2. 为什么 t3a.small 比 t2.micro 慢 50%?我认为“更大”的机器在任何方面都会更快。

这让我卡住了:

  1. 不想定期使用我的家用电脑(每天抓取),因为连接会在凌晨 4 点中断一小段时间并导致脚本挂起)。此外,我不希望脚本一直手动运行,PC 一直在阻止我的私人互联网流。

  2. t2.micro:没用,因为劣化后的性能不可接受。

  3. t3a.small:性能比私人 PC 低 10-20%。我希望它以某种方式变得更好?这让我怀疑抓取 EC2。而且,一开始我无法理解与t2.micro相比性能较低。

【问题讨论】:

  • 微型和小型机器比典型的家用电脑方式受到更多限制。因为它们的典型用例是针对中小型 Web 服务器的使用,这不需要很大的马力。它们的 CPU 时间也在许多实例之间共享和限制,如果您长时间保持 100% 的 CPU 使用,您会发现性能大幅下降。
  • 尝试使用不同的实例类型(尤其是不同的实例系列)进行一些实验。您可以使用 Spot 实例来降低成本,因此您可以尝试一些非常大的实例,看看它们在“每个工作人员的成本”基础上是否效果更好。
  • 补充一下@deceze 所说的,“T”实例实际上给了你一小部分 CPU see docs。它们仅适用于需要间歇性 CPU 的工作负载,而不是 100% 连续运行的工作负载。
  • 至于“t3a”:“a”表示它使用的是ARM处理器。您可能会找到比较 ARM 和 Intel 的基准,尽管任何此类基准可能与您的工作负载不匹配。
  • 我认为你需要更多关于机器正在做什么的数据。例如运行vmstat 2 之类的东西,看看机器实际上在做什么,即你是否受到 IO/CPU 的限制,以及在什么时候。请注意,RAM 永远不会真正“变满”,您可能需要一个更好的指标(例如,每秒与磁盘交换/从磁盘交换的页面数)

标签: python performance amazon-web-services amazon-ec2 web-scraping


【解决方案1】:
  1. 为什么 t2.micro 在几个循环后会变差,为什么性能变化如此之大?

如果您的 RAM 没有变满,那么这很可能是因为 Amazon 正在限制您的实例消耗的资源,无论是 CPU 还是 I/O。 Amazon 会在一段时间内为您提供更多的计算和吞吐量(以适应任何短期峰值),但您不应将其误认为是基准性能。

  1. 为什么 t3a.small 比 t2.micro 慢 50%?我认为“更大”的机器在任何方面都会更快。

T3 实例专为 CPU 使用率适中的应用程序而设计,这些应用程序在使用中会出现临时高峰。使用 t3,您要么支付额外费用以承受更大和更频繁的尖峰,要么您获得更少的基线性能(以相同的价格)以能够承受更大和更频繁的尖峰。这与您需要恒定 CPU 和 I/O 的网络抓取配置文件不匹配。

【讨论】:

    【解决方案2】:

    经过一些测试,我可以找到一个令人满意的解决方案:

    1. 实例从 t3a.small 切换到 t3.small 的性能提升了大约 40%,甚至比我的家用 PC 快 10-20%。感谢@kdgregory
    2. 我通过将 asyncio 与多处理而不是多线程结合使用来改进我的代码。这不仅可以进一步加快速度,而且可以更好地利用内存。此外,我摆脱了使用 bs4.BeautifulSoup (Python high memory usage with BeautifulSoup) 后仍然存在的标签。通过最后的改进,我可以防止内存在运行时增加。
    3. 长时间程序后内存比以前低。我发现我犯了一个初学者的错误:https://www.linuxatemyram.com/ 幸好这不是问题。

    现在代码比我家用电脑上的还要快,而且可以自动运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-02
      • 2021-12-25
      • 2012-04-12
      • 1970-01-01
      • 2023-02-24
      • 2020-01-16
      • 1970-01-01
      • 2018-04-07
      相关资源
      最近更新 更多