在平行刮刀中最大化网址/秒

时间:2012-06-01 12:12:15

标签: node.js screen-scraping web-crawler

我必须尽可能快地抓住数千个不同的网站。 在单个节点进程上,我每秒可以获取10个url。 虽然如果我将任务分配给10个工作进程,我可以达到64 reqs / sec。

为什么会这样? 为什么我在一个进程中限制为10 reqs / sec并且必须产生工人以达到64 reqs / sec?

  • 我没有达到max sockets / host(agent.maxSockets)限制:所有网址都来自唯一的主机。
  • 我没有达到最大文件描述符限制(AFAIK):我的ulimit -n是2560,lsof表明我的scraper从不使用超过20个文件描述符。
  • 我在sysctl.conf中增加了kern.maxfiles,kern.maxfilesperproc,kern.ipc.somaxconn和kern.ipc.maxsockets的设置,然后重新启动。没效果。
  • 尝试增加ulimit -n。没有变化。

我不知道有什么限制吗?我在Mac OS-X上。

1 个答案:

答案 0 :(得分:1)

我认为每秒有10个请求的硬限制,这似乎是node.js能够在单个进程上爬行的最高速度。爬行的基础是这样的:

  1. 请求HTML页面。
  2. 解析HTML页面。
  3. 执行JavaScript。
  4. 做一些后期处理。
  5. 加载下一个候选网址。
  6. 每秒10次请求,您将在1秒内执行上述步骤10次。您的抓取工具在单个进程(线程)上抓取的速度最快的是带宽连接的速度,如果您只是执行步骤1.如果您正在执行步骤2到5,那么您的抓取速度将是低于您的带宽连接,因为您在每个Web请求之间执行其他操作。

    为了最大限度地提高速度,您必须确保始终执行第1步,直到最大化带宽连接,并且执行此操作的方法是添加更多进程(线程)。一个非常简单的例子是考虑这种情况:第1步可以概括为提取,第2步到第5步可以概括为处理。因此,如果您有两个进程同时工作,一个可以获取而另一个正在处理,这理论上会最大化您的吞吐量。实际上(正如您所知),您将需要的不仅仅是两个流程,因为处理部分有多个步骤。

    如果您认为平均网页大约为128 KB,那么当您使用单个进程每秒发出10个请求时,您的带宽使用率将达到10 Mbps。在64个请求中,您将需要至少64 Mbps的带宽速度。那么你的带宽连接真的是64 Mbps吗?