По материалам статьи Slava Oks:
Tracking VAS in Yukon
Перевод Александра Гладченко
Когда разработчики приступили к работе над следующей версией SQL Server - Yukon,
они осознавали, что развитые средства поддержки являются одним из ключевых моментов
успешности проекта. Своей целью автор ставит охват тем, описывающих "нижние" уровни
организации СУБД, которые многим из Вас, как он уверен, действительно интересны, то
есть это управление памятью и планирование ресурсов. В этой статье представлен беглый
обзор того, как можно контролировать и диагностировать виртуальное адресное пространство
- Virtual Address Space (VAS), используемое SQL Server. Автор надеется, что Вы
понимаете что такое VAS и как оно организовано в Windows. Надеясь на Ваше терпение,
автор постарается побыстрее описать всю исходную информацию, что бы в ближайшем
будущем мы могли подробно поговорить о менеджере памяти SQL Server.
Представленный ниже запрос можно выполнять на сервере периодически, чтобы отслеживать
возможные отклонения, связанные с VAS. Постоянное отклонение VAS от нормы может
указывать на потенциальную проблему. Не смотря на то, что Yukon умет восстанавливаться
после вытеснения VAS намного лучше, чем SQL Server 2000, если в реальности существует
утечка памяти, спровоцированная внешними компонентами загруженными в наше VAS,
поделать с этим будет практически ничего нельзя...
Замечание автора: В зависимости от бета - версии Yukon, возможно, потребуется
изменить имена полей. Кроме того, автор не причисляет себя к гуру в T-SQL и
представленный ниже пример предназначен только для целей демонстрации, как это
работает. Автор уверен, что Вы - парни можете придумать запросы и получше :-))
CREATE VIEW vasummary AS
select
Size = VaDump.Size,
Reserved = sum(case (convert (INT,VaDump.Base) ^ 0) when 0 then 0 else 1 end),
Free = sum(case (convert (INT,VaDump.Base) ^ 0x0) when 0 then 1 else 0 end)
from
(
--- combine all allocation according with allocation base, do not take into
--- account allocations with zero allocation_base
---
select CONVERT (varbinary,sum(region_size_bytes)) AS Size,
allocation_base AS Base
from sys.dm_os_virtual_address_dump
where allocation_base <> 0x0
group by allocation_base
UNION
(
--- we shouldn't be grouping allocations with zero allocation base
--- just get them as is
---
select CONVERT (varbinary,region_size_bytes), allocation_base
from sys.dm_os_virtual_address_dump
where allocation_base = 0x0)
)
as VaDump
group by Size
--- Get vasummary information: Number of regions of a given size in SQL Server Size
--- and their status
select * from vasummary
--- Retrieve max available block
---
select max(size) from vasummary where Free <> 0
--- Get sum of all free regions
---
select sum(size*Free) from vasummary where Free <> 0
|
Вот, что может получиться в итоге:
Size Reserved Free
-------------------------------------- ----------- -----------
0x0000000000044000 1 0
0x0000000000048000 1 0
0x000000000004A000 1 0
0x000000000004F000 0 1
0x0000000000050000 0 1
0x0000000000052000 1 0
0x0000000000058000 2 0
0x000000000005A000 2 0
0x0000000000061000 1 0
0x0000000000070000 0 1
0x0000000000078000 1 0
0x0000000000079000 1 0
0x0000000000080000 325 1
0x0000000000082000 1 0
0x0000000000084000 1 1
0x000000000008B000 0 1
0x000000000008C000 1 0
0x0000000000090000 1 1
0x0000000000092000 2 0
0x0000000000093000 1 0
0x0000000000094000 1 0
0x0000000000097000 1 0
0x000000000009B000 1 0
0x000000000009E000 1 0
0x00000000000A0000 0 1
0x00000000000A7000 0 1
0x00000000000A9000 1 0
0x00000000000AC000 2 1
0x00000000000BC000 0 1
0x00000000000C0000 1 0
0x00000000000C4000 1 0
0x00000000000C6000 1 0
0x00000000000C8000 1 0
0x00000000000F0000 0 1
0x0000000000100000 16 0
0x0000000000102000 2 0
0x0000000000103000 1 0
0x000000000010A000 1 0
0x0000000000110000 8 0
0x0000000000134000 1 0
0x000000000015B000 1 0
0x000000000015E000 1 0
0x0000000000160000 4 0
0x00000000001B0000 1 0
0x00000000001DC000 1 0
0x0000000000220000 0 1
0x0000000000250000 0 1
0x0000000000260000 1 0
0x000000000026F000 0 1
0x0000000000270000 0 1
0x0000000000280000 1 0
0x00000000002C5000 1 0
0x00000000002F0000 0 1
0x0000000000340000 0 1
0x0000000000356000 1 0
0x0000000000360000 0 1
0x0000000000400000 338 0
0x0000000000800000 1 0
0x0000000000802000 1 0
0x0000000000900000 0 1
0x0000000001D29000 1 0
0x0000000004F56000 1 0
0x000000000F317000 0 1
(110 row(s) affected)
--------------------------------------------------------------
0x000000000F317000
(1 row(s) affected)
-----------
294117376
(1 row(s) affected)
|
Здесь интересно то что подобные скрипты можно использовать для отладки/диагностирования
проблем VAS ежедневно, но таким образом мы также можем пытаться диагностировать и
отлаживать проблемы SQL Server не прибегая к отладчику, а полагаясь только на
представления dmvs и другие инструменты поддержки, которые будут присутствовать
в окончательной версии и обязательно будут Вам доступны.
[В начало]