Spinlock-Konflikt während der Zuweisung von Arbeitsspeicher
Hier fängt es an, Spaß zu haben. Ich habe bereits beschrieben, dass die Sortier- und Hash-Arbeit im Arbeitsspeicher die CPU beansprucht, sich jedoch nicht in den bpool-Lookup-Nummern widerspiegelt.
Spinlock-Streit ist eine weitere Ebene für diesen besonderen Spaß. Wenn Speicher aus dem Pufferpool gestohlen und für die Verwendung mit einer Speicherzuweisung für Abfragen zugewiesen wird, wird der Speicherzugriff mit einem Spinlock serialisiert. Dies erfolgt standardmäßig mit einer Ressource, die auf NUMA-Knotenebene partitioniert ist. Daher kann es bei jeder Abfrage auf demselben NUMA-Knoten, der Arbeitsspeicher verwendet, zu Spinlock-Konflikten kommen, wenn Speicher gegen Berechtigungen gestohlen wird. Sehr wichtig zu beachten: Dies ist kein Konfliktrisiko "einmal pro Abfrage", da dies der Fall wäre, wenn der Streitpunkt zum Zeitpunkt der tatsächlichen Gewährung wäre. Eher ist es, wenn Speicher gegen die Bewilligung gestohlen wird - so hat eine Abfrage mit einer sehr großen Speicherbewilligung viele Möglichkeiten für Spinlock-Konflikte, wenn sie den größten Teil ihrer Bewilligung verwendet.
Das Ablaufverfolgungsflag 8048 leistet einen hervorragenden Beitrag zur Beseitigung dieses Konflikts, indem die Ressource auf der Kernebene weiter partitioniert wird.
Microsoft sagt "Trace-Flag 8048 berücksichtigen, wenn 8 oder mehr Kerne pro Socket". Aber ... es ist nicht wirklich die Anzahl der Kerne pro Socket (solange es mehrere gibt), sondern vielmehr die Anzahl der Konfliktmöglichkeiten bei der Arbeit an einem einzelnen NUMA-Knoten.
Auf den geklebten AMD-Prozessoren (12 Kerne pro Sockel, 2 NUMA-Knoten pro Sockel) befanden sich 6 Kerne pro NUMA-Knoten. Ich sah ein System mit 4 dieser CPUs (also acht NUMA-Knoten, jeweils 6 Kerne), das im Spinlock-Konvoi blockiert war, bis das Ablaufverfolgungsflag 8048 aktiviert wurde.
Ich habe gesehen, dass dieser Spinlock-Konflikt die Leistung auf VMs mit nur 4 vCPUs beeinträchtigt. Das Trace-Flag 8048 hat genau das getan, was es sollte, wenn es auf diesen Systemen aktiviert wurde.
In Anbetracht der Tatsache, dass es immer noch 4 frequenzoptimierte CPUs mit der richtigen Auslastung gibt, würden sie auch vom Trace-Flag 8048 profitieren.
CMEMTHREAD-Wartezeiten begleiten die Art der Spinlock-Konflikte, die das Ablaufverfolgungsflag 8048 lindert. Aber Vorsicht: CMEMTHREAD-Wartezeiten sind ein bestätigendes Symptom und keine Grundursache für dieses spezielle Problem. Ich habe Systeme mit hohen CMEMTHREAD-Wartezeiten gesehen, bei denen das Ablaufverfolgungsflag 8048 und / oder 9024 bei der Bereitstellung verzögert wurden, weil die akkumulierte CMEMTHREAD-Wartezeit ziemlich niedrig war. Bei Spinlocks ist die angesammelte Wartezeit in der Regel das Falsche. Sie möchten sich eher die verschwendete CPU-Zeit ansehen - dargestellt in erster Linie durch die Spins selbst, in zweiter Linie durch die damit verbundenen Wartezeiten, die potenziell unnötige Kontextwechsel darstellen.