我必须尽可能快地抓住数千个不同的网站。 在单个节点进程上,我每秒可以获取10个url。 虽然如果我将任务分配给10个工作进程,我可以达到64 reqs / sec。
为什么会这样? 为什么我在一个进程中限制为10 reqs / sec并且必须产生工人以达到64 reqs / sec?
我不知道有什么限制吗?我在Mac OS-X上。
答案 0 :(得分:1)
我认为每秒有10个请求的硬限制,这似乎是node.js能够在单个进程上爬行的最高速度。爬行的基础是这样的:
每秒10次请求,您将在1秒内执行上述步骤10次。您的抓取工具在单个进程(线程)上抓取的速度最快的是带宽连接的速度,如果您只是执行步骤1.如果您正在执行步骤2到5,那么您的抓取速度将是低于您的带宽连接,因为您在每个Web请求之间执行其他操作。
为了最大限度地提高速度,您必须确保始终执行第1步,直到最大化带宽连接,并且执行此操作的方法是添加更多进程(线程)。一个非常简单的例子是考虑这种情况:第1步可以概括为提取,第2步到第5步可以概括为处理。因此,如果您有两个进程同时工作,一个可以获取而另一个正在处理,这理论上会最大化您的吞吐量。实际上(正如您所知),您将需要的不仅仅是两个流程,因为处理部分有多个步骤。
如果您认为平均网页大约为128 KB,那么当您使用单个进程每秒发出10个请求时,您的带宽使用率将达到10 Mbps。在64个请求中,您将需要至少64 Mbps的带宽速度。那么你的带宽连接真的是64 Mbps吗?