Comment l'architecture NUMA affecter les performances de ActivePivot?
Nous sommes de la migration d'une ActivePivot application d'un nouveau serveur (4 sockets Intel Xeon, 512 go de mémoire). Après le déploiement, nous avons lancé notre application de référence (c'est un mélange de grandes OLAP requêtes simultanées à des transactions en temps réel). Les performances mesurées sont presque deux fois plus lent que sur notre serveur précédent, qui a les mêmes processeurs, mais deux fois moins de carottes et deux fois moins de mémoire.
Nous avons étudié les différences entre les deux serveurs, et il semble que le grand dispose d'une l'architecture NUMA (de mémoire non uniforme de l'accès). Chaque socket du CPU est physiquement proche de 1/4 de la mémoire, mais plus loin du reste de... La machine qui exécute notre application alloue un gros tas global, il est aléatoire d'une fraction de ce tas sur chaque nœud NUMA. Notre analyse est que l'accès à la mémoire de modèle est assez aléatoire et coeurs de CPU souvent perdre du temps en accédant à distance de la mémoire.
Nous sommes à la recherche après plus de commentaires à ce sujet ActivePivot sur NUMA serveurs. Peut-on configurer ActivePivot des cubes ou des pools de threads, changer nos requêtes, configurer le système d'exploitation?
OriginalL'auteur Jack | 2012-10-31
Vous devez vous connecter pour publier un commentaire.
Pierre a décrit le général JVM options disponibles aujourd'hui pour réduire l'impact sur les performances des architectures NUMA. Garder court un NUMA conscient de la JVM va partitionner le tas à l'égard des nœuds NUMA, et lorsqu'un thread crée un nouvel objet, l'objet est alloué dans le nœud NUMA de la base qui exécute le thread (si le même thread utilise plus tard, l'objet sera dans la mémoire locale). Aussi lors de la compression du tas de la NUMA conscient de la JVM évite le déplacement de grandes quantités de données entre les nœuds (et réduit la longueur de cessez-le-monde d'événements).
En toute NUMA matériel et pour n'importe quelle application Java le -XX:+UseNUMA option devrait probablement être activé.
Mais pour ActivePivot qui n'aide pas beaucoup: ActivePivot est une base de données en mémoire. Il y a en temps réel des mises à jour mais l'essentiel des données réside dans la mémoire principale de la vie de l'application. Quelles que soient les options de la JVM, les données seront réparties entre nœuds NUMA, et les threads qui exécutent des requêtes de mémoire à accès aléatoire. Sachant que la plupart des sections de la ActivePivot moteur de recherche de courir aussi vite que la mémoire peut être récupérée, le NUMA impact est particulièrement visible.
Alors, comment pouvez-vous obtenir le maximum de votre ActivePivot solution sur un NUMA matériel?
Il ya une solution facile lorsque l'ActivePivot application n'utilise qu'une fraction des ressources (nous trouvons que c'est souvent le cas lorsque plusieurs ActivePivot solutions fonctionnent sur le même serveur). Par exemple, une ActivePivot solution qui n'utilise 16 cœurs de 64 et 256 GO de un Téraoctet. Dans ce cas, vous pouvez limiter la JVM processus lui-même à un nœud NUMA.
Sur Linux, vous préfixe de la JVM lancer avec l'option suivante ( http://linux.die.net/man/8/numactl ):
Si le serveur est dédié à l'un ActivePivot solution, vous pouvez tirer parti de la ActivePivot Architecture Distribuée pour la partition de données. Si il y a 4 nœuds NUMA, vous commencez à 4 machines virtuelles hébergement 4 ActivePivot nœuds, chacun lié à son nœud NUMA. Avec ce déploiement, les requêtes sont réparties entre les nœuds, et chaque nœud va effectuer sa part du travail au max de la performance, au sein de la droite nœud NUMA.
--membind=nodes, -m nodes
en outre à--cpunodebind=nodes, -N nodes
afin de limiter la mémoire de ce nœud. Sinon, une petite partie de la mémoire est généralement allouée à l'étranger nœuds (même avec-XX:+UseNUMA
)OriginalL'auteur Antoine CHAMBILLE
Vous pouvez essayer d'utiliser
-XX:+UseNUMA
http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html
Si cela ne donne pas le résultat que vous attendez, vous pourriez avoir à utiliser
taskset
pour verrouiller une JVM pour un socket spécifique et efficace de briser le serveur en quatre machines avec une JVM chaque.J'ai observé que la machine avec plus de sockets ont ralentissement de l'accès à leur mémoire (même leur mémoire locale) et comment vous donnent toujours les gains de performances que vous voulez comme un résultat.
OriginalL'auteur Peter Lawrey