Maximizarea url-urilor/secundă într-o racletă paralelă

Trebuie să distrug mii de site-uri diferite, cât mai repede posibil. Pe un singur proces de nod am reușit să preiau 10 urlări pe secundă. Deși dacă am sarcina la 10 procese de muncitori, pot ajunge la 64 reqs/sec.

De ce este așa? De ce sunt limitat la 10 reqs/sec într-un singur proces și trebuie să-i fac pe muncitori să atingă 64 reqs/sec?

  • Nu ating limita maximă a socketurilor/gazdei (agent.maxSockets): toate urlările provin din gazde unice.
  • Nu ating limita maximă a descriptorilor de fișiere (AFAIK): ulimit -n este 2560 și lsof arată că racleta mea nu folosește niciodată mai mult de 20 de descriptori de fișiere.
  • Am creat setările pentru kern.maxfiles, kern.maxfilesperproc, kern.ipc.somaxconn și kern.ipc.maxsockets în sysctl.conf și am repornit. Nici un efect.
  • S-a încercat creșterea ulimit -n. Nici o schimbare.

Există o limită despre care nu știu? Sunt pe Mac OS-X.

0
Nu cred că postarea întregului cod aici ar fi relevantă pentru această întrebare. Procesul este foarte simplu: 1. începe 10 lucrători cu child_process.fork; 2. citiți 400 url-uri aleatorii din db; 3. treci fiecare url la lucrător aleatoriu; 4. Calculați numărul de răspunsuri pe secundă.
adăugat autor Micko, sursa
Poate un cod?
adăugat autor lanzz, sursa

1 răspunsuri

Nu cred că există o limită greu de 10 cereri pe secundă, care pare a fi cea mai mare viteză la care node.js este capabil să acceseze cu crawlere un singur proces. Elementele de bază ale accesării cu crawlere sunt următoarele:

  1. Solicitați o pagină HTML.
  2. Parsează pagina HTML.
  3. Executați JavaScript.
  4. Faceți o prelucrare post-post.
  5. Încărcați candidatul pentru următoarea adresă URL.

La 10 cereri pe secundă, executați pașii de mai sus de 10 ori în 1 secundă. Cea mai rapidă crawler pe care o puteți accesa cu crawlere într-un singur proces (firul) este cu viteza conexiunii la lățime de bandă, asta dacă faci doar pasul 1. Dacă faci pașii 2 până la 5, atunci viteza de accesare cu crawlere va fi mai mică decât conexiunea de lățime de bandă, deoarece faceți alte lucruri între fiecare solicitare web.

Pentru a maximiza viteza, trebuie să vă asigurați că desfășurați în mod constant pasul 1 până când maximizați conexiunea de lățime de bandă, iar modul de a face acest lucru este de a adăuga mai multe procese (fire). Un exemplu foarte simplu este de a lua în considerare această situație: pasul 1 poate fi rezumat ca preluare , iar pasul 2 până la 5 poate fi rezumat ca Prelucrare . Deci, dacă aveți 2 procese care lucrează în același timp, puteți prelua în timp ce celălalt procesează și teoretic maximizează capacitatea de procesare. În realitate (după cum ați aflat) veți avea nevoie de mai mult de două procese, deoarece partea de procesare are mai mulți pași.

Dacă considerați că o pagină web medie este de aproximativ 128 KB, utilizarea lățimii de bandă va fi de 10 Mbps atunci când efectuați 10 cereri pe secundă utilizând un singur proces. La 64 de solicitări, veți avea nevoie de o viteză de bandă de cel puțin 64 Mbps. Deci, conexiunea dvs. de bandă este de fapt 64 Mbps?

1
adăugat