Normalmente el sistema operativo (OS) decide qué CPUs o servicios básicos de la máquina se utilizarán para ejecutar una aplicación. Dependiendo del número de subprocesos requeridos por la aplicación en un momento dado y las necesidades de otras aplicaciones, el OS intentará mover subprocesos cuando sea necesario para mantener la carga total en cada CPU equilibrada. Cuando existan más subprocesos que CPUs (lo cual es normal), el OS compartirá CPUs entre varios subprocesos, lo que significa que los subprocesos serán pausados hasta que sea su turno. Para algunas aplicaciones este método podría no funcionar bien, y puede ser útil dedicar ciertos CPUs o grupos de CPUs en aplicaciones específicas. La mayoría de las plataformas en OS proporcionan la capacidad para especificar que un proceso solo debe ejecutarse en CPUs específicos. Esto comúnmente se llama Afinidad del Procesador o CPU pinning.

Al dedicar CPUs específicos a su aplicación puede ser una manera de asegurarse de que siempre tendrá suficientes recursos de CPU. Por el contrario, podría mantener de forma explícita algunos procesadores sin usar, con el fin de garantizar los recursos suficientes para otros procesos en ejecución en la misma máquina. Al configurar la afinidad del procesador también puede optimizar significativamente CPU caché. En otras palabras, cuando un proceso cambia de CPU, sus datos son transferidos de una CPU a otra. Esta transferencia es costosa pero puede minimizarla al enviar un pin al proceso a un número limitado de CPUs. Sin embargo, deberá tener cuidado al permitir suficientes procesadores para su aplicación, ya que puede tener la capacidad de ejecutar tareas en paralelo en diferentes CPUs cuando sea posible.

Desafortunadamente, Java no proporciona una solución para iniciar la JVM con núcleo o afinidad del procesador. En caso de que desee enviar un pin a su aplicación Java a CPUs específicos, tendría que usar cualquiera de los comandos procaff, taskset o invocar a código nativo. Processor affinity Estas soluciones son específicas de cada plataforma.

Solución

La edición Profesional del Java Service Wrapper se enfoca en ese problema al proveer una manera fácil y unificada para configurar la afinidad CPU sin tener que escribir algun código. A partir de la versión 3.5.27, solo Windows y Linux son compatibles, pero otras plataformas gradualmente se iran agregando en versiones futuras.

La configuración puede elegir como blanco al proceso del Wrapper así como a su proceso de JVM controlado. Cada uno tiene sus propiedades para configurar la afinidad del procesador pero si sólo especifica los del Wrapper, por defecto el proceso JVM controlado hereadará la misma configuración y automaticamente ejecutarla usando le mismo CPU(s) que el del proceso del Wrapper.

Descripción Técnica

Cómo configurar la afinidad CPU para el Wrapper

Compatibilidad :3.5.27
Ediciones :Edición ProfesionaEdición Estándar (No Soportado)Edición de la Comunidad (No Soportado)
Plataformas :WindowsMac OSX (No Soportado)LinuxIBM AIX (No Soportado)FreeBSD (No Soportado)HP-UX (No Soportado)Solaris (No Soportado)IBM z/OS (No Soportado)IBM z/Linux

Las propiedades que se utilizan para configurar la afinidad del procesador para el proceso del Wrapper se describen a continuación:

Por ejemplo, si quiere ejecutar el Wrappper sólo en el CPU número 1 y 2, puede escribir el siguiente conjunto de propiedades en su archivo de configuración (wrapper.conf):

Ejemplo
wrapper.cpu_affinity.set=TRUE
wrapper.cpu_affinity.default=FALSE
wrapper.cpu_affinity.1=TRUE
wrapper.cpu_affinity.2=TRUE

Por lo contrario, si quiere ejecutar el Wrappper en todos los CUPs excepto en el número 1 y 2, puede escribir lo siguiente:

Ejemplo
wrapper.cpu_affinity.set=TRUE
wrapper.cpu_affinity.default=TRUE
wrapper.cpu_affinity.1=FALSE
wrapper.cpu_affinity.2=FALSE

Cómo configurar la afinidad CPU para el proceso JVM

Compatibilidad :3.5.27
Ediciones :Edición ProfesionaEdición Estándar (No Soportado)Edición de la Comunidad (No Soportado)
Plataformas :WindowsMac OSX (No Soportado)LinuxIBM AIX (No Soportado)FreeBSD (No Soportado)HP-UX (No Soportado)Solaris (No Soportado)IBM z/OS (No Soportado)IBM z/Linux

Los ejemplos anteriores deberían ser suficientes en la mayoría de los casos ya que su aplicación Java, hilos de ejecución y todos sus procesos niño, heredarán automáticamente la misma configuración se ejecutarán en los mismos CPUs. Sin embargo, si quiere especificar una configuración diferente de CPU de afinidad para el Wrapper y sus procesos controlados es posible, usando el siguiente conjunto de propiedades.

Puede usar estas propiedades de la misma manera que se explicado previamente.

Ejemplo 1 (permite ejecutar la JVM sólo los CPUs número 1 y 2)
wrapper.cpu_affinity.set=TRUE
wrapper.java.cpu_affinity.default=FALSE
wrapper.java.cpu_affinity.1=TRUE
wrapper.java.cpu_affinity.2=TRUE
Ejemplo 2 (ejecutar la JVM en todos los CUPs excepto en el número 1 y 2)
wrapper.cpu_affinity.set=TRUE
wrapper.java.cpu_affinity.default=TRUE
wrapper.java.cpu_affinity.1=FALSE
wrapper.java.cpu_affinity.2=FALSE

Verificar que la afinidad CPU esta funcionando

En el ejemplo anterior talvez ha notado que el primer CPU fue designado con el índice 1, el segundo CPU con el índice 2 y asi sucesivamente. Al verificar el uso de CPU en su sistema, el primer CPU en ocasiones puede ser asignado con el índice 0 y en otras ocasiones con el índice 1. Cuando se configura el Wrapper, el primer CPU siempre será asignado con el índice 1.

Para ver el udo del CPU en Windows: abrir el Administrador de Tareas, seleccionar la lengüeta Rendimiento, usar botón derecho del ratón en el panel principal y en el menú contextual seleccionar Cambiar gráfica a procesadores lógicos. Si configuró su aplicación para ejecutarse solo en el CPU número1 y 2, verá algo como lo que se presenta a continuación:


Uso de CPUs en Windows (Administrador de Tareas)

Para ver el uso del CPU enLinux, puede usar el comando top en su terminal y presione 1 para ver en detalle los procesadores lógicos

En Ubuntu puede abrir Monitor del Sistema si prefiere ver el uso de CPU en una ventana GUI:


Uso de CPUs en Ubuntu (Monitor del Sistema)