• Привет, Гость!
  • Войти
  • Регистрация
  • Записи
  • Форумы
  • Люди
  • Файлы
  • Работа
  • Технологии
  • Все
  • Новости
  • События
  • Статьи
  • Блоги

Resource Governor: управление ресурсами в SQL Server 2008. Часть 3

Resource Governor: управление ресурсами в SQL Server 2008. Часть 3

denish
18.11.2007 17:39

Продолжение. Часть 1. Часть 2.

 

 

Фарш невозможно провернуть назад

 

Жизненный опыт мне подсказывает, что обратить фарш в исходное состояние задача не из лёгких и вряд ли под силу даже лучшим умам микрохирургии. Такова реальность. Но, несмотря на все уговоры здравого смысла, иногда так хочется предпринять одну, пусть и маленькую, но всё-таки попытку вернуть былое и начать с чистого листа.

 

Если в этом месте вы подумали, что меня давно нужно облачить в смирительную рубашку, изолировать от общества и прописать седативные препараты (50 грамм галоперидола как самому буйному на GotDotNet), то не стоит беспокоиться — рассудком я не помутился. Речь по-прежнему идёт о Resource Governor.

 

Не следует заблуждаться на предмет того, что вы с первого раза создадите идеальную конфигурацию RG. Да, возможно сначала она покажется пределом совершенства. Затем последует череда неутешительных экспериментов, и вот уже второй час как вы прокручиваете фарш против часовой стрелки, пытаясь избавиться от своих же собственных настроек. Мир SQL Server устроен так, что делать это нужно в строго заданной последовательности, иначе все попытки будут сопровождаться возгласами «Мама, роди меня обратно!».

 

Чтобы как-то помочь (в первую очередь себе), я написал процедуру reset_rg, которая возвращает конфигурацию Resource Governor в первозданный вид, каким он был при установке сервера. Процедура не предназначена для участия в конкурсе красоты, так что не обессудьте.

 

Алгоритм reset_rg

 

  1. Отключить Resource Governor, предотвратив тем самым появление новых подключений в пользовательских группах.
  2. Закрыть командой kill все сессии, существующие в пользовательских группах нагрузки.
  3. Удалить все пользовательские группы из метаданных.
  4. Восстановить значения параметров группы default по умолчанию.
  5. Удалить все пользовательские пулы ресурсов.
  6. Восстановить значения параметров пула default по умолчанию.
  7. Отказаться от использования функции, указанной в конфигурации RG, в качестве классификатора.
  8. Применить сделанные изменения, выполнив реконфигурацию RG.

Если параметр @kill_session равен 1, процедура постарается закрыть все подключения, работающие в пользовательских группах. Сессиям, которые были отправлены в нокдаун, может потребоваться какое-то время на откат транзакций. Для этих целей предусмотрено ожидание завершения сессии на спин-блокировке (ожидание продлится не более чем указано в @spin_timeout).

 

 

createproc dbo.reset_rg (

      @kill_sessions          bit = 1     -- Принудительно завершать открытые сессии

)

asbegin

 

set nocount on

 

declare

      -- Буфер для динамических вызовов

      @str_buffer       varchar(500)                

     

      --======= Переменные для работы с сессиями =======--

      -- Текущая сессия в цикле

      , @spid                      int

      -- Максимальное время ожидания на spin-блокировке в секундах          

      , @spin_timeout         int               = 30

      -- Кол-во раундов spin-блокировки до "засыпания"    

      , @spin_count_limit     tinyint           = 5  

      -- Кол-во прошедших раундов spin-блокировки   

      , @spin_count           tinyint           = 0  

      -- Время входа в spin-блокировку  

      , @start_spining  datetime

      -- Признак того, что для тек. сессии уже была вызвана команда kill    

      , @kill_pending         bit                         

 

      --======= Переменные для работы с группами =======--

      -- Идентификатор текущей группы нагрузки

      , @group_id             int        

      -- Имя текущей группы нагрузки                

      , @group_name           sysname                     

     

      --======= Переменные для работы с пулами =======--

      -- Идентификатор текущего пула

      , @pool_id              int                         

      -- Имя текущего пула

      , @pool_name            sysname                     

     

     

 

/*

      Так как мы собираемся избавиться от пользовательских групп,

      то сами должны работать либо в default либо в internal.

*/

if (

      notexists(

            select *

            from sys.dm_exec_sessions

            where

                  session_id = @@SPID

                  and (group_id = 1 or group_id = 2)

            )

)begin

      raiserror (N'Процедура запущена в сессии пользовательской группы нагрузки.', 16, 1)

      goto the_end     

end

 

-- Выключаем Resource Governor, чтобы новые подключения уже не могли

-- попасть в пользовательские группы нагрузки

 

alterresourcegovernordisable

 

-- Если флажок @kill_sessions выставлен, отправим в кромешный Адлер

-- все открытые соединения, существующие в пользовательских группах

 

-- Если @kill_sessions = 0 и сессии есть, то разразимся ошибкой.

 

while (1 = 1) begin

 

      set @spid = null

 

      select

            @spid = s.session_id

      from sys.dm_exec_sessions s

      innerjoin sys.resource_governor_workload_groups g on s.group_id = g.group_id

      where

            g.group_id != 1 and g.group_id != 2

     

      if ((@spid isnotnull) and (@kill_sessions = 0)) begin

            raiserror (N'В пользовательских группах есть сессии.', 16, 1)

            goto the_end

      end

     

      if (@spid isnull) goto reset_metadata

 

      select

            @start_spining = getdate()

            , @kill_pending = 0

            , @spin_count = 0

           

      -- Принудительно завершаем тек. сессию и ждём на spin-блокировке, пока она удалится

      while (exists(select * from sys.dm_exec_sessions where session_id = @spid)) begin

     

            set @spin_count+=1

           

            if (@kill_pending = 0) begin

                  set @str_buffer = 'kill ' + cast(@spid as varchar)

                  exec (@str_buffer)

                  set @kill_pending = 1

                  print'[' + cast(@spid as varchar) + N'] произведён контрольный выстрел'

            end

           

            print'[' + cast(@spid as varchar) + N'] сессия всё ещё жива, пульс в норме'

           

            if (@spin_count > @spin_count_limit)

                  waitfor delay '00:00:01'

           

            if (DATEDIFF(ss, @start_spining, GETDATE()) > @spin_timeout) begin

                  raiserror (N'Время ожидания истекло, сессия [%d] так и не умерла', 16, 1, @spid)

                  goto the_end

            end

                 

      end

     

      print'[' + cast(@spid as varchar) + N'] сессия отправилась в мир иной ' + char(134)

     

end

 

reset_metadata:

 

      begintran

       

            while (1 = 1) begin         

           

                  select

                        @group_id = null

           

                  selecttop 1

                        @group_id = group_id

                        , @group_name = name

                  from sys.resource_governor_workload_groups

                  where

                        name != 'internal'and name != 'default'

                       

                 

                  if (@group_id isnotnull) begin

                 

                        set @str_buffer = 'drop workload group ' + quotename(@group_name)

                        exec (@str_buffer)

                       

                        if@@error != 0 begin

                             rollback

                             goto the_end

                        end

                            

                        print quotename(@group_name) + N' группа нагрузки уничтожена ' + char(134)        

                  endelse

                        break

            end  

 

            -- Восстанавливаем значения по умолчанию для группы default

           

            alterworkloadgroup [default]

            with (

                  importance = medium

                  , request_max_memory_grant_percent = 25

                  , request_max_cpu_time_sec = 0

                  , request_memory_grant_timeout_sec = 0

                  , max_dop = 0

                  , group_max_requests = 0

            )

           

 

            while (1 = 1) begin         

           

                  select

                        @pool_id = null

           

                  selecttop 1

                        @pool_id = pool_id

                        , @pool_name = name

                  from sys.resource_governor_resource_pools

                  where

                        name != 'internal'and name != 'default'

                       

                  if (@pool_id isnotnull) begin

                 

                        set @str_buffer = 'drop resource pool ' + quotename(@pool_name)

                        exec (@str_buffer)

                       

                        if@@error != 0 begin

                             rollback

                             goto the_end

                        end

                       

                        print quotename(@pool_name) + N' пул ресурсов уничтожен ' + char(134)        

                  endelse

                        break

            end        

 

            -- Восстанавливаем значения по умолчанию для пула default       

            alterresourcepool [default]

            with (

                  min_cpu_percent = 0

                  , max_cpu_percent = 100

                  , min_memory_percent = 0

                  , max_memory_percent = 100

            )

 

            -- Сбрасываем функцию классификатор

            alterresourcegovernor

            with (classifier_function = null) 

           

      commit

     

      -- Применяем настройки и включаем Resource Governor 

      alterresourcegovernorreconfigure

 

the_end:

      -- Парадный выход

end

go

 

 

Пример вызова для конфигурации из эксперимента 1 с двумя активными сессиями:

 

exec dbo.reset_rg 1

 

 

[57] произведён контрольный выстрел

[57] сессия всё ещё жива, пульс в норме

[57] сессия всё ещё жива, пульс в норме

[57] сессия всё ещё жива, пульс в норме

[57] сессия всё ещё жива, пульс в норме

[57] сессия всё ещё жива, пульс в норме

[57] сессия всё ещё жива, пульс в норме

[57] сессия отправилась в мир иной †

[56] произведён контрольный выстрел

[56] сессия отправилась в мир иной †

[Group1] группа нагрузки уничтожена †

[Group2] группа нагрузки уничтожена †

[Group3] группа нагрузки уничтожена †

[Pool1] пул ресурсов уничтожен †

[Pool2] пул ресурсов уничтожен †

[Pool3] пул ресурсов уничтожен †

 

 

Первое слово дороже второго

 

Для Resource Governor это отнюдь не так. Обратите внимание на параметр min_memory_percent.

 

alterresourcepool [default]

with (

      min_cpu_percent = 0

      , max_cpu_percent = 100

      , min_memory_percent = 0

      , max_memory_percent = 100

      , min_memory_percent = 5

      , min_memory_percent = 10

      , min_memory_percent = 20

 

)

go

 

select *

from sys.resource_governor_resource_pools

 

 

pool_id     name            min_cpu_percent max_cpu_percent min_memory_percent max_memory_percent

----------- --------------- --------------- --------------- ------------------ ------------------

1           internal        0               100             0                  100

2           default         0               100             20                 100

 

Как вы можете убедиться, в каталог метаданных попадает последнее из заданных значений.

 

 

 

Продолжение следует…

 

 

denish
18.11.2007 17:39
Комментариев:2 RSS Просмотров:178
Теги: SQL
Dautov
28.12.2007 7:03
Распределение ресурсов между группами внутри пула ?
Распределение ресурсов внутри группы ?
Где почитать ?
Ссылка
Nikolay Denishchenko
04.01.2008 14:15
2Dautov

Эпопея с RG ещё не окончена. В этом сезоне выйдет ещё как минимум 3 эпизода ;)
Ссылка

Nikolay Denishchenko

denish разработчик
(none)
  • Блог

Облако тегов

events programming security sql system development
Строишь сложные системы? Хостинг от Parking.Ru

Записи

Популярные
  • mezastel > Сокращенный генератор C# в стиле Zen Coding
  • Enrey > О поедании памяти DataTable
  • serbelyakov > DataGridView
  • Sergey Grigorev > Pex как инструмент для автоматизиции тестирования в .NET
  • XaocCPS > Bundler : клиентская оптимизация JavaScript в ASP.NET
  • shapovalov > AtomicCms - новая система управления сайтом на база ASP.NET MVC
  • mbakirov > Must have плагины для Visual Studio 2010 RC
  • paxer > Kentico CMS как платформа для разработки веб приложений на ASP.NET
  • clevelus > Новая электронная книга о Visual Studio 2010
  • clevelus > Руководство MICROSOFT по проектированию архитектуры приложений
Все популярные записи
Обсуждаемые
  • Enrey > О поедании памяти DataTable
  • sos > Работа на двух экранах - повышение производительно­сти или рассредоточение внимания?
  • paxer > Kentico CMS как платформа для разработки веб приложений на ASP.NET
  • serbelyakov > DataGridView
  • shapovalov > AtomicCms - новая система управления сайтом на база ASP.NET MVC
  • SergeyT. > Что нового в третьем издании книги Джеффри Рихтера "CLR via C#"
  • spugachev > Создание внебраузерных Silverlight приложений. Часть 1.
  • XaocCPS > Bundler : клиентская оптимизация JavaScript в ASP.NET
  • RaveNoX > Экспорт функции из .Net dll или пишем managed функцию для rundll32
  • ~44-ый > Немного о юзабилити. Веб-сайты.
Все обсуждаемые записи

Блоги

Новые
  • desco> Случайные записи
  • sashaeve> Блог Microsoft .NET User Group Винница
  • lukesky> Новости технологии NitrosBase
  • RaveNoX> Arthur Kraev
  • Rockie> Gennady G.(Rockie)
  • Новатор> SharePoint. Шаг за шагом.
  • ivanoff> Denis Ivanov
  • paxer> Программировани­е - как страсть
  • Realist> Build Your Web
  • veleslav> veleslav
Обсуждаемые
  • mihailik> Олег Михайлик
  • ceo> Нотатник Вiктора Шатохiна [MSFT]
  • gaidar> Gaidar Magdanurov
  • MikhailChernomo­rdikov> Mikhail Chernomordikov [MSFT]
  • Alexander Lozhechkin [MSFT]> Alexander Lozhechkin
  • agladkik> Andrey Gladkikh: Microsoft Dynamics
  • beerbong> Bong Blog
  • sos> Dmitry Soshnikov [MSFT]
  • not-a-kernel-gu­y> Зеркало: Not a kernel guy
  • sergun> Sergey Zwezdin
О сайте   Свяжитесь с нами   Конфиденциальность   Версия для печати
Работает на 1С-Битрикс: Управление сайтом ASP.NET  |  Хостинг на Parking.Ru