Contesa di spinlock durante l'allocazione della memoria dell'area di lavoro
È qui che inizia a divertirsi. Ho già descritto che il lavoro di ordinamento e hash nella memoria dell'area di lavoro consuma CPU ma non si riflette nei numeri di ricerca di bpool.
La contesa con Spinlock è un altro livello di questo particolare divertimento. Quando la memoria viene rubata dal pool di buffer e allocata per l'uso contro una concessione di memoria di query, l'accesso alla memoria viene serializzato con uno spinlock. Per impostazione predefinita, ciò avviene con una risorsa partizionata a livello di nodo NUMA. Pertanto, ogni query sullo stesso nodo NUMA che utilizza la memoria dell'area di lavoro può potenzialmente presentare contese di spinlock quando si ruba la memoria contro le sovvenzioni. Molto importante da notare: questo non è il rischio di contesa "una volta per query", come sarebbe se il punto di contesa fosse al momento della concessione effettiva. Piuttosto, è quando la memoria viene rubata contro la concessione - quindi una query con una concessione di memoria molto grande avrà molte opportunità di contesa con spinlock se utilizza la maggior parte della sua concessione.
Il flag di traccia 8048 fa un ottimo lavoro per alleviare questa contesa partizionando ulteriormente la risorsa a livello centrale.
Microsoft dice "considera il flag di traccia 8048 se 8 o più core per socket". Ma ... non è davvero quanti core per socket (purché ce ne siano più), ma piuttosto quante opportunità di contesa nel lavoro svolto su un singolo nodo NUMA.
Sui processori AMD incollati (12 core per socket, 2 nodi NUMA per socket) c'erano 6 core per nodo NUMA. Ho visto un sistema con 4 di quelle CPU (quindi otto nodi NUMA, 6 core ciascuno) che è stato bloccato in un convoglio spinlock fino a quando non è stato abilitato il flag di traccia 8048.
Ho visto questa contesa di spinlock ridurre le prestazioni su VM fino a 4 vCPU. Il flag di traccia 8048 ha fatto ciò che doveva quando abilitato su quei sistemi.
Considerando che ci sono ancora 4 CPU ottimizzate per la frequenza core là fuori, con il giusto carico di lavoro, trarrebbero beneficio anche dal flag di traccia 8048.
Le attese di CMEMTHREAD accompagnano il tipo di contesa di spinlock che allevia il flag di traccia 8048. Ma un avvertimento: le attese di CMEMTHREAD sono un sintomo corroborante, non la causa principale di questo particolare problema. Ho visto sistemi con "wait start" CMEMTHREAD elevati in cui il flag di traccia 8048 e / o 9024 sono stati ritardati nella distribuzione perché il tempo di attesa CMEMTHREAD accumulato era piuttosto basso. Con gli spinlock, il tempo di attesa accumulato è di solito la cosa sbagliata da guardare. Piuttosto, si desidera esaminare il tempo sprecato della CPU, rappresentato principalmente dagli stessi giri, secondariamente dalle attese associate che rappresentano interruttori di contesto potenzialmente non necessari.