web-dev-qa-db-fra.com

Java affinité de thread

Quelqu'un connaît-il un moyen de verrouiller des threads individuels dans un processus Java vers des cœurs de processeur spécifiques (sous Linux)? J'ai fait cela en C, mais je ne trouve pas comment le faire à 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!

60
Dave

Vous ne pouvez pas faire cela en Java pur. Mais si vous en avez vraiment besoin - vous pouvez utiliser JNI pour appeler du code natif qui fait le travail. Voici le point de départ:

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 réflexion, j'ai décidé de créer ma propre classe pour cela: ThreadAffinity.Java Il est basé sur JNA , et très simple - donc, si vous voulez l'utiliser en production, vous devriez peut-être passer un peu de temps à le rendre plus stable, mais pour le benchmarking et le test, cela fonctionne bien tel quel.

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

44
BegemoT

Je sais que cela fait un moment, mais si quelqu'un rencontre ce fil, 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 sur les cœurs.
  3. Taskset ces threads.
9
Dave
3
Vaibhav Kamble

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

Vous pouvez utiliser pools de threads pour limiter la quantité de threads (et donc de cœurs) utilisés pour différents types de travail, mais il n'y a aucun moyen de spécifier un noyau à utiliser.

Il y a même la (petite) possibilité que votre Java runtime ne supporte pas le threading natif pour votre OS ou votre matériel. Dans ce cas, threads verts sont utilisés et uniquement un cœur sera utilisé pour l'ensemble de la machine virtuelle Java.

0
Hardcoded

OMI, ce ne fera pas possible sauf si vous utilisez des appels natifs. La JVM est censée être indépendante de la plate-forme, tout appel système effectué pour y parvenir ne donnera pas lieu à un code portable.

0
questzen