Суперечка спінлока під час розподілу пам’яті робочої області
Ось тут починає веселитися. Я вже описував, що робота над сортуванням та хеш-пам’яттю в робочій пам’яті споживає процесор, але не відображається в цифрах пошуку bpool.
Суперечка спінлока - ще один шар цієї особливої розваги. Коли пам'ять викрадається з буферного пулу і виділяється для використання проти надання пам’яті запитів, доступ до пам’яті серіалізується за допомогою вимкнення. За замовчуванням це відбувається з ресурсом, розподіленим на рівні вузла NUMA. Таким чином, кожен запит на одному і тому ж вузлі NUMA, що використовує робочу пам’ять, потенційно може відчувати суперечку спінка при крадіжці пам’яті проти грантів. Дуже важливо зауважити: це не ризик суперечки "одноразово на запит", як це було б, якби питання суперечки було в момент фактичного надання. Швидше, це коли пам'ять викрадено у гранті - тож запит із дуже великим грантом пам’яті матиме багато можливостей для спінклінгу, якщо він використовує більшість своїх грантів.
Trace flag 8048 виконує велику роботу для усунення цієї суперечки шляхом подальшого розподілу ресурсу на базовому рівні.
Microsoft каже: "враховуйте прапор трассировки 8048, якщо 8 або більше ядер на сокет". Але ... справа не в тому, скільки ядер в сокеті (скільки існує декількох), а скільки можливостей для суперечок у роботі, що проводиться на одному вузлі NUMA.
На склеєних процесорах AMD (12 ядер на сокет, 2 вузли NUMA на розетку) було 6 ядер на вузол NUMA. Я побачив систему з 4-ма цими процесорами (так вісім вузлів NUMA, 6 ядер у кожному), які заклинили в спіновому конвалі, доки прапор 8048 сліду не був включений.
Я бачив, як ця спінчаста суперечка знижує продуктивність для віртуальних машин лише на 4 vCPU. Trace flag 8048 зробив те, що потрібно було, коли було включено в цих системах.
Зважаючи на те, що там ще є якісь 4-ядерні оптимізовані частотні процесори, з правильним навантаженням вони також отримають користь від прапора 8048.
CMEMTHREAD очікування супроводжує тип суперечок спінлок, який знімає прапор 8048 сліду. Але слово застереження: очікування CMEMTHREAD є підтверджуючим симптомом, а не першопричиною для цієї конкретної проблеми. Я бачив системи з високим CMEMTHREAD "очікування починається", де прапор трас 8048 та / або 9024 затримувались у розгортанні, оскільки накопичений час очікування CMEMTHREAD був досить низьким. За допомогою спинлоків, накопичений час очікування, як правило, не так. Швидше, ви хочете подивитися на витрачений час процесора - представлений насамперед самими віджиманнями, вдруге пов'язаними очікуваннями, які представляють потенційно непотрібні комутаційні перемикачі.