Расширение и сжатие буферного пула в конфигурации с неоднородным доступом к памяти (NUMA)

В этом разделе описывается, как распределяются страницы памяти буферного пула в конфигурации с неоднородным доступом к памяти (NUMA). Эти сведения позволяют разобраться, каким образом SQL Server пользуется архитектурой NUMA, и что показывают счетчики объектов буферного пула.

Распределение памяти

Для каждого физического узла NUMA существует один узел памяти SQL Server. Узлы памяти увеличиваются независимо друг от друга, но память распределяется между ними поровну. Для иллюстрации того, каким образом SQL Server распределяет локальную или внешнюю память, в этом разделе приведен пример, согласно которому на рассматриваемом компьютере установлено 16 ГБ памяти. SQL Server выделяет некоторый объем памяти для собственных процессов за пределами пула буферов, прочим приложениям, включая Windows, требуется некоторый объем памяти из каждого узла, поэтому в распоряжении SQL Server остается 10 ГБ памяти для буферного пула. Память буферного пула распределяется между четырьмя физическими узлами NUMA, N0, N1, N2 и N3 следующим образом:

  • N0 — 1 ГБ

  • N1 — 3 ГБ

  • N2 — 3 ГБ

  • N3 — 3 ГБ

В представленной выше конфигурации каждому узлу со временем выделяется 2,5 ГБ памяти, однако расширение узла N0 остановится при достижении 1,0 ГБ собственной памяти, а 1,5 ГБ будут получены от других узлов.

Выделение памяти при загрузке

В архитектуре NUMA SQL Server выделяет память со скоростью, сравнимой с системой без использования NUMA, даже если исходный объем свободной памяти распределен между узлами неравномерно. Буферный пул предпринимает попытку получить максимально возможный объем памяти для каждого узла. Это сложная задача, поскольку у системы Windows нет API-интерфейса для получения памяти от определенного узла.

По мере того как SQL Server расходует память, можно заметить, что некоторые узлы получают большое число страниц от других узлов NUMA (называемых внешними страницами). Однако во время наращивания объема эти страницы не используются, поскольку возможно их частое перемещение к узлу-владельцу и обратно. На момент достижения значения параметра max server memory некоторые узлы могут иметь внешнюю память, но как только цель достигнута, буферный пул будет равномерно работать с локальной и со внешней памятью. В частности, при недостатке памяти буферный пул не будет пытаться освободить страницы внешней памяти, пока для этого будут доступны страницы локальной памяти.

Ограничение памяти определенными узлами

Если SQL Server был настроен для работы на подмножестве узлов NUMA, буферный пул не будет автоматически ограничен памятью этих узлов. Для этого следует установить параметр max server memory. Сведения о параметре max server memory см. в разделе Параметры памяти сервера.

Освобождение памяти узла

В архитектуре NUMA объемы памяти, указываемые параметрами max server memory и min server memory, равномерно распределяются между узлами. Например, если параметр max server memory будет иметь значение 16 ГБ в системе с четырьмя узлами, буферный пул выделит для каждого из них по 4 ГБ памяти. Если один из этих узлов переключить в автономный режим, изменив значение параметра affinity mask, то объем, указываемый параметром max server memory, будет перераспределен между оставшимися узлами. К примеру, если в ранее рассмотренном случае из четырех узлов в автономный режим перевести два, то освобожденные 8 ГБ памяти будут равномерно распределены между оставшимися узлами. Поскольку буферный пул может использовать внешние страницы, в случае недостаточного объема памяти для оставшихся узлов будет использована удаленная память. Если необходимо, чтобы SQL Server не использовал память узлов, на которых он больше не выполняется, то значение параметра max server memory необходимо уменьшить после переключения узлов в автономный режим.

Внешние страницы

Как правило, узлы функционируют независимо друг от друга. Все случаи распределения и освобождения памяти тем или иным узлом реализуются с использованием памяти, связанной с этим узлом. Но если пользователю, работающему на узле N1, потребуется доступ к странице базы данных, расположенной в памяти узла N2, то производится доступ к нелокальной памяти.

Наблюдение за использованием локальной и внешней памяти в буферном пуле

Содержимое буферного пула можно просмотреть с помощью объекта Buffer Node. Общий объем памяти буферного пула SQL Server отображается в счетчике Target pages объекта Buffer Managerв. Объем памяти буферного пула для каждого узла отображается в счетчике Target pages объекта Buffer Node. Память, полученная от других узлов, отображается в счетчике Foreign pages. Дополнительные сведения см. в разделах SQL Server, объект Buffer Node и SQL Server, объект Buffer Manager.

Каждый из узлов контролирует свою память

У каждого узла памяти имеется собственный поток отложенной записи. Он вызывается как для явных, так и неявных контрольных точек. Поскольку у компьютера в симметричной многопроцессорной архитектуре (SMP) имеется всего один поток контрольных точек, несколько потоков при использовании архитектуры NUMA приводят к увеличению их частоты.

Поведение при просмотре таблицы

Оператор просмотра таблицы, выполняемый на узле N1, заполняет только ту память, которая связана с этим узлом (если только просмотр не выполняется параллельно на процессорах нескольких узлов). Если просмотр выполняется исключительно на одном узле, то используются только страницы буфера этого узла. Это помогает секционировать рабочую нагрузку для приложений.