Pregunta

Tengo un programa Java para hacer un conjunto de cálculos científicos a través de múltiples procesadores al dividirlo en partes y ejecutar cada pieza en un hilo diferente. El problema es trivialmente particionable, por lo que no hay contención ni comunicación entre los hilos. Los únicos datos comunes a los que acceden son algunas cachés estáticas compartidas que no necesitan tener su acceso sincronizado, y algunos archivos de datos en el disco duro. Los hilos también escriben continuamente en el disco, pero para separar archivos.

Mi problema es que a veces, cuando ejecuto el programa, obtengo una velocidad muy buena y, a veces, cuando ejecuto exactamente lo mismo, funciona muy lentamente. Si veo que se ejecuta lentamente y ctrl-C y lo reinicio, generalmente comenzará a ejecutarse rápidamente nuevamente. Parece establecerse en modo lento o rápido al principio de la ejecución y nunca cambia entre modos.

Lo he conectado a jconsole y no parece ser un problema de memoria. Cuando lo he visto funcionar lentamente, he intentado conectar 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 ejecución rápida no parecen ser muy diferentes. He intentado usar diferentes recolectores de basura y diferentes tamaños de las diferentes partes del espacio de memoria, también.

Mi máquina es una Mac Pro con partición RAID rayada. El uso de la CPU nunca disminuye, ya sea que se ejecute lenta o rápidamente, lo que cabría esperar si los hilos pasaran demasiado tiempo bloqueando las lecturas del disco, por lo que no creo que pueda ser un problema de lectura de disco.

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

¿Fue útil?

Solución

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

Intente conectarse con VisualVM y use el monitor Thread.

https://visualvm.dev.java.net

Puede que tenga que conectarse antes de que ocurra el problema.

Otros consejos

En segundo lugar, debería hacerlo con un generador de perfiles mirando la vista de subprocesos: cuántos subprocesos, en qué estados se encuentran, etc. Puede ser una extraña condición de carrera que ocurra de vez en cuando. También podría ser el caso de que la instrumentación de las clases con ganchos de perfil (que causa la desaceleración), elimina la condición de la carrera y no verá una desaceleración con el perfil adjunto: /

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

¿Estás generando el mismo número de hilos cada vez? ¿Es ese número menor o igual al número de hilos disponibles en su plataforma? Ese número se puede verificar o calcular con una precisión justa.

¡Publique cualquier resultado!

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

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

No sé mucho sobre OSX, pero en Linux el "gratis" El comando es útil para este propósito.

¿Otro problema que podría causar esta desaceleración son los archivos de registro? He conocido al menos un código de registro que ralentizó el sistema de forma incremental a medida que crecieron los archivos de registro. Es posible que sus hilos se estén sincronizando en un archivo de registro que está creciendo en tamaño, luego, cuando reinicia su programa, se utiliza otro archivo de registro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top