2012-01-16 12 views
30

Estamos evaluando los programas Java existentes. Son aplicaciones de subprocesos diseñadas para beneficiarse de CPU multinúcleo. Nos gustaría medir el efecto del número de núcleos en la velocidad de ejecución, pero no estamos dispuestos (y no podemos) a cambiar el código de estas aplicaciones.¿Es posible forzar a una aplicación Java existente a usar no más de x núcleos?

Por supuesto, podríamos probar el software en diferentes máquinas, pero esto es costoso y complicado. Preferiríamos tener una solución de software.

Nota: puede suponer que la plataforma de prueba es Windows, Linux o Mac. Idealmente, nos gustaría poder ejecutar las pruebas en cualquiera de estas plataformas.

+0

No creo que esté controlado en los programas de Java, supongo que es una decisión específica del sistema operativo. Tengo curiosidad de ver a los expertos comentar sobre esta pregunta. – kosa

+0

Si necesita alguna solución/personalización de software personalizada que probablemente será mucho más costosa que el hardware mismo. Y no estoy seguro de si puede obligar a un programa Java a usar solo un núcleo en cualquier momento de todos modos. Cosas relacionadas con OS/JVM – fmucar

+0

Considere la posibilidad de ejecutar dentro de una máquina virtual como VirtualBox. Luego tiene una GUI simple para determinar la potencia de la CPU disponible para la instancia. –

Respuesta

32

Se llama establecer afinidad de CPU y es una configuración de sistema operativo para procesos no específicos de Java.

En Linux: http://www.cyberciti.biz/tips/setting-processor-affinity-certain-task-or-process.html

En Windows: http://www.addictivetips.com/windows-tips/how-to-set-processor-affinity-to-an-application-in-windows/

En Mac que no se ve como se puede establecer: https://superuser.com/questions/149312/how-to-set-processor-affinity-on-os-x

+0

Además, consulte https://github.com/peter-lawrey/Java-Thread-Affinity para obtener una biblioteca de Java que pueda ayudarlo con sus pruebas. – philwb

+0

Además (a pesar de que puede depender de la implementación), si configura la afinidad de CPU * antes de * invocar 'Runtime.getRuntime(). AvailableProcessors()', este método reflejará el cambio y devolverá el número (reducido) de núcleos * disponible * para la JVM, de acuerdo con su [javadoc] (http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#availableProcessors--). – Bass

-5

Girar el problema al revés; en lugar de averiguar cómo restringir la aplicación para usar solo núcleos n en una máquina central m, averigüe cómo asegurarse de que solo haya n núcleos disponibles para su aplicación. Se puede escribir un programa muy simple que se come un núcleo haciendo algo como while (true); y empezar m - n instancias de ese programa que se ejecuta en la prioridad más alta, lo que garantiza que el código sólo tiene n núcleos disponibles.

Alternativamente, si su BIOS u OS permite deshabilitar los núcleos de la CPU, eso también funciona. Sé que las herramientas de CHUD en Mac OS X solían hacerlo, pero no he tocado esas herramientas desde la era G5, por lo que podría no funcionar más.

Cuestiones relacionadas