Desaceleración aleatoria de Java en Mac OS

Tengo un progtwig Java para hacer un conjunto de cálculos científicos a través de múltiples procesadores dividiéndolos en partes y ejecutando cada pieza en un hilo diferente. El problema es trivialmente particionable por lo que no hay contención o comunicación entre los hilos. Los únicos datos comunes a los que acceden son algunos cachés estáticos compartidos que no necesitan tener su acceso sincronizado, y algunos archivos de datos en el disco duro. Los hilos también se escriben continuamente en el disco, pero en archivos separados.

Mi problema es que a veces cuando ejecuto el progtwig obtengo una velocidad muy buena, y otras veces cuando ejecuto exactamente lo mismo, se ejecuta muy lentamente. Si lo veo corriendo lentamente y presionando ctrl-C y lo reinicio, por lo general comenzará a ejecutarse rápido nuevamente. Parece que se establece en modo lento o modo rápido al principio de la carrera y nunca cambia entre modos.

Lo he conectado a jconsole y no parece ser un problema de memoria. Cuando lo he encontrado funcionando lentamente, he intentado conectarlo a un generador de perfiles, pero el generador de perfiles no se conecta. He intentado ejecutar con -Xprof pero los volcados entre una ejecución lenta y una rápida no parecen ser muy diferentes. También he intentado usar diferentes recolectores de basura y diferentes tamaños de las distintas partes del espacio de memoria.

Mi máquina es una mac pro con partición RAID rayada. El uso de la CPU nunca desciende si se está ejecutando de forma lenta o rápida, lo que cabría esperar si los hilos pasaran demasiado tiempo bloqueando las lecturas del disco, por lo que no creo que pueda tratarse de un problema de lectura.

Mi pregunta es, ¿qué tipo de problemas con mi código podrían causar esto? ¿O podría ser esto un problema de sistema operativo? No he podido duplicarlo en una máquina con Windows, pero no tengo una máquina con Windows con una configuración RAID similar.

Es posible que tenga un hilo que haya entrado en un bucle sin fin.

Intente conectarse con VisualVM y use el monitor Thread.

https://visualvm.dev.java.net

Es posible que deba conectarse antes de que se produzca el problema.

En segundo lugar, debería hacerlo con un generador de perfiles mirando la vista de hilos: cuántos hilos, en qué estados se encuentran, etc. Podría ser una condición de carrera extraña que ocurre de vez en cuando. También podría darse el caso de que la instrumentación de las clases con enganches del generador de perfiles (lo que provoca una ralentización), clasifique la condición de carrera y no verá ninguna desaceleración con el generador de perfiles adjunto: /

Por favor, eche un vistazo a esta publicación , o más bien a la respuesta, donde se menciona el problema de contención de caché.

¿Estás generando el mismo número de hilos cada vez? ¿Ese número es menor o igual al número de subprocesos disponibles en su plataforma? Ese número podría ser verificado o invitado con una precisión justa.

Por favor, publique cualquier finidngs!

¿Tienes una herramienta para medir la temperatura de la CPU? El sistema operativo podría estar acelerando la CPU para hacer frente a los problemas de temperatura.

¿Es posible que su progtwig se esté paginando en el disco a veces? En este caso, deberá observar el uso de memoria del sistema operativo en su totalidad, en lugar de solo su progtwig. Sé por experiencia que hay una gran diferencia en el rendimiento del tiempo de ejecución cuando la memoria se está paginando continuamente al disco y viceversa.

No sé mucho sobre OSX, pero en linux el comando “gratis” es útil para este propósito.

Otro problema que podría causar esta desaceleración es archivos de registro? He conocido al menos algo de código de registro que ralentizó el sistema de forma incremental a medida que crecían los archivos de registro. Es posible que sus subprocesos se estén sincronizando en un archivo de registro que está creciendo en tamaño, luego, cuando reinicia su progtwig, se usa otro archivo de registro.