我用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秒)。这一切都让我困惑。
现在我的问题是:
这让我卡住了:
发布于 2020-11-10 10:30:48
如果您的RAM没有满,那么这很可能是因为Amazon限制了您的实例正在消耗的资源,不管是CPU还是I/O,Amazon将在一段时间内给您提供更多的计算和吞吐量(以适应任何短期峰值),但您不应将其误认为是基线性能。
T3实例是为在使用中遇到临时尖峰的中等CPU使用率的应用程序设计的。使用t3,您要么支付溢价才能承受更大、更频繁的峰值,要么,您获得的基线性能(以相同的价格)更少,从而能够承受更大、更频繁的峰值。这与您需要恒定CPU和I/O的web抓取配置文件不匹配。
发布于 2019-07-23 13:36:39
经过一些测试,我可以得到一个令人满意的解决方案:
现在,代码甚至比我的家庭PC上的速度更快,并自动运行。
https://stackoverflow.com/questions/56734108
复制相似问题