2012-07-11 14 views
13

Estoy utilizando herramientas basadas en webkit para construir un navegador sin cabeza para rastrear páginas web (lo necesito porque me gustaría evaluar el javascript encontrado en las páginas y buscar la página final). Pero, los dos sistemas diferentes que he implementado hasta ahora muestran un rendimiento muy bajo. He implementado dos sistemas diferentes, los cuales usan WebKit como backend:Uso de webkit para la exploración sin cabeza

  1. el uso de Google Chrome: Me gustaría empezar Google Chrome y comunicarse con cada uno de tabulación con WebSockets expuestos por Chrome para la depuración remota (debugging over wire). De esta forma puedo controlar cada pestaña, cargar una página nueva y una vez que la página está cargada, obtengo el DOM de la página web cargada.
  2. Usando phantomjs: phantomjs usa webkit para cargar páginas y proporciona una opción de navegación sin cabeza. Como se explica en los ejemplos de phantomjs, uso page.open para abrir una nueva URL y luego buscar el dom una vez que se carga la página mediante la evaluación de javascript en la página.

Mi objetivo es rastrear las páginas lo más rápido que pueda y si la página no se carga en los primeros 10 segundos, declare que falló y continúe. Entiendo que cada página tarda un poco en cargarse, así que para aumentar el número de páginas que cargo por segundo, abro muchas pestañas en Chrome o comienzo varios procesos paralelos usando phantomjs. El siguiente es el rendimiento que observo:

  1. Si abro más de 20 pestañas en las instancias de Chrome/20 phantomjs, el uso de la CPU se dispara.
  2. Debido al alto uso de CPU, muchas páginas tardan más de 10 segundos en cargarse y, por lo tanto, tengo una tasa de fallas más alta (~ 80% de las solicitudes de carga de página)
  3. Si intento mantener el error en menos más del 5% de las solicitudes totales, no puedo cargar más de 1 URL por segundo.

Después de probar tanto los sistemas basados ​​en webkit, se siente como el cuello de botella es el motor de renderizado WebKit y por lo tanto les gustaría entender de otros usuarios aquí, el número de URLs por segundo que puedo esperar a gatear. Mi configuración de hardware es:

  1. Procesador: Intel® Core ™ i7-2635QM (1 procesador, 4 núcleos) tarjeta
  2. Gráficos: AMD Radeon HD 6490M (256)
  3. memoria: 4 GB
  4. Red anchura de banda es lo suficientemente bueno para ser capaz de cargar páginas más que el rendimiento que estoy observando

la pregunta que estoy tratando de hacer esta lista de correo es: ¿Alguien tiene experiencia en el uso de WebKit para el rastreo de páginas web de forma aleatoria conjunto de Las URL (por ejemplo, elegir 10k URL de la transmisión de Twitter), ¿cuántas URL puedo razonablemente rastrear por segundo?

Gracias

+1

Voy a saber la respuesta a sus preguntas en un mes más o menos :) Estoy haciendo algo similar (pero quiero evaluar algo más) con 'Node.js' y' PhantomJS'. ¡Mientras tanto, me beneficiaré de las respuestas que puedas obtener! –

Respuesta

3

Esta pregunta es en realidad más relacionado con el hardware que el software, pero déjame momento de todos modos en algunas direcciones mejores.

Primero, entienda que cada página en sí está generando múltiples hilos. Descargará la página y luego comenzará a generar nuevos subprocesos de descarga para los elementos de la página, como archivos JavaScript, archivos CSS e imágenes.[Ref: http://blog.marcchung.com/2008/09/05/chromes-process-model-explained.html]

Por lo tanto, dependiendo de cómo esté estructurada la página, puede terminar con un número justo de hilos al mismo tiempo solo para la página, agregue arriba tratando de hacer demasiadas cargas a la vez y tienes un problema

El hilo de desbordamiento de pila en Optimal number of threads per core proporciona más información sobre la situación que está experimentando. Su sobrecarga de su CPU.

Su procesador es de 4 núcleos físicos de 8 lógicos. Recomiendo generar no más de 4 conexiones a la vez, dejando los núcleos lógicos secundarios para manejar algunos de los hilos allí. Es posible que incluso necesite reducir este número, pero 4 es un buen punto de partida. Al renderizar las páginas 4 a la vez en lugar de sobrecargar todo el sistema tratando de renderizar 20, en realidad aumentará la velocidad general, ya que terminará con mucho menos intercambio de caché. Comience cronometrando su tiempo contra varios lugares fácilmente temporizados. Entonces prueba con menos y más. Habrá un punto dulce. Tenga en cuenta que es probable que la versión de navegador sin cabeza de PhantomJS sea mejor para usted que, como en el modo sin cabeza, probablemente no descargue las imágenes (una ventaja).

Sin embargo, su mejor opción general aquí es hacer una página parcial renderizándose usando la fuente webkit en http://www.webkit.org/. Como todo lo que parece que necesitas renderizar es el html y el javascript. Esto reduce el número de conexiones y le permite controlar sus hilos con una eficiencia mucho mayor. En ese caso, podría crear una cola de eventos, colocar todas las URL principales allí. Genera 4 subprocesos de trabajo que funcionan fuera de la cola de trabajo, ya que procesan una página y necesitan descargar fuentes adicionales para agregar esas descargas adicionales a la cola. Una vez que todos los archivos de una página se descargan en la memoria (o en el disco si le preocupa el RAM) para una URL en particular, puede agregar un elemento a la cola de eventos para procesar la página y luego analizarla para lo que necesite.

Cuestiones relacionadas