java performance io nio blocking

¿Ventajas de Java NIO en modo de bloqueo frente a E/S tradicional?



performance blocking (3)

Ya casi he decidido no utilizar Java NIO asíncrono y sin bloqueo. La complejidad frente al beneficio es muy cuestionable en general, y creo que no vale la pena en este proyecto en particular.

Pero la mayoría de lo que leí sobre NIO, y las comparaciones con java.io. * anterior, se centran en la E / S síncrona no bloqueante, asíncrona versus subproceso por conexión, utilizando java.io. *. Sin embargo, NIO se puede utilizar en el modo sincrónico, de bloqueo, de subproceso por conexión, que rara vez se discute, parece.

Aquí está la pregunta: ¿Existe alguna ventaja de rendimiento de la sincronización de NIO sincronizada frente a la E / S de sincronización síncrona tradicional (java.io. *)? Ambos serían hilos por conexión. ¿Cómo se compara la complejidad?

Tenga en cuenta que esta es una pregunta general, pero en este momento me preocupa principalmente la comunicación de socket TCP.


Básicamente, reduce el número de conexiones simultáneas y cuán ocupadas están esas conexiones. El bloqueo (subproceso estándar por conexión) es más rápido, tanto en latencia como en rendimiento (aproximadamente el doble de rápido para un servidor de eco simple). Entonces, si su sistema puede lidiar con el mantenimiento de un hilo para cada conexión (<1000 conexiones como regla general), utilice el enfoque de bloqueo. Si tiene muchas conexiones inactivas en su mayoría (por ejemplo, solicitudes de sondeo largo Comet o conexiones inactivas IMAP), el cambio a una arquitectura sin bloqueo podría ayudar a escalar su sistema.


No puedo hablar con la tecnología en particular, pero no es inusual que las bibliotecas asíncronas proporcionen operaciones síncronas para facilitar la depuración.

Por ejemplo, si tiene problemas, puede eliminar las partes asíncronas de la lógica sin tener que volver a escribir todo el proceso. Esto es especialmente útil ya que los procesos síncronos suelen ser mucho más fáciles de trabajar.


Una ventaja de NIO sobre el IO "tradicional" es que NIO puede usar buffers directos que le permiten al sistema operativo usar DMA para algunas operaciones (por ejemplo, leer desde una conexión de red directamente a un archivo mapeado en memoria) y así evitar copiar datos a buffers intermedios.

Si está moviendo grandes cantidades de datos en un escenario en el que esta técnica evita operaciones de copia que de otro modo se realizarían, esto puede tener un gran impacto en el rendimiento.