Материал посвящен описанию использования подсистемы памяти в сервере MS SQL. Этот обзор дает лишь общее представление о структуре управления.
Следует помнить, что продукты Microsoft поставляются с закрытыми кодами и подробная информация недоступна в общедоступных источниках (насколько нам удалось выяснить, если вам удалось больше, сообщите нам об этом).
Общий обзор необходим для понимания потенциальных проблем SQL-сервера, описанных ниже, а также используемых инструментов тестирования и измерения производительности.
Менеджер памяти
Диспетчер памяти (MM) — это основной элемент, управляющий распределением памяти на SQL-сервере.Этот компонент автоматически выделяет память, доступную SQL-серверу, уменьшая необходимость ручной настройки.
После загрузки SQL MM определяет начальный объем выделенной памяти, а затем динамически резервирует или освобождает ОЗУ по мере изменения нагрузки.
Таким образом, ММ управляет взаимодействием SQL-сервера с операционной системой в контексте управления памятью.
Диспетчер памяти является частью SQLOS. Вы можете увидеть более подробную информацию Здесь .
Состав диспетчера памяти
Информация о составе этого компонента весьма ограничена, но можно выделить следующие компоненты ММ: узлы памяти, клерки памяти, кэши памяти и объекты памяти.Вы можете прочитать больше Здесь И Здесь .
MM также предоставляет несколько счетчиков, которые позволяют оценить использование оперативной памяти в SQL. Вы можете прочитать больше Здесь И Здесь .
Состав ММ представлен на рисунке 1.1.
Рис.
1.1 Компоненты диспетчера памяти Объекты MM используются для выделения памяти внутри экземпляра SQL Server. Узлы памяти обеспечивают интерфейс с ОС и реализацию распределения памяти на нижнем уровне.
Внутри SQL Server доступ к интерфейсу имеют только служащие памяти.
Узлы памяти для распределения памяти.
Каждый компонент SQL Sever, потребляющий значительный объем памяти, должен создать своего клерка и распределять память через его интерфейс.
Реализация управления памятью варьируется от версии к версии SQL, но основные функциональные компоненты сохраняются.
На рис.
2.2 показаны различия в реализации ММ в SQL2008 и SQL2012; дополнительную информацию можно найти Здесь .
Рисунок 1.2 Изменения в структуре диспетчера памяти для SQL2008 и SQL 2012
На картинках видно, что разделение распределителя страниц полностью исчезло.
Эти компоненты были заменены одним распределителем страниц любого размера.
Узлы памяти
Узлы памяти — это внутренний объект SQLOS. Представляет объект логической памяти, который соответствует процессору в случае реализации SMP или группе процессоров в случае реализации NUMA. Вы можете увидеть более подробную информацию Здесь .
Рисунок 1.3 Иерархия SQLOS в случае реализации SMP (рисунок А) и NUMA (рисунок Б)
Узел памяти полностью прозрачен для потребителей памяти.
Основная задача этого компонента — определение области выделения памяти.
Узел памяти состоит из нескольких распределителей памяти.
На рис.
2.4 показаны потребители памяти, использующие узел памяти.
Вы можете увидеть более подробную информацию Здесь И Здесь .
Рисунок 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.
Рисунок 1.5 Компоненты системы управления буфером
В SQL Server 2014 пул буферов можно расширить за счет энергонезависимой памяти, например твердотельного накопителя.
Это расширение называется расширением буферного пула.
Вы можете прочитать больше здесь Здесь .
Вы можете узнать больше об управлении буферным кешем.
Буферный кеш имеет своего собственного клерка памяти и распределяет память через распределитель страниц.
Для буферного кэша используется клерк памяти типа Generic, который называется Memoryclerk_sqlbufferpool. До SQL 2012 в буферном кэше использовался только одностраничный распределитель (выделение отдельных страниц по 8 КБ).
Если серверному компоненту требовалось выделить буфер размером более 8Кб, использовался Multi Page Allocator (см.
рис.
2.4) и, соответственно, эта память располагалась вне буферного пула.
В SQL2012 одно- и многостраничные распределители были объединены в распределитель страниц любого размера.
На рис.
2.2 вы можете увидеть эти изменения.
Максимальная память сервера и минимальная память сервера
Хотя буферный кэш управляется автоматически в 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 в соответствии с их запросами.Более подробную информацию можно прочитать на сайт производителя .
Рисунок 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
-
Различные Типы Тестирования Безопасности
19 Oct, 24 -
Livecamnetwork Анонсирует Girl-A-Thong Ii
19 Oct, 24 -
Эрланг. Что Это, Почему, Как И Для Кого.
19 Oct, 24 -
Вопросы Дмитрию Гришину (Mail.ru)
19 Oct, 24 -
Apple Выпустила Ios 8.2
19 Oct, 24 -
#70 Джокаст
19 Oct, 24