17.1.23

Контроль VAS в SQL Server

По материалам статьи 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 и другие инструменты поддержки, которые будут присутствовать в окончательной версии и обязательно будут Вам доступны.

Комментариев нет:

Отправить комментарий