Affinité du thread Java

Est-ce que quelqu’un connaît un moyen de verrouiller des threads individuels au sein d’un processus Java sur des cœurs de processeur spécifiques (sous Linux)? Je l’ai fait en C, mais je ne trouve pas comment faire cela en Java. Mon instinct est que cela nécessitera un appel JNI, mais j’espérais que quelqu’un ici pourrait avoir un aperçu ou aurait pu le faire avant.

Merci!

Vous ne pouvez pas faire cela en java pur. Mais si vous en avez vraiment besoin – vous pouvez utiliser JNI pour appeler le code natif qui fait le travail. C’est l’endroit pour commencer avec:

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: Après quelques reflections, j’ai décidé de créer ma propre classe pour ceci: ThreadAffinity.java Il est basé sur JNA et très simple – donc, si vous voulez l’utiliser dans la production, vous devriez passer du temps il est plus stable, mais pour le benchmarking et les tests, il fonctionne bien tel quel.

UPD 2: Il existe une autre bibliothèque pour travailler avec l’affinité de threads en Java. Il utilise la même méthode que précédemment, mais a une autre interface

Je sais que ça fait un moment, mais si quelqu’un découvre ce sujet, voici comment j’ai résolu ce problème. J’ai écrit un script qui ferait ce qui suit:

  1. “jstack -l”
  2. Prenez les résultats, trouvez le “nid” des threads que je veux verrouiller manuellement aux cœurs.
  3. Taskset ces threads.

IMO, cela ne sera possible que si vous utilisez des appels natifs. JVM est censé être indépendant de la plate-forme, tout appel système effectué à cette fin ne produira pas de code portable.

Ce n’est pas possible (au moins avec Java simple).

Vous pouvez utiliser des pools de threads pour limiter la quantité de threads (et donc de cœurs) utilisés pour différents types de travail, mais il est impossible de spécifier un core à utiliser.

Il y a même la (petite) possibilité que votre runtime Java ne prenne pas en charge les threads natifs pour votre système d’exploitation ou votre matériel. Dans ce cas, des threads verts sont utilisés et un seul cœur sera utilisé pour l’ensemble de la JVM.