2009-05-27 18 views
8

Tengo una aplicación que tiene una licencia para un número determinado de cpus y quiero poder establecer el número de CPU en el que Java se ejecuta en 1 antes de que se realice la verificación. Estoy ejecutando Solaris y he mirado pbind, pero pensé que si comencé la aplicación y luego utilicé pbind, habría revisado la licencia antes de que hubiera establecido la cantidad de CPU que Java podría usar.Configuración de java para usar una CPU

¿Alguien sabe una forma de iniciar una aplicación con un número determinado de CPU en Solaris?

Respuesta

3

Es una solución temporal, pero el uso de Solaris 10 se podrían establecer una zona con una sola CPU disponible y luego ejecutar la aplicación dentro de esa zona.

Si usted quiere hacer las pruebas sin correr la aplicación plena, este bit de Java es muy probable que lo que están utilizando para obtener el número de CPUs:

Runtime runtime = Runtime.getRuntime(); 
int nrOfProcessors = runtime.availableProcessors(); 

un ejemplo completo here.

+0

Me interesaría mucho saber si el uso de pbind cambia el resultado de availableProcessors(). –

+0

Debería hacer, el conjunto de tareas cambia los resultados de availableProcessors(). –

1

Esta no es una solución completa, pero podría ser suficiente para convertirse en una. Definitivamente hay un punto en el que existe el proceso java (y por lo tanto puede ser controlado por pbind) y en ese punto aún no ha ejecutado el código para hacer la verificación del procesador. Si pudiera pausar el lanzamiento de la aplicación hasta que pbind haya hecho su trabajo, debería estar bien (suponiendo que la idea de pbind funcione desde el punto de vista de la verificación de la CPU).

Una forma de hacer esto que definitivamente debería detener a la JVM en un lugar apropiado es la conexión de socket para los depuradores remotos y comenzando con el modo de suspensión. Si pasa los siguientes argumentos al java invocación:

-Xdebug -Xrunjdwp: transport = dt_socket, dirección = 8000, suspender = S, = y servidor

continuación, la JVM hará una pausa después de comenzar el proceso de Java pero antes de ejecutar la clase principal, hasta que un depurador/agente esté conectado al puerto 8000.

Entonces, quizás sería posible usar un script de envoltura para iniciar el programa en segundo plano con estos parámetros, dormir por un segundo más o menos, utilice pbind para establecer el número de procesadores en uno para el proceso de java, luego un ttach y desconecta un agente al puerto 8000 (que será suficiente para que Java proceda con la ejecución).

Defectos o posibles hipocresías en esta idea sería si la ejecución en modo de depuración afectaría notablemente el rendimiento de su aplicación (no parece tener un gran impacto en general), si puede controlar algún tipo de no-op Agente de JDWP desde la línea de comandos, y si puede abrir puertos en la máquina. No es algo que haya tratado de automatizar antes (aunque he usado algo muy similar de forma manual para aumentar el valor de nice de un proceso Java antes de soltarlo), por lo que podría haber otros problemas que he pasado por alto.

1

Creo que la respuesta más directa a su pregunta es usar pbind para vincular el proceso de shell en ejecución, y luego iniciar Java desde ese shell. De acuerdo con la página man, los efectos de pbind son heredados por procesos que se crean a partir de un proceso enlazado.Pruebe esto:

% pbind -b 0 $$ 
% java ... 
Cuestiones relacionadas