java multithreading io

¿Cuál es el número óptimo de subprocesos para realizar operaciones de IO en java?



multithreading (7)

Como todas las cosas relacionadas con el rendimiento depende.

Si estás enlazado a E / S, entonces agregar subprocesos no te ayudará en absoluto. (Ok, como señala , es posible que obtengas un aumento en el rendimiento, pero será pequeño) Si no estás vinculado a E / S, la adición de subprocesos puede ayudar.

No intente ser inteligente, pero la mejor manera de averiguarlo es hacer un perfil y ver qué funciona para sus circunstancias particulares.

Edición: Actualizado basado en comentarios

En la "Concurrencia de Java en la práctica" de Goetz, en una nota a pie de página en la página 101, escribe "Para problemas computacionales como este que no hacen E / S y no acceden a datos compartidos, las hebras Ncpu o Ncpu + 1 producen un rendimiento óptimo; más hebras no Ayuda, y de hecho puede degradar el rendimiento ... "

Mi pregunta es, al realizar operaciones de E / S, como la escritura de archivos, la lectura de archivos, la eliminación de archivos, etc. Entiendo que esto será solo un número de guía, ya que la velocidad del disco y una gran cantidad de otros factores juegan con esto.

Sin embargo, me pregunto: ¿pueden 20 hilos escribir 1000 archivos separados en el disco más rápido que 4 hilos en una máquina de 4 cpu?


En la práctica, las aplicaciones enlazadas a E / S todavía pueden beneficiarse sustancialmente de los subprocesos múltiples, ya que puede ser mucho más rápido leer o escribir unos pocos archivos en paralelo que de forma secuencial. Este es particularmente el caso donde el rendimiento global se ve comprometido por la latencia de la red. Pero también es el caso de que un subproceso puede estar procesando lo último que lee, mientras que otro subproceso está ocupado leyendo, lo que permite una mayor utilización de la CPU.

Podemos hablar de teoría todo el día, pero la respuesta correcta es hacer que el número de subprocesos sea configurable. Creo que encontrará que si lo aumenta más allá del 1, aumentará su velocidad, pero también llegará un punto de disminución de los rendimientos.


Ncpu + el número esperado de actividades de E / S concurrentes es mi número habitual.

La clave no es que 20 hilos pueden escribir un solo archivo en el disco más rápido que 4 hilos. Si solo tiene 1 subproceso por cpu, entonces mientras escribe en el disco, su proceso no podrá utilizar la cpu que aloja el subproceso que está haciendo el archivo IO. Esa CPU está efectivamente esperando que el archivo se escriba, mientras que si tiene un subproceso más, puede usar la CPU para realizar un procesamiento real en el ínterin.


Sí, 20 hilos definitivamente pueden escribir en el disco más rápido que 4 hilos en una máquina de 4 CPU. Muchos programas reales están enlazados a E / S más que a CPU. Sin embargo, depende en gran detalle de sus discos y de la cantidad de trabajo de la CPU que hacen sus otros subprocesos antes de que ellos también terminen esperando en esos discos.

Si todos los subprocesos solo escriben en el disco y no hacen nada más, entonces puede ser que 1 subproceso en una máquina con 4 CPU sea la forma más rápida de escribir en el disco. Depende completamente de la cantidad de discos que tenga, de la cantidad de datos que esté escribiendo y de lo bueno que sea su sistema operativo en la programación de E / S. Tu pregunta específica sugiere que quieres 4 hilos todos escritos en el mismo archivo. Eso no tiene mucho sentido, y en cualquier escenario práctico no puedo pensar cómo sería más rápido. (Tendría que asignar el archivo por adelantado, luego cada hilo buscaría () en una posición diferente, y terminaría simplemente golpeando el cabezal de escritura cuando cada hilo intentara escribir algunos bloques).

La ventaja de los subprocesos múltiples es mucho más simple cuando está conectado a la red. Es decir: esperando en un servidor de base de datos, o un navegador web, o similar. Allí estás esperando en múltiples recursos externos.


Si está utilizando E / S síncrona, debe tener un subproceso por cada solicitud de E / S simultánea que su máquina pueda manejar. En el caso de un solo disco duro de un solo eje, eso es 1 (puede leer o escribir, pero no ambos simultáneamente). Para un disco que puede manejar muchas solicitudes de E / S a la vez, eso sería, sin embargo, muchas solicitudes que puede manejar simultáneamente.

En otras palabras, esto no está limitado por el número de CPU, ya que la E / S no llega realmente a la CPU más allá de enviar solicitudes y esperar. Vea aquí para una mejor explicación.

Existe otra lata de gusanos con la cantidad de solicitudes de E / S que debe tener en vuelo en un momento dado.


Si lo único que hace con esos subprocesos es escribir en el disco, entonces su aumento de rendimiento será insignificante o incluso perjudicial, ya que generalmente los controladores están optimizados para lecturas secuenciales para discos duros, de modo que está transformando una escritura secuencial en un archivo a varias ". al azar "escribe.

El subprocesamiento múltiple solo puede ayudarlo con problemas de E / S vinculados si la E / S se realiza contra diferentes discos, diferentes tarjetas de red o diferentes servidores de bases de datos en términos de rendimiento . No obstante, en términos de rendimiento observado, la diferencia puede ser mucho mayor.

Por ejemplo, imagine que está enviando varios archivos a muchos receptores diferentes a través de una red. Aún está conectado a la red para que su velocidad máxima no sea más alta que, por ejemplo, 100 Mb / S, pero si usa 20 subprocesos, el proceso será mucho más justo.