0

可能な限り速く、何千もの異なる Web サイトをスクレイピングする必要があります。1 つのノード プロセスで、1 秒あたり 10 個の URL を取得できました。タスクを 10 個のワーカー プロセスにフォークすると、1 秒あたり 64 リクエストに達する可能性があります。

どうしてですか?1 つのプロセスで 10 リクエスト/秒に制限されており、ワーカーを生成して 64 リクエスト/秒に達する必要があるのはなぜですか?

  • 最大ソケット/ホスト (agent.maxSockets) 制限に達していません。すべての URL は一意のホストからのものです。
  • 最大ファイル記述子の制限 (AFAIK) に達していません: 私の ulimit -n は 2560 で、lsof は私のスクレーパーが 20 個を超えるファイル記述子を使用しないことを示しています。
  • sysctl.conf の kern.maxfiles、kern.maxfilesperproc、kern.ipc.somaxconn、および kern.ipc.maxsockets の設定を増やし、再起動しました。無効。
  • ulimit -n を増やしてみました。変化なし。

私が知らない制限はありますか?私はMac OS-Xを使用しています。

4

1 に答える 1

1

1 秒あたり 10 リクエストという厳しい制限はないと思います。これは、node.js が単一のプロセスでクロールできる最高速度のようです。クロールの基本は次のとおりです。

  1. HTML ページをリクエストします。
  2. HTML ページを解析します。
  3. JavaScript を実行します。
  4. いくつかの後処理を行います。
  5. 次の URL 候補を読み込みます。

1 秒あたり 10 リクエストの場合、上記の手順を 1 秒間に 10 回実行していることになります。クローラーが単一のプロセス (スレッド) でクロールできる最速は、帯域幅接続の速度です。これは、ステップ 1 のみを実行している場合です。ステップ 2 から 5 を実行している場合、クロール速度は次のようになります。各 Web リクエストの間に他のことを行っているため、帯域幅接続よりも低くなります。

速度を最大化するには、帯域幅接続が最大になるまでステップ 1 を常に実行する必要があります。その方法は、プロセス (スレッド) を追加することです。非常に単純な例として、この状況を考えてみましょう。ステップ 1 はFetchingとして要約でき、ステップ 2 から 5 はProcessingとして要約できます。したがって、2 つのプロセスが同時に動作している場合、一方が処理中にもう一方がフェッチでき、理論的にはスループットを最大化できます。実際には (ご存じのとおり)、処理部分には複数のステップがあるため、2 つ以上のプロセスが必要になります。

平均的な Web ページが約 128 KB であると考えると、1 つのプロセスを使用して 1 秒あたり 10 回の要求を行う場合、帯域幅の使用量は 10 Mbps になります。64 リクエストの場合、少なくとも 64 Mbps の帯域幅速度が必要です。帯域幅接続は本当に 64 Mbps ですか?

于 2012-06-07T15:32:03.387 に答える