Обзор Компонентов Управления Памятью В Sql Server

Материал посвящен описанию использования подсистемы памяти в сервере MS SQL. Этот обзор дает лишь общее представление о структуре управления.

Следует помнить, что продукты Microsoft поставляются с закрытыми кодами и подробная информация недоступна в общедоступных источниках (насколько нам удалось выяснить, если вам удалось больше, сообщите нам об этом).

Общий обзор необходим для понимания потенциальных проблем SQL-сервера, описанных ниже, а также используемых инструментов тестирования и измерения производительности.



Менеджер памяти

Диспетчер памяти (MM) — это основной элемент, управляющий распределением памяти на SQL-сервере.

Этот компонент автоматически выделяет память, доступную SQL-серверу, уменьшая необходимость ручной настройки.

После загрузки SQL MM определяет начальный объем выделенной памяти, а затем динамически резервирует или освобождает ОЗУ по мере изменения нагрузки.

Таким образом, ММ управляет взаимодействием SQL-сервера с операционной системой в контексте управления памятью.

Диспетчер памяти является частью SQLOS. Вы можете увидеть более подробную информацию Здесь .



Состав диспетчера памяти

Информация о составе этого компонента весьма ограничена, но можно выделить следующие компоненты ММ: узлы памяти, клерки памяти, кэши памяти и объекты памяти.

Вы можете прочитать больше Здесь И Здесь .

MM также предоставляет несколько счетчиков, которые позволяют оценить использование оперативной памяти в SQL. Вы можете прочитать больше Здесь И Здесь .

Состав ММ представлен на рисунке 1.1.

Обзор компонентов управления памятью в SQL Server

Рис.

1.1 Компоненты диспетчера памяти Объекты MM используются для выделения памяти внутри экземпляра SQL Server. Узлы памяти обеспечивают интерфейс с ОС и реализацию распределения памяти на нижнем уровне.

Внутри SQL Server доступ к интерфейсу имеют только служащие памяти.

Узлы памяти для распределения памяти.

Каждый компонент SQL Sever, потребляющий значительный объем памяти, должен создать своего клерка и распределять память через его интерфейс.

Реализация управления памятью варьируется от версии к версии SQL, но основные функциональные компоненты сохраняются.

На рис.

2.2 показаны различия в реализации ММ в SQL2008 и SQL2012; дополнительную информацию можно найти Здесь .



Обзор компонентов управления памятью в SQL Server

Рисунок 1.2 Изменения в структуре диспетчера памяти для SQL2008 и SQL 2012 На картинках видно, что разделение распределителя страниц полностью исчезло.

Эти компоненты были заменены одним распределителем страниц любого размера.



Узлы памяти

Узлы памяти — это внутренний объект SQLOS. Представляет объект логической памяти, который соответствует процессору в случае реализации SMP или группе процессоров в случае реализации NUMA. Вы можете увидеть более подробную информацию Здесь .



Обзор компонентов управления памятью в SQL Server

Рисунок 1.3 Иерархия SQLOS в случае реализации SMP (рисунок А) и NUMA (рисунок Б) Узел памяти полностью прозрачен для потребителей памяти.

Основная задача этого компонента — определение области выделения памяти.

Узел памяти состоит из нескольких распределителей памяти.

На рис.

2.4 показаны потребители памяти, использующие узел памяти.

Вы можете увидеть более подробную информацию Здесь И Здесь .



Обзор компонентов управления памятью в SQL Server

Рисунок 1.4 Узлы памяти Распределители памяти — это процедуры, определяющие тип Windows API, используемый для выделения памяти.

Распределители содержат программный код, используемый для выделения памяти, например, для страниц или общей памяти.



Клерки памяти

Узлы памяти обеспечивают интерфейс с ОС и реализацию распределения памяти на уровне Windows. Внутри SQL Server только служащие памяти имеют доступ к интерфейсу узлов памяти для выделения памяти.

Каждый компонент SQL Sever, потребляющий значительный объем памяти, должен создать своего клерка и затем распределять ресурсы через его интерфейс.

Таким образом, клерки выполняют в рамках Диспетчера памяти следующие функции: • Отражает использование памяти конкретными серверными компонентами.

• Получайте уведомления об изменениях состояния памяти и меняйте ее размер в зависимости от обстоятельств.

• Используйте узлы памяти для выделения памяти компонентам сервера.

Существует четыре категории служащих.

Перечень категорий приведен в Таблице 1. Подробнее Вы можете посмотреть Здесь .



Кэши памяти

Под термином «кэш» подразумевается механизм кэширования различных типов данных с учетом стоимости хранения объектов.

Кэш обеспечивает: контроль времени хранения, видимость и анализ статистики доступа к кэшированным данным.

Кэшированные данные могут использоваться несколькими потребителями одновременно.

Помимо кешей, SQL Server использует пулы памяти.

Пулы, в отличие от кешей, используются для хранения однородных данных без дополнительного контроля.

Используется несколько механизмов кэширования, основные из них: • Хранилище кэша • Магазин пользователей • Хранилище объектов Только Object Store является пулом, Cache и User Store — кэшами.

Механизмы Cache и User Store очень похожи, однако если параметры Cache Store полностью контролируются SQLOS, то для User Store разработчики могут использовать свои собственные алгоритмы управления.

В документации также используются понятия Cache Store и User Store в значении «отдельные области памяти».

С каждым хранилищем кэша связано хранилище хеш-таблиц.

Возможно использование не одной, а нескольких хеш-таблиц.

Хэш-таблица — это структура в памяти, содержащая массив указателей на страницы буфера.

Хеширование — это метод, который равномерно сопоставляет значение ключа с соответствующим хэш-ведром.

Вы можете прочитать больше здесь (о хеше) И Здесь И Здесь И Здесь .

Хранилища кэша используются, например, для хранения кэша плана выполнения, кэша xml, кэша полнотекстового поиска, кэша процедур, кэша системного набора строк.

В хранилище пользователей хранится, в частности, кэш метаданных пользовательских и системных баз данных, токенов безопасности и данных схемы.

Полный список можно найти в динамическом представлении dm_os_memory_cache_counters.

Буферный пул (буферный кеш) и расширение буферного пула

Буферный пул (второе название буферного кэша) — область в памяти, которая используется для кэширования страниц, данных таблиц и их индексов, размер страницы — 8Кб.

Использование пула буферов сокращает количество операций ввода-вывода в файл базы данных и, таким образом, повышает производительность сервера.

В то же время Buffer Cach является основным потребителем памяти в SQL Server.

Обзор компонентов управления памятью в SQL Server

Рисунок 1.5 Компоненты системы управления буфером В SQL Server 2014 пул буферов можно расширить за счет энергонезависимой памяти, например твердотельного накопителя.

Это расширение называется расширением буферного пула.

Вы можете прочитать больше здесь Здесь .

Вы можете узнать больше об управлении буферным кешем.

Здесь , Здесь И Здесь .

Буферный кеш имеет своего собственного клерка памяти и распределяет память через распределитель страниц.

Для буферного кэша используется клерк памяти типа Generic, который называется Memoryclerk_sqlbufferpool. До SQL 2012 в буферном кэше использовался только одностраничный распределитель (выделение отдельных страниц по 8 КБ).

Если серверному компоненту требовалось выделить буфер размером более 8Кб, использовался Multi Page Allocator (см.

рис.

2.4) и, соответственно, эта память располагалась вне буферного пула.

В SQL2012 одно- и многостраничные распределители были объединены в распределитель страниц любого размера.

На рис.

2.2 вы можете увидеть эти изменения.



Максимальная память сервера и минимальная память сервера

Хотя буферный кэш управляется автоматически в SQL Server, администраторы могут регулировать максимальный и минимальный размер выделенной памяти для этого буфера.



Обзор компонентов управления памятью в SQL Server

Рисунок 1.6 Изменение диапазона памяти, зарезервированной параметром Max server Memory Как уже упоминалось в SQL 2012, в диспетчере памяти произошли изменения.

В результате таких изменений параметр max server Memory регулирует не только память буферного пула, но и вообще все выделение памяти (за исключением Direct Memory Allocations, производимых с помощью VirtualAlloc).

Параметр min server Memory указывает предел, ниже которого пул буферов не будет освобождать использованную память по требованию.

При первоначальной загрузке пул не занимает память, указанную в параметре min server Memory. Используется минимально необходимый объем, который рассчитывается автоматически.

При необходимости размер пула дополнительно увеличивается.

Вы можете прочитать больше Здесь И Здесь .



Украденные страницы

Украденные страницы — это страницы буферного кэша, которые используются на сервере для различных целей.

Например, для процедурного кэша — операции сортировки (т. е.

запрос рабочей памяти — памяти рабочего места).

Эти страницы также необходимы для хранения структур данных, требующих выделения памяти менее 8 КБ, таких как блокировки, контекст транзакции и информация о соединении.

Более подробную информацию можно найти в следующих источниках: simple-talk.com ; technet.microsoft.com ; sqlserver-dba.com .



Хранилище объектов

Хранилище объектов — это пул памяти.

Он используется для хранения однородных типов данных без дополнительного контроля затрат на хранение.

Эти данные можно легко удалить в случае нехватки памяти.

По своей структуре пулы являются клерками памяти (то есть являются одним из ее типов).

Дополнительно вы можете увидеть Здесь И Здесь .



Объекты памяти (МО)

Объекты памяти — это куча памяти, которая использует интерфейс клерка памяти для доступа к распределителю страниц для выделения страниц.

Объекты памяти не используют интерфейсы виртуальной или общей памяти; этот элемент использует только механизм выделения страниц.

Многие компоненты SQL Server обращаются к MO напрямую, минуя клерков памяти.

ML предоставляют возможность выделять диапазоны памяти произвольного размера.

Подробно: http://blogs.msdn.com/b/slavao/archive/2005/02/11/371063.aspx ; http://support.microsoft.com/kb/907877/en-us ; http://msdn.microsoft.com/ru-ru/library/ms179875.aspx .



Брокер памяти (МБ)

Брокер памяти является компонентом SQLOS. Брокер памяти отвечает за распределение памяти между различными компонентами SQL Server в соответствии с их запросами.

Более подробную информацию можно прочитать на сайт производителя .



Обзор компонентов управления памятью в SQL Server

Рисунок 1.7 Распределение памяти брокера памяти Описание механизма: MV отслеживает запросы памяти от SQL-компонентов и сравнивает показатели ее использования с текущими.

На основе полученной информации брокер вычисляет «оптимальный» размер памяти, который можно распределить между компонентами.

Брокер уведомляет компоненты о своих вычислениях, и каждый компонент затем использует эту информацию для дальнейшего использования памяти.

МБ можно увидеть в следующих динамических представлениях «sys.dm_os_ring_buffers», где Ring_buffer_type = «RING_BUFFER_MEMORY_BROKER».

Вы можете прочитать больше Здесь , Здесь И Здесь .



Ресурсный семафор

Ресурсный семафор отвечает за выделение памяти компоненту и поддержание общего объема используемой памяти в пределах указанного предела.

Более подробную информацию можно найти на blogs.msdn.com И mssqltips.com .

Теги: #Память SQL Server #Microsoft SQL Server

Вместе с данным постом часто просматривают: