2012-02-20 10 views
8

Me estoy mojando los pies con el multiprocesamiento (¡y es totalmente increíble!), Pero me preguntaba si había alguna guía para seleccionar la cantidad de procesos. ¿Se basa solo en la cantidad de núcleos en el servidor? ¿De alguna manera se basa en la aplicación que ejecuta (número de bucles, la cantidad de CPU que usa, etc.)? etc ... ¿cómo decido cuántos procesos generar? En este momento, solo estoy adivinando y agregando/eliminando procesos, pero sería genial si hubiera algún tipo de directriz o práctica recomendada.¿Hay alguna guía a seguir al elegir el número de procesos con multiprocesamiento?

Otra pregunta, sé lo que sucede si agrego muy pocas (programa es slooow) pero ¿qué ocurre si agrego 'demasiadas'?

Gracias!

Respuesta

9

Si todos sus subprocesos/procesos están vinculados a la CPU, debe ejecutar tantos procesos como la CPU informe los núcleos. Debido a HyperThreading, cada núcleo de CPU físico puede presentar múltiples núcleos virtuales. Llame al multiprocessing.cpu_count para obtener la cantidad de núcleos virtuales.

Si solamente p de 1 de los hilos es vinculado a la CPU, se puede ajustar ese número multiplicando por p. Por ejemplo, si la mitad de sus procesos están vinculados a la CPU (p = 0.5) y tiene dos CPU con 4 núcleos cada uno y 2x HyperThreading, debe iniciar 0.5 * 2 * 4 * 2 = 8 procesos.

Si tiene muy pocos procesos, la aplicación se ejecutará más despacio de lo esperado. Si su aplicación se escala perfectamente y solo está unida a la CPU (es decir, es 10 veces más rápida cuando se ejecuta en 10 veces la cantidad de núcleos), esto significa que la velocidad es más lenta en relación. Por ejemplo, si su sistema requiere 8 procesos, pero solo inicia 4, solo usará la mitad de la capacidad de procesamiento y tardará el doble. Tenga en cuenta que, en la práctica, ninguna aplicación escala perfectamente, pero algunas (trazado de rayos, codificación de video) son bastante cercanas.

Si tiene demasiados procesos, la sobrecarga de sincronización aumentará. Si su programa tiene una sobrecarga de sincronización pequeña, esto no afectará el tiempo de ejecución general, pero puede hacer que otros programas aparezcan más lentos de lo que son a menos que establezca sus procesos con una prioridad más baja. Un número excesivo de procesos (digamos, 10000) está bien en teoría si su sistema operativo tiene un buen programador. En la práctica, prácticamente cualquier sincronización hará que la sobrecarga sea insoportable.

Si no está seguro de si su aplicación está unida a la CPU y/o a escala perfecta, simplemente observe la carga del sistema con diferentes conteos de hilos. Desea que la carga del sistema sea ligeramente inferior al 100%, o la más precisa sea uptime como el número de núcleos virtuales.

+0

Gracias por la gran respuesta. No sabía todo eso. ¿Qué pasa si hay un poco de partes no vinculadas a la CPU en la aplicación? Por ejemplo, una gran cantidad de cálculos de la CPU, pero luego el resultado final se guarda en el archivo o la base de datos. ¿Eso significa que debería crear más procesos ya que algunos tienen que esperar a la red final (base de datos) o a la escritura en el disco (escritura de archivos)? – Lostsoul

+0

@Lostsoul En general, sí, si la cuota de actividad vinculada al disco es significativa. Si está escribiendo un archivo de suma breve (por ejemplo, la imagen después de raytracing una escena complicada), este efecto es insignificante.Si su aplicación lee y escribe muchos datos, debería aumentar la cantidad de procesos. Se actualizó la respuesta con un párrafo: ¡si no está seguro, pruébelo! – phihag

+2

Solo para agregar a la parte de observación: obviamente desea evitar que la utilización de la CPU aumente debido a la sobrecarga de sincronización. Por lo tanto, al realizar el experimento, debe medir tanto la carga del sistema como el rendimiento de la aplicación. – millimoose

1

Definitivamente se basa en lo que hace la aplicación. Si tiene una CPU pesada, la cantidad de núcleos es un punto de inicio sensato. Si es IO-heavy, los procesos múltiples no ayudarán al rendimiento de todos modos. Si se trata principalmente de CPU con OI ocasional (por ejemplo, optimización PNG), puede ejecutar algunos procesos más que la cantidad de núcleos.

La única forma de saberlo con certeza es ejecutar la aplicación con cierta información realista y verificar la utilización de los recursos. Si tiene tiempo de CPU de sobra, agregue más procesos de trabajo.

Cuestiones relacionadas