Contenção de spinlock durante a alocação de memória da área de trabalho
É aqui que começa a se divertir. Eu já descrevi que o trabalho de classificação e hash na memória da área de trabalho consome CPU, mas não é refletido nos números de pesquisa de bpool.
A contenção de Spinlock é outra camada dessa diversão em particular. Quando a memória é roubada do conjunto de buffers e alocada para uso em uma concessão de memória de consulta, o acesso à memória é serializado com um spinlock. Por padrão, isso ocorre com um recurso particionado no nível do nó NUMA. Portanto, toda consulta no mesmo nó NUMA que usa memória da área de trabalho pode enfrentar contenção de spinlock ao roubar memória contra concessões. É muito importante observar: esse não é o risco de contenção "uma vez por consulta", como seria se o ponto de contenção estivesse no momento da concessão real. Em vez disso, é quando a memória é roubada contra a concessão - portanto, uma consulta com uma concessão de memória muito grande terá muitas oportunidades para contenção de spinlock se ela usar a maior parte de sua concessão.
O sinalizador de rastreamento 8048 faz um ótimo trabalho para aliviar essa contenção particionando ainda mais o recurso no nível principal.
A Microsoft diz "considere o sinalizador de rastreamento 8048 se 8 ou mais núcleos por soquete". Mas ... não é realmente quantos núcleos por soquete (contanto que haja vários), mas sim quantas oportunidades de contenção no trabalho que está sendo feito em um único nó NUMA.
Nos processadores AMD colados (12 núcleos por soquete, 2 nós NUMA por soquete), havia 6 núcleos por nó NUMA. Eu vi um sistema com 4 dessas CPUs (então oito nós NUMA, 6 núcleos cada) que estavam atolados no comboio de spinlock até o sinalizador de rastreamento 8048 ser ativado.
Eu já vi essa contenção de spinlock diminuir o desempenho em VMs tão pequenas quanto 4 vCPUs. O sinalizador de rastreamento 8048 fez o que deveria quando ativado nesses sistemas.
Considerando que ainda existem algumas CPUs otimizadas para frequência de 4 núcleos por aí, com a carga de trabalho correta, elas também se beneficiariam do sinalizador de rastreamento 8048.
As esperas do CMEMTHREAD acompanham o tipo de contenção de spinlock que o sinalizador de rastreamento 8048 alivia. Mas uma palavra de cautela: as esperas do CMEMTHREAD são um sintoma corroborado, não a causa raiz desse problema em particular. Vi sistemas com alto "CMEMTHREAD" espera começa, onde o sinalizador de rastreamento 8048 e / ou 9024 foi atrasado na implantação porque o tempo de espera acumulado do CMEMTHREAD era bastante baixo. Com spinlocks, o tempo de espera acumulado geralmente é a coisa errada a se considerar. Em vez disso, você deseja examinar o tempo desperdiçado da CPU - representado principalmente pelas próprias rotações, secundariamente pelas esperas associadas, que representam opções de contexto potencialmente desnecessárias.