Je suis confronté à un problème d'évolutivité sur un système multicœur. Mon application traite des données scientifiques en parallèle sur une machine à 4 cœurs physiques, 8 cœurs logiques avec hyperthreading activé. Nous lançons 8 JVM, une par noyau logique (nous passerons probablement à une JVM pour éviter le surcoût de la JVM)Comment détecter les problèmes d'évolutivité/de contention multicœur
Le problème est que l'évolutivité est presque linéaire jusqu'à 4 cœurs, mais nous obtenons à peine 10-20 % performance en ajoutant 4 "noyaux logiques" supplémentaires.
J'ai analysé le comportement des threads en profilant l'application et je ne vois pas de verrous ou de threads qui attendent trop. J'ai aussi vérifié avec pidstat et je ne vois pas par exemple un overhead de surcharge de contexte. Plus précisément, il n'y a presque pas de changement de contexte sur les processus Java. L'utilisation du processeur est super haute atteignant presque 100%, ce qui semble également correct.
Ma question est de savoir comment détecter et analyser la cause de cette mauvaise évolutivité après avoir dépassé le nombre de cœurs physiques. Quels outils et méthodes puis-je utiliser pour détecter la contention, où dois-je regarder et puis-je le réparer sans modifier l'architecture de l'application (par exemple en basculant vers une machine virtuelle Java par machine)
Merci
Merci de votre réponse, il clarifie l'espace de problème. Je vais jeter un coup d'œil aux échecs de cache et aussi essayer de courir avec seulement des cœurs physiques pour avoir une idée. – greg