По материалам статьи Juergen Thomas: Memory Manager surface area changes in SQL Server 2012 в блоге SQLOS Team
Автор: G Bowerman
Перевод: Александр Гладченко
Технический редактор: Ирина Наумова
Множество изменений было внесено в компоненты диспетчера памяти SQLOS новой версии SQL Server 2012. Эти изменения можно обнаружить в динамических административных представлениях (DMV) объектов памяти, в команде выдачи статуса объектов памяти DBCC и в счётчиках производительности. Изменения в диспетчере памяти позволяют теперь получать более точную информацию о потреблении памяти сервером и помогают SQL Server более эффективно управлять распределением страниц, а также существенно улучшают обработку и отслеживание распределения памяти между узлами NUMA. Задача этой статьи собрать эти изменения в одном месте, чтобы можно было быстро найти ссылки на подробную информацию о деталях, относящихся к новшествам диспетчера памяти.
Некоторые из этих изменений призваны были стандартизировать измерения счётчиков памяти в килобайтах, а не в байтах или страницах, логически продолжая тот процесс, который уже был начат в более ранних версиях. Сами процедуры подсчёта использования памяти теперь стали более релевантными и достоверными, поскольку модули, отвечающие за одностраничные и многостраничные распределения, были заменены одним модулем, который теперь заведует распределением страниц любого размера и любого числа этих страниц. Также консолидация распределения страниц разного размера в одном модуле позволила придать целостный и законченный вид счётчикам производительности, отражающим распределение страниц.
Другие изменения относятся к изменению места диспетчера памяти в модели интерфейсов взаимодействия с операционной системой. Он теперь играет центральную роль, обеспечивая распределение страниц практически для всех компонент. На картинке ниже показаны модульные схемы новой и старой архитектуры SQLOS:
Новшества в DMV
sys.dm_os_memory_nodes
В этом представлении, консолидация одностраничного и многостраничного распределения отражена в колонке pages_kb. Новый счётчик foreign_committed_kb позволяет лучше управлять памятью в архитектуре NUMA и предоставляет в распоряжение SQL Server 2012 информацию о величине оперативной памяти, которая не попала в наиболее оптимальный с точки зрения задачи NUMA узел. Значение этого счётчика может быть полезным для определения причин медленного доступа к памяти. Сервер всегда будет пытаться использовать сначала ближнюю по отношению к узлу память, по крайней мере, пока не будет полностью занята локальная память этого узла.
SQL Server 2012 | SQL Server 2008 R2 |
pages_kb | single_pages_kb + multi_pages_kb |
foreign_committed_kb | — |
sys.dm_os_sys_info
В этом представлении, как и в большинстве изменений в диспетчере памяти, приняты меры к стандартизации результатов измерений счётчиков производительности, относящихся к памяти.
SQL Server 2012 | SQL Server 2008 R2 |
physical_memory_kb | physical_memory_in_bytes |
virtual_memory_kb | virtual_memory_in_bytes |
committed_kb | bpool_committed |
committed_target_kb | bpool_commit_target |
visible_target_kb | bpool_visible |
sys.dm_os_memory_cache_counters
SQL Server 2012 | SQL Server 2008 R2 |
pages_kb | single_pages_kb + multi_pages_kb |
pages_in_use_kb | single_pages_in_use_kb + multi_pages_in_use_kb |
sys.dm_os_memory_cache_entries
SQL Server 2012 | SQL Server 2008 R2 |
pages_kb | pages_allocated_count |
sys.dm_os_memory_clerks
SQL Server 2012 | SQL Server 2008 R2 |
pages_kb | single_pages_kb + multi_pages_kb |
page_size_in_bytes | page_size_bytes |
sys.dm_os_memory_objects
SQL Server 2012 | SQL Server 2008 R2 |
pages_in_bytes | pages_allocated_count |
max_pages_in_bytes | max_pages_allocated_count |
Изменения в DBCC MEMORYSTATUS
Многие счётчики производительности команд DBCC, которые раньше относились к буферному пулу, теперь относятся к диспетчеру памяти, что стало следствием пересмотра архитектуры. Кроме этого, появились новые, дополнительные информационные поля, которые отражают ошибки OS и влияние топологии NUMA. В фазе роста используемой NUMA узлами памяти можно видеть рост использования памяти ещё до того, как будет достигнуто расчётное значение. Счётчик использования страниц (Pages In Use) показывает число используемых страниц, включая оборванные страницы, страницы базы данных и страницы зарезервированной памяти. Счётчик дальних распределений (Away Committed) показывает, сколько памяти узел взял у других узлов.
SQL Server 2012 | SQL Server 2008 R2 |
Memory Manager \Large Pages Allocated | — |
Memory Manager \Emergency Memory | Memory Manager \Reserved Memory |
Memory Manager \ Emergency Memory In Use | Memory Manager \Reserved Memory In Use |
Memory Manager \Target Committed (KB) | Buffer Pool \Target (Pages) |
Memory Manager \Current Committed (KB) | Buffer Pool \Committed (Pages) |
Memory Manager \Pages Allocated (KB) | Buffer Pool \Stolen (Pages) + Buffer Pool \ Database (Pages) |
Memory Manager \Pages Reserved (KB) | Buffer Pool \Reserved (Pages) |
Memory Manager \Pages Free (KB) | Buffer Pool \ Free (Pages) |
Memory Manager \Pages In Use | — |
Memory Manager \Page Alloc Potential (KB) | Buffer Pool \Stolen Potential (Pages) |
Memory Manager \NUMA Growth Phase | — |
Memory Manager \Last OOM Factor | Buffer Pool \ Last OOM Factor |
Memory Manager \Last OS Error | — |
SQL Server 2012 | SQL Server 2008 R2 |
Memory Manager \Large Pages Allocated | — |
Memory Manager \Emergency Memory | Memory Manager \Reserved Memory |
Memory Manager \Emergency Memory In Use | Memory Manager \Reserved Memory In Use |
Memory Manager \Target Committed (KB) | Buffer Pool \Target (Pages) |
Memory Manager \ Current Committed (KB) | Buffer Pool \ Committed (Pages) |
Memory Manager \Pages Allocated (KB) | Buffer Pool \Stolen (Pages) + Buffer Pool \ Database (Pages) |
Memory Manager \Pages Reserved (KB) | Buffer Pool \Reserved (Pages) |
Memory Manager \Pages Free (KB) | Buffer Pool \ Free (Pages) |
Memory Manager \Pages In Use | — |
Memory Manager \Page Alloc Potential (KB) | Buffer Pool \Stolen Potential (Pages) |
Memory Manager \NUMA Growth Phase | — |
Memory Manager \Last OOM Factor | Buffer Pool \ Last OOM Factor |
Memory Manager \Last OS Error | — |
SQL Server 2012 | SQL Server 2008 R2 |
Memory node Id = n\ Pages Allocated | Memory node Id = n\ MultiPage Allocator + Memory node Id = n \ SinglePage Allocator |
Memory node Id = n\ Target Committed | — |
Memory node Id = n\ Current Committed | — |
Memory node Id = n\ Foreign Committed | — |
Memory node Id = n\ Away Committed | — |
Memory Clerks \Pages Allocated | Memory Clerks \SinglePage Allocator + Memory Clerks \ MultiPage Allocator |
Счётчики производительности
Изменения в счётчиках производительности тоже связаны с консолидацией счётчиков под объектом диспетчера памяти и стандартизацией измерения счётчиков в килобайтах. Кроме того, несколько бесполезных счётчиков, относящихся к AWE, были удалены.
SQL Server 2012 | SQL Server 2008 R2 |
Object — SQLServer:Memory Manager | Object — SQLServer:Buffer Manager |
Database Cache Memory (KB) | Database pages |
Free Memory (KB) | Free pages |
Reserved Server Memory (KB) | Reserved pages |
Stolen Server Memory (KB) | Stolen pages |
Target Server Memory (KB) | Target pages |
Total Server Memory (KB) | Total pages |
— | AWE lookup maps / sec |
— | AWE stolen maps / sec |
— | AWE write maps /sec |
— | AWE unmap calls / sec |
— | AWE unmap pages / sec |
SQL Server 2012 | SQL Server 2008 R2 |
Object — SQLServer:Memory Node | Object — SQLServer:Buffer Node |
Database Node Memory (KB) | Database pages |
Free Node Memory (KB) | Free pages |
Foreign Node Memory (KB) | Foreign pages |
Stolen Node Memory (KB) | Stolen pages |
Target Node Memory (KB) | Target pages |
Total Node Memory (KB) | Total pages |
Цель этих изменений состоит в том, чтобы сделать работу по администрированию диспетчера памяти легче, а информацию в административных представлениях сделать интуитивно понятной в большей степени, чем это было раньше. Также, необходимо было выявить и убрать те сущности, которые больше не имеют смысла, не используются при распределении страниц памяти и больше не поддерживаются, например, такие как AWE.