Спин-блокировка при выделении памяти рабочей области
Здесь начинается веселье. Я уже описывал такую работу сортировки и хэширования в рабочей области, память потребляет процессор, но не отражается в числах поиска в буле.
Спинлок спор это еще один слой для этого конкретного удовольствия. Когда память украдена из пула буферов и выделена для использования на основании запроса памяти, доступ к памяти сериализуется с помощью спин-блокировки. По умолчанию это происходит с ресурсом, разделенным на уровне узла NUMA. Таким образом, каждый запрос к тому же узлу NUMA, использующему память рабочей области, может потенциально испытывать конфликт спин-блокировки при краже памяти с разрешениями. Очень важно отметить: это не риск возникновения конфликтов «один раз на запрос», как это было бы, если бы конфликт был во время фактического предоставления. Скорее, это когда память украдена против предоставления - поэтому запрос с очень большим предоставлением памяти будет иметь много возможностей для спин-блокировки, если он использует большую часть своего предоставления.
Флаг трассировки 8048 отлично справляется с этой проблемой путем дальнейшего разделения ресурса на уровне ядра.
Microsoft говорит, что «рассмотрим флаг трассировки 8048, если 8 или более ядер на сокет». Но ... на самом деле дело не в том, сколько ядер в сокете (если их несколько), а в том, сколько возможностей для конкуренции в работе, выполняемой на одном узле NUMA.
На склеенных процессорах AMD (12 ядер на сокет, 2 узла NUMA на сокет) было 6 ядер на узел NUMA. Я видел систему с четырьмя из этих процессоров (то есть с восемью узлами NUMA, по шесть ядер в каждом), которая была заблокирована в конвой спин-блокировки, пока не был включен флаг трассировки 8048.
Я видел, как этот спин-блокирующий конфликт снижал производительность на виртуальных машинах до 4 виртуальных процессоров. Флаг трассировки 8048 сделал то, что предполагалось при включении в этих системах.
Принимая во внимание, что по-прежнему существуют процессоры, оптимизированные для частоты 4 ядра, с правильной рабочей нагрузкой, они также выиграют от флага трассировки 8048.
Ожидания CMEMTHREAD сопровождают тот тип спин-блокировки, который устраняет флаг трассировки 8048. Но предостережение: ожидание CMEMTHREAD является подтверждающим симптомом, а не основной причиной этой конкретной проблемы. Я видел системы с высоким «началом ожидания» CMEMTHREAD, где флаг трассировки 8048 и / или 9024 был отложен при развертывании, поскольку накопленное время ожидания CMEMTHREAD было довольно низким. В случае спин-блокировки накопленное время ожидания, как правило, неправильно. Скорее, вы хотите посмотреть на потерянное время ЦП, представленное в основном самими вращениями, во-вторых, связанными ожиданиями, которые представляют потенциально ненужные переключения контекста.