Afinidad de subprocesos Java


¿Alguien sabe de una manera de bloquear subprocesos individuales dentro de un proceso Java a núcleos de CPU específicos (en Linux)? He hecho esto en C, pero no puedo encontrar cómo hacerlo en Java. Mis instintos son que esto requerirá una llamada del JNI, pero esperaba que alguien aquí pudiera tener alguna idea o podría haberlo hecho antes.

Gracias!

Author: Dave, 2010-02-10

5 answers

No puedes hacer esto en java puro. Pero si realmente lo necesitas can puedes usar JNI para llamar al código nativo que hace el trabajo. Este es el lugar para comenzar con:

Http://ovatman.blogspot.com/2010/02/using-java-jni-to-set-thread-affinity.html

Http://blog.toadhead.net/index.php/2011/01/22/cputhread-affinity-in-java /

UPD: Después de pensar un poco, he decidido crear mi propia clase para esto: ThreadAffinity.java Está basado en JNA, y muy simple so por lo tanto, si desea usarlo en producción, puede ser que deba pasar algún tiempo haciéndolo más estable, pero para la evaluación comparativa y las pruebas funciona bien como es.

UPD 2: Hay otra biblioteca para trabajar con afinidad de subprocesos en java. Utiliza el mismo método que se señaló anteriormente, pero tiene otra interfaz

 43
Author: BegemoT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-30 10:56:36

Sé que ha pasado un tiempo, pero si alguien se encuentra con este hilo, así es como resolví este problema. Escribí un script que haría lo siguiente:

  1. "jstack-l"
  2. Tome los resultados, encuentre los "nid"de los hilos que quiero bloquear manualmente en los núcleos.
  3. Taskset esos hilos.
 9
Author: Dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-22 15:55:26
 3
Author: Vaibhav Kamble,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-01 12:00:36

IMO, esto no será posible a menos que utilice llamadas nativas. Se supone que JVM es independiente de la plataforma, cualquier llamada al sistema realizada para lograr esto no resultará en un código portátil.

 0
Author: questzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-10 16:09:02

No es posible (al menos con Java simple).

Puede usar grupos de subprocesos para limitar la cantidad de subprocesos (y por lo tanto núcleos) utilizados para diferentes tipos de trabajo, pero no hay forma de especificar un núcleo para usar.

Existe incluso la (pequeña) posibilidad de que su tiempo de ejecución de Java no admita el subproceso nativo para su sistema operativo o hardware. En este caso, se utilizan hilos verdes y solo se utilizará un núcleo para toda la JVM.

 0
Author: Hardcoded,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-10 16:37:55