首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网络刮取性能问题EC2与家用PC

网络刮取性能问题EC2与家用PC
EN

Stack Overflow用户
提问于 2019-06-24 09:57:00
回答 2查看 973关注 0票数 1

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

python中的刮取器:通常情况下,刮取器的内循环执行以下操作:(1)刮取器在站点上查找urls (每个站点20个,一个站点=一个"site_break")。在第二步中,它(2)获取每个url的杂乱代码,在第三步中,它(3)将必要的信息提取到dataframe中,在第四步中,它(4)将数据文件保存为pkl。在所有循环之后,它打开并合并数据报,并将其保存为csv。

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

为了充分使用RAM并将类似的进程粘合在一起,每个循环都由site_break = 100组成,即100个站点*20个urls /站点=2000个urls。这填补了我的个人电脑的RAM到96% (见下文)。由于我必须在步骤1和步骤2中等待服务器响应,所以我使用maxWorkers=15实现了线程处理(或者使用类似结果的20-35 )。此实现将运行时间减少了80%。我确信,通过实现异步,我可以获得其他一些.%。尽管如此,我还是想从精益的MVP开始。在处理器消耗步骤3中,我还没有实现多处理(目前为止),因为我的目标是在t2.micro上实现成本高效/免费的实现(只有一个处理器)。

规格:家用PC: Intel Core i7-6500 CPU,2.59GHz (2核,4个逻辑处理器),RAM 8.00 GiB,64位,x64,50 Mbit/s下载速率(有效高达45 Mbit/s),Python3.7.3,conda env

EC2 t2.微:vCPU= 1,RAM1.0 GiB,网络性能“低到中等”(论坛上的研究告诉我这可能超过50 Mbit),Ubuntu18.04,Python3.7.3,conda

EC2 t3a.small: vCPU= 2,RAM 2.0 GiB,网络性能“低到中等”,但是另一个AWS站点告诉我:“高达5 Gbit/s",Ubuntu18.04,Python3.7.3,conda

因为t2的内存只有1 GiB,所以我把site_break从100降到了25。后来,内存仍然满了,所以我在进一步的步骤中把它从25减少到15,12,10,最后5。对于12,10,尤其是5,它工作得很好:我需要5:30分钟的循环,在我的PC上site_break = 100。T2. site_break = 5需要8-10秒的时间,而对于类似的100个站点,则需要3:00min,这在第一分钟就让我满意了。不幸的是,出现了以下问题:在20-30循环之后,性能直线下降.开环时间从8秒迅速增加到2分钟以上。我的第一个假设是,它是低内存,在小循环期间,它似乎没有满。在停止和清除RAM之后,性能在第二个或第三个循环后下降。如果我在几个小时后启动它,第一种情况(在20-30循环后下降)会重复。

因为我最初认为它与内存有关,所以我在t3a.small上推出了第二个实例,它具有更多的CPU、内存和“高达5 Gbit/a”的网络性能。我将代码切片到site_break = 25,并对脚本进行了星形处理。我仍然以1:39-1:55分钟的恒定速度运行(这是t2的一半速度),在它的最佳阶段(10秒,5 =>,50秒,25分钟)。类似地,我用site_break = 25从家里的PC启动脚本,每次循环1:15-1:30分钟,它总是更快。(停止时间手动会导致下载慢10-15秒,处理慢10-15秒)。这一切都让我困惑。

现在我的问题是:

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

这让我卡住了:

  1. 我不想经常使用我的家庭电脑(每天刮擦),因为连接在凌晨4点中断一段很短的时间,导致脚本的挂起)。此外,我不希望脚本一直运行手动和个人电脑,并阻止我的私人互联网流。
  2. 微:是无用的,因为性能恶化后是不可接受的。
  3. t3a.small:性能比私人电脑低10-20% .我还以为会更好呢?这让我对在EC2上刮擦产生了怀疑。而且,与t2相比,我在一开始无法理解它的低性能。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-10 10:30:48

  1. 为什么t2在几个循环之后要进行测试,为什么性能变化如此之大?

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

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

T3实例是为在使用中遇到临时尖峰的中等CPU使用率的应用程序设计的。使用t3,您要么支付溢价才能承受更大、更频繁的峰值,要么,您获得的基线性能(以相同的价格)更少,从而能够承受更大、更频繁的峰值。这与您需要恒定CPU和I/O的web抓取配置文件不匹配。

票数 1
EN

Stack Overflow用户

发布于 2019-07-23 13:36:39

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

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

现在,代码甚至比我的家庭PC上的速度更快,并自动运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56734108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档