69 votes

Affinité de fil 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 le faire en Java. Mon instinct est que cela nécessitera un appel JNI, mais j'espérais que quelqu'un ici aurait un aperçu ou l'aurait peut-être déjà fait.

Merci!

49voto

BegemoT Points 2020

Vous ne pouvez pas le faire en java pur. Mais si vous en avez vraiment besoin, vous pouvez l'utiliser JNI pour appeler du code natif qui faire le travail. C'est le lieu de 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 réflexion, j'ai décidé de créer ma propre classe pour ceci: ThreadAffinity.java C'est de la JNA, et très simple -- donc, si vous voulez l'utiliser dans la production, peut-être vous devriez passé un certain temps à le rendre plus stable, mais pour l'analyse comparative et test il fonctionne bien comme c'est.

UPD 2: Il y a 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 a une autre interface

9voto

Dave Points 470

Je sais que cela fait longtemps, mais si quelqu'un tombe sur 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, recherchez les "nid" des threads que je veux verrouiller manuellement sur les cœurs.
  3. Taskset ces threads.

4voto

1voto

Coral Blocks Points 387

Mon intuition est que cela nécessitera un JNI appel

Il n'a même pas besoin d'une JNI appel. Vous pouvez utiliser la JNA. Mais vous devez garder à l'esprit que l'épinglage le fil d'un noyau est juste une partie du travail. Avant de vous code pin, vous devez isoler le noyau du noyau interruptions (utilisateur et système l'espace) et de matériel interruptions (IRQ). Sans, fil épinglage est assez inutile. Prendre un coup d'oeil sur CoralThreads pour voir comment cela peut être fait avec la JNA.

Avertissement: je suis l'un des développeurs de CoralThreads.

0voto

questzen Points 1963

Messieurs, cela ne sera possible que si vous utilisez des appels natifs. La machine virtuelle Java est censée être indépendante de la plate-forme, aucun appel système effectué dans ce but n'entraînera un code portable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X