Fil de Java affinité
Quelqu'un connais un moyen de verrouiller les threads individuels au sein d'un processus Java spécifiques cœurs du PROCESSEUR (sur Linux)? Je l'ai fait en C, mais ne peut pas trouver comment le faire en Java. Mon intuition est que cela nécessitera un JNI appel, mais j'espérais que quelqu'un ici pourrait avoir quelques connaissances ou pourrait l'avoir fait avant.
Merci!
Voir ma réponse ci-dessous à Hassan du commentaire. Certains fils sont très gourmandes en e/S, d'autres sont à l'UC. Si je suis blindage interruptions d'e/S à un particulier de base, j'aimerais les e/S intensives threads sur les carottes sur le même socket, et j'aimerais bouclier de la CPU-intensive fils de l'I/O.
comme toujours avec ce type de "question de question": il n'est DONC pas sur le "pourquoi", c'est sur le "comment". L'affinité CPU existe pour une raison, il y a une raison, il existe des utilitaires sous Linux et Windows afin d'établir un processus de l'affinité du PROCESSEUR. L'OP est question est une question tout à fait pertinente qui ne veut pas de "pourquoi", mais "comment".
Je doute que le "pourquoi" est interdit, et que Java est généralement pas le premier langage de programmation à la simultanéité de performance liés à des réglages, je pense qu'un test de cohérence est valide.
Maintenant j'ai besoin de la réponse à cette question afin de mettre en place NUMA optimisations.
J'aime ces "Pourquoi tu veux faire cette question?" Si un grave ingénieur demander quelque chose s'il vous plaît penser ça peut être grave de réponse requis.
comme toujours avec ce type de "question de question": il n'est DONC pas sur le "pourquoi", c'est sur le "comment". L'affinité CPU existe pour une raison, il y a une raison, il existe des utilitaires sous Linux et Windows afin d'établir un processus de l'affinité du PROCESSEUR. L'OP est question est une question tout à fait pertinente qui ne veut pas de "pourquoi", mais "comment".
Je doute que le "pourquoi" est interdit, et que Java est généralement pas le premier langage de programmation à la simultanéité de performance liés à des réglages, je pense qu'un test de cohérence est valide.
Maintenant j'ai besoin de la réponse à cette question afin de mettre en place NUMA optimisations.
J'aime ces "Pourquoi tu veux faire cette question?" Si un grave ingénieur demander quelque chose s'il vous plaît penser ça peut être grave de réponse requis.
OriginalL'auteur Dave | 2010-02-10
Vous devez vous connecter pour publier un commentaire.
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 démarrer 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 cette: 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.
2 UPD: Il y a un 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
#define _GNU_SOURCE
au-dessus de toutes les comprend.+1: j'ai activé cette fonctionnalité dans une bibliothèque qui utilise JNI ou JNA selon ce qui est disponible. Il a également une faible latence de la minuterie et de soutien occupé attente avec la PAUSE asm instruction. github.com/peter-lawrey/Java-Thread-Affinity
C'est génial, merci! (en supposant que cela fonctionne ce qui me reste à vérifier). Il y a certains problèmes avec votre bibliothèque (principalement la documentation et un bug), bien; comment puis-je communiquer avec vous à ce sujet?
Le mieux pour vous connecter bugs de cette façon github.com/peter-lawrey/Java-Thread-Affinity/issues de sorte qu'ils ne soient pas oubliés
C'est vraiment la meilleure façon de le faire, même si mon chemin ci-dessous fonctionne aussi.
OriginalL'auteur BegemoT
Je sais, ça fait un moment, mais si quelqu'un vient sur ce fil, voici comment j'ai résolu ce problème. J'ai écrit un script qui permettrait d'effectuer les opérations suivantes:
OriginalL'auteur Dave
Vous voudrez peut-être jeter un oeil à https://github.com/peter-lawrey/Java-Thread-Affinity/blob/master/src/test/java/com/higherfrequencytrading/affinity/AffinityLockBindMain.java
Lien réparé !
OriginalL'auteur Vaibhav Kamble
De l'OMI, cette pas sera possible que si vous utilisez les appels natifs. La JVM est censé être indépendant de la plateforme, tous les appels système pour parvenir à un tel résultat pas un code portable.
et si l'appel système est effectuée que si le programme Java est trouvé à être exécuté sur un système d'exploitation supportant appel? Le code serait encore portable, mais tout simplement pas régler toute l'affinité CPU sur d'autres Systèmes d'exploitation. C'est la seule chose qui m'a toujours fait craquer: des gens crier "non code portable" dès que vous faites un peu de JNI ou certains d'Exécution.exec(). J'ai le programme qui ne la fois et que le travail sur Linux, Windows et OS X.
Il n'est pas sur l'opportunité d'utiliser ou ne pas utiliser les appels natifs, mais quant à savoir si la plate-forme prend en charge ce "hors de la boîte". @questzen est juste que la JVM ne sera pas accès abstrait parce que c'est pas de la plate-forme neutre. Vous pourriez être en mesure de trouver des bibliothèques tierces qui va le faire.
OriginalL'auteur questzen
Il n'est pas possible (au moins avec la plaine de Java).
Vous pouvez utiliser les pools de threads de limiter la quantité de fils (et donc cœurs) utilisé pour différents types de travaux, 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 n'a pas de support natif pour votre système d'exploitation ou de matériel. Dans ce cas, fils verts sont utilisés et un seul noyau qui sera utilisé pour l'ensemble de la JVM.
OriginalL'auteur Hardcoded