2012-02-08 10 views
9

Tengo una aplicación java que usa unas cuantas instancias de MulticastSocket para escuchar en algunas fuentes de multidifusión UDP. Cada zócalo se maneja mediante un hilo dedicado.
El hilo lee cada Datagram, analiza su contenido y escribe para registrar (log4j) el ID de secuencia del paquete (largo) y la fecha y hora en que se recibió el Datagram.java - Problemas de MulticastSocket en Windows Server 2008

Cuando trato de ejecutar 2 instancias de la misma aplicación en un servidor Windows 2008 R2, con 2 * 6 núcleos y comparar las 2 registros creados por las 2 aplicaciones, noto que con bastante frecuencia la sincronización de los paquetes no es lo mismo

La mayoría de los paquetes son recibidos por las 2 aplicaciones al mismo tiempo (Milis), pero con frecuencia hay una diferencia de aproximadamente 1-7ms diff entre el tiempo de recepción del mismo paquete por las 2 aplicaciones.

Intenté asignar más búferes en la NIC, y también hice que el búfer de lectura de zócalos fuera más grande. Además intenté minimizar las ejecuciones de GC y también uso -verbose: gc y puedo ver que los tiempos de GC y la diferencia de temporización problemática no ocurren al mismo tiempo. Esto me permite suponer que mi problema no está relacionado con GC.

No se observó ningún problema de paquetes de caída, y no es probable que exista un problema de ancho de banda.

Ideas/Opiniones son bienvenidas. Gracias.

+1

AFAIK La frecuencia de interrupción del sistema operativo es de 1 por 10 ms, por lo que el sistema operativo no puede garantizar precisiones de tiempo superiores a esa. –

Respuesta

6

Por defecto, la frecuencia de interrupción del temporizador de Windows es de 100 Hz (1 tick por 10ms). Significa que OS no puede garantizar que los subprocesos Java se despierten con mayor precisión.

He aquí un extracto de un prominente James Holmes article sobre programación en Java - que podría ser su caso:

para usuarios de Windows, sobre todo en sistemas de doble núcleo o multi-procesador (y parece más comúnmente en x64 Sistemas AMD) si ve un comportamiento de sincronización errático en Java u otras aplicaciones (juegos, presentaciones multimedia) en su sistema, intente agregar el modificador/usepmtimer en su archivo boot.ini.

PS: de ninguna manera estoy creíble en el campo de la optimización del rendimiento de Windows, partiendo también de Windows 2008 HPET es compatible, pero la forma en que se relaciona con la frecuencia de interrupción del temporizador es un misterio para mí.

0

7ms es un muy buen resultado para una máquina de 6 núcleos, y la deriva en Java será mucho más alta que eso si el recolector de basura entra en acción. No olvide que el tiempo de ejecución de Java también tiene su propia sobrecarga.

Cuestiones relacionadas