Nuestra aplicación está leyendo datos muy rápido a través de zócalos TCP/IP en Java. Estamos utilizando la biblioteca NIO con Sockets y Selector sin bloqueo para indicar que está listo para leer. En promedio, los tiempos generales de procesamiento para leer y manejar los datos leídos son de menos de milisegundos. Sin embargo, con frecuencia vemos picos de 10-20 milisegundos. (corriendo en Linux).Problema de rendimiento de socket TCP/IP de Java
Usando tcpdump podemos ver la diferencia de tiempo entre la lectura de tcpdump de 2 mensajes discretos, y comparar eso con el tiempo de nuestras aplicaciones. Vemos que tcpdump parece no tener ningún retraso, mientras que la aplicación puede mostrar 20 milisegundos.
Estamos bastante seguros de que esto no es GC, porque el registro del GC no muestra prácticamente GC completo, y en JDK 6 (por lo que entiendo) el GC predeterminado es paralelo, por lo que no debería detenerse haciendo Full GC).
Parece casi como si hay algún retraso para Selector.select(0)
método de Java para devolver la disposición a leer, porque en la capa TCP, que los datos ya está disponible para ser leído (y tcpdump lo está leyendo).
Información adicional: en la carga máxima estamos procesando aproximadamente 6,000 x 150 bytes de media por mensaje, o aproximadamente 900 MB por segundo.
Como dijo @Jim Lewis, es probable que haya una pérdida de tiempo debido al cambio de contexto, y no se puede controlar cómo implementa Java NIO internamente. Es completamente posible que la JVM agregue algunos gastos generales que no podrá eliminar. Dicho esto, sin ver más datos, realmente no puedo ofrecer una solución. –
Bueno, limpié mis respuestas no aceptadas. No quiero que nadie piense que no valoro el tiempo que tomaron para responder la pregunta. –
Podría ayudar a dar algunos detalles sobre jvm, kernel/distro, hardware – Matt