17.1.23

Контроль VAS в SQL Server 2005, продолжение…

По материалам статьи Slava Oks: Tracking VAS in Yukon, cont...


Некоторые из Вас, возможно, скучали, читая мою предыдущую статью "Обзор Virtual Address Space - VAS". Я понимаю, что тема VAS до этого была многократно освещена множеством авторов и ей было уделено много времени, и Вы наверняка знаете об этом больше, чем даже хотелось бы знать. Однако, наберитесь, пожалуйста, терпения. Я хочу дать достаточный предварительный обзор темы, что бы читатель смог легко ориентироваться в предлагаемом ему материале. Мне хотелось бы показать ту часть внутренней организации операционной системы, без которой будет сложно охватить тему, о которой Вы хотите узнать побольше: "Управление памятью в SQL Server". Поэтому я продолжу эту тему в следующий раз.

Ранее мы обсудили VAS и то, как можно оценить его использование с помощью специального представления vasummary, которое обсуждалось в предыдущей статье: "Контроль VAS в SQL Server 2005". Теперь, учитывая возможности этого представления и других dmv - представлений, фактически мы можем получить больше информации о VAS в SQL Server. Давайте же сделаем это!

Как многим из Вас известно, размер стека потока SQL Server равен 512 КБ (0x80000). Это означает, что каждый поток для своего стека резервирует в VAS 512 КБ. Есть ещё и дополнительные 4 КБ в VAS, которые используется для Thread Environment Block (TEB) - блока окружения потока, но в данном случае это не очень важно. Вопрос заключается в следующем: имея представление vasummary, возможно ли оценить число потоков, выполняющихся в данный момент на сервере. Ответ - ДА! И вот нужный запрос:

--- Оценка числа потоков на сервере --- SELECT * FROM vasummary WHERE size=0x0000000000080000


Size Reserved Free ------------------ -------- ----------- 0x0000000000080000 89 1

Вот это да, как всё оказалось просто ! Но это только оценка. Таким же образом можно получить реальное число потоков, если использовать системное представление: dm_os_threads.

--- Реальное число потоков в системе --- SELECT count(*) FROM sys.dm_os_threads


----------- 86

Как можно видеть, количества потоков в этих двух запросах различны. Почему? Причина может быть в том, что другой компонент резервировал в SQL Server область VAS точно такого же размера. Обычно находится немного таких компонент. Это означает, что первый из запросов более достоверно отражает число потоков в SQL Server. Только, пожалуйста, имейте в виду, что первый запрос более дорог в плане исполнения, чем второй. В реальной жизни, для получения имеющихся в процессе SQL Server потоков, предпочтительнее использовать показывающее потоки dmv.

Мы должны помнить, что значение параметра максимального числа потоков сервера в sp_configure фактический не является верхним пределом для реального числа потоков в SQL Server. Потоки могут быть созданы разным библиотеками dll, включая netlibs, rpc, xps и т.д.. Во многих случаях мы никак не можем управлять такими потоками, но, исполняя представленный выше запрос, мы получим реальную информацию обо всех потоках в VAS SQL Server, а не только о потоках, созданных нами.

Можно получить и больше информации об использование потоков в VAS. Информирующее о потоках dmv-представление включает информацию о стеке потока и о его TEB:

--- Дамп TEB и стека потока --- --- SELECT thread_address , stack_base_address FROM sys.dm_os_threads


thread_address stack_base_address -------------- ------------------ 0x7FFDBE30 0x02820000 0x7FFDAE30 0x028B0000 0x7FFD9E30 0x02930000 0x7FFD8E30 0x029C0000 0x7FFD7E30 0x02A40000 0x7FFD6E30 0x02AD0000 0x7FFD5E30 0x02B50000 0x7FFD4E30 0x02BE0000 0x7FFAFE30 0x02C60000 0x7FFAEE30 0x02CF0000 0x7FFADE30 0x02D70000 0x7FFACE30 0x02E00000 0x7FFABE30 0x02E80000

Используя это dmv и системное dm_os_virtual_address_dump, фактически можно показать поток в VAS. Я не буду приводить здесь такой запрос, оставляя его реализацию читателю, в качестве тренировки...

Прежде, чем мы перейдём к загруженным модулям, я хотел бы предложить Вам задуматься над следующим, ну хотя бы немного : Как VAS и получаемый из dmv-представлений результат отличались бы, если бы SQL Server был запущен в режиме "Fiber mode"? Пока же, а отткладываю ответ на этот вопрос до того момента, пока мы не поговорим о планировании.

Из всего вышесказанного Вы узнали способ оценки числа потоков, запущенных в SQL Server. К сожалению, невозможно использовать представление vasummary для того, что бы узнать об использовании VAS библиотеками dll. Причина в том, что разные dll имеют разные размеры. Однако мы можем использовать системные представления: dm_os_loaded_modules и dm_os_virtual_address_dump, которые позволяют получить информацию о загруженных dll.

--- Обзор того, как библиотеки dll мапируются на наше VAS --- SELECT base_address , name FROM sys.dm_os_loaded_modules


base_address name ------------ ---------------------------------------- 0x00400000 D:\MSSQL\MSSQL.3\MSSQL\Binn\sqlservr.exe 0x7C800000 C:\WINNT\system32\ntdll.dll 0x77E40000 C:\WINNT\system32\kernel32.dll 0x7D000000 C:\WINNT\system32\MSVCR80.dll 0x77BA0000 C:\WINNT\system32\msvcrt.dll 0x7C080000 C:\WINNT\system32\MSVCP80.dll 0x77F50000 C:\WINNT\system32\ADVAPI32.dll 0x77C50000 C:\WINNT\system32\RPCRT4.dll 0x77380000 C:\WINNT\system32\USER32.dll 0x77C00000 C:\WINNT\system32\GDI32.dll 0x761B0000 C:\WINNT\system32\CRYPT32.dll 0x76190000 C:\WINNT\system32\MSASN1.dll 0x76F50000 C:\WINNT\system32\Secur32.dll ....

Как и в случае с представлением для потоков, соединяя это представление с системным представлением dm_os_virtual_address_dump, Вы сможете получить информацию о расположении dll внутри SQL Server VAS. Теперь Вы понимаете, что это представление очень важно для понимания того, как используется VAS SQL Server, и оно даёт Вам хорошую индикацию этого.
В следующий раз я расскажу о ресурсах памяти другого типа.

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

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