Conflit Spinlock lors de l'allocation de la mémoire de l'espace de travail
C'est là que ça commence à s'amuser. J'ai déjà décrit que le travail de tri et de hachage dans la mémoire de l'espace de travail consomme du processeur mais n'est pas reflété dans les numéros de recherche de bpool.
La contention de Spinlock est une autre couche à ce plaisir particulier. Lorsque la mémoire est volée du pool de tampons et allouée pour être utilisée contre une allocation de mémoire de requête, l'accès à la mémoire est sérialisé avec un verrou tournant. Par défaut, cela se produit avec une ressource partitionnée au niveau du nœud NUMA. Ainsi, chaque requête sur le même noeud NUMA utilisant la mémoire de l'espace de travail peut potentiellement rencontrer des conflits de verrou tournant lors du vol de mémoire contre des octrois. Très important à noter: ce n'est pas un risque de contention "une fois par requête", comme ce serait le cas si le point de contestation était au moment de l'octroi réel. Au contraire, son quand la mémoire est volée contre la subvention - donc une requête avec une très grande allocation de mémoire aura de nombreuses possibilités de contention de verrou tournant si elle utilise la majeure partie de sa subvention.
L'indicateur de trace 8048 fait un excellent travail pour soulager cette contention en partitionnant davantage la ressource au niveau principal.
Microsoft dit "considérez l'indicateur de trace 8048 si 8 cœurs ou plus par socket". Mais ... ce n'est pas vraiment le nombre de cœurs par socket (tant qu'il y en a plusieurs), mais plutôt le nombre d'opportunités de contention dans le travail effectué sur un seul nœud NUMA.
Sur les processeurs AMD collés (12 cœurs par socket, 2 nœuds NUMA par socket), il y avait 6 cœurs par nœud NUMA. J'ai vu un système avec 4 de ces processeurs (donc huit nœuds NUMA, 6 cœurs chacun) qui était coincé dans le convoi spinlock jusqu'à ce que l'indicateur de trace 8048 soit activé.
J'ai vu cette contention de verrou tournant ralentir les performances sur des machines virtuelles aussi petites que 4 vCPU. L'indicateur de trace 8048 a fait ce qu'il était censé faire lorsqu'il était activé sur ces systèmes.
Étant donné qu'il existe encore des processeurs optimisés en fréquence de 4 cœurs, avec la bonne charge de travail, ils bénéficieraient également de l'indicateur de trace 8048.
CMEMTHREAD attend accompagne le type de conflit de verrou tournant que l'indicateur de trace 8048 soulage. Mais une mise en garde: les attentes CMEMTHREAD sont un symptôme corroborant, et non la cause première de ce problème particulier. J'ai vu des systèmes avec un "temps d'attente" CMEMTHREAD élevé où l'indicateur de trace 8048 et / ou 9024 a été retardé dans le déploiement car le temps d'attente CMEMTHREAD cumulé était assez faible. Avec les verrous tournants, le temps d'attente accumulé n'est généralement pas la bonne chose à regarder. Au contraire, vous voulez regarder le temps CPU perdu - représenté principalement par les spins eux-mêmes, secondairement par les attentes associées qui représentent des changements de contexte potentiellement inutiles.