2011-05-19 19 views
5

Estoy haciendo un webcrawler y usando hilos para descargar páginas.¿Hay alguna forma de determinar la cantidad ideal de hilos?

El primer factor que limita el rendimiento de mi programa es el ancho de banda, nunca puedo descargar más páginas que pueda obtener.

Lo segundo es lo que me ha interesado. Estoy usando subprocesos para descargar muchas páginas al mismo tiempo, pero a medida que creo más subprocesos, se produce más intercambio de procesador. ¿Hay alguna métrica/camino/clase de pruebas para determinar cuál es el número ideal de hilos o si después de cierto número, el rendimiento no cambia o disminuye?

+2

Si su aplicación estaba unida a la CPU, entonces el número es bastante similar al número de CPU que tiene en su máquina. Sin embargo, los programas vinculados a E/S (como los rastreadores web) terminan bloqueando mucho las E/S, por lo que es posible que pueda tener más. Por lo tanto, tengo que estar de acuerdo con el comentario de @ pst: ejecutar pruebas, luego descubrir el número ideal para su entorno. No hay una forma realmente buena de detectar esto en el código. (Sin embargo, PUEDE escribir el código de autoajuste una vez que sepa cómo verificar su ancho de banda "promedio actual") –

Respuesta

0

hemos desarrollado un rastreador web paralelo multiproceso. El rendimiento de benchmarking es la mejor manera de obtener ideas sobre cómo la bestia se encargará de su trabajo. Para un servidor Java dedicado, un hilo por núcleo es una base para comenzar, luego la E/S entra en juego y cambia.

Las prestaciones disminuyen después de cierto número de subprocesos. Pero también depende del sitio que rastrea, del SO que use, etc. Intente encontrar un sitio con un tiempo de respuesta meramente constante para realizar sus primeros puntos de referencia (como Google, pero tome diferentes servicios)

Con sitios web lentos , el mayor número de subprocesos tiende a compensar el bloqueo de E/S

+0

Prepararé un script después de que todo el programa haya terminado y ejecutaré las pruebas. –

-2

Digo usar algo así como Akka administrar los hilos para usted. Utilice Jersey http client lib con IO no bloqueante que funcione con la devolución de llamada si no recuerdo mal. Posiblemente sea la configuración ideal para ese tipo de tareas.

0

Tenga una mirada en mi respuesta en este hilo

How to find out the optimal amount of threads?

Su ejemplo es probable que se CPU obligado, por lo que necesita una manera de resolver la discordia para ser capaz de trabajar a cabo el número correcto de hilos en su caja para usar y ser capaz de mantenerlos ocupados. El perfilado ayudará allí, pero recuerde que dependerá de la cantidad de núcleos (así como de la latencia de la red ya mencionada, etc.), de modo que use el tiempo de ejecución para obtener la cantidad de núcleos cuando conecte el tamaño de su grupo de subprocesos.

Sin respuesta rápida Me temo que habrá un elemento de prueba, medida, ajuste, repetición ¡Me temo!

0

El número ideal de subprocesos debe ser similar al número de núcleos (núcleos virtuales) que proporciona su hardware. Esto es para evitar el cambio de contexto del hilo y la programación del hilo. Si realiza operaciones pesadas de E/S con muchas lecturas de bloqueo (sus bloques de subprocesos en una lectura de socket), le sugiero que rediseñe su código para usar API IO no bloqueantes. Normalmente, esto implicará un hilo "selector" que supervisará la actividad de miles de sockets y un pequeño número de subprocesos de trabajo que harán el procesamiento. Si su código está en Java, las API son NIO. La única llamada de bloqueo será cuando llame al selector.select() y solo bloqueará si no hay nada que procesar en cualquiera de los miles de sockets. Los marcos basados ​​en eventos como netty.io usan este modelo y han demostrado ser muy escalables y para usar mejor los recursos de hardware del sistema.

Cuestiones relacionadas