вторник, 21 августа 2012 г.

Основы регулятора ресурсов (Resource Governor)


Регулятор ресурсов позволяет ограничить использование памяти и процессора определенным подключениям  или группе пользователей.
К примеру, на сервере есть основная база данных и второстепенная база данных, вам необходимо, чтобы пользователи подключающиеся к второстепенной базе, не использовали ресурсов более разраешенного, чтобы основые ресурсы использовались для пользователей подлючающиеся к основно базе данных. Для эти х целей как раз и создан регулятор ресурсов(Resource Governor). Данный инструмент позволяет регулировать только ресурсы памяти и процессора.

Для понимания  работы регулятора ресурсов  необходимо понимать следующие  понятия:

1.       Пулы ресурсов  – объем ресурсов, который предоставляется группе рабочей нагрузке, min и max ресурсов. Сумма минимальных значений всех пулов не должно превышать 100.

2.       Группы рабочей нагрузки  - привязывается к пулу ресурсов, связывает соединение пользователя

3.       Классификация – функция определения, в какую группу рабочей нагрузку входит  соединение. Создается в базе master.

Регулятор ресурсов настраивается в следующем порядке:

1.       Включит Регулятор ресурсов.

2.       Создать один или несколько пулов ресурсов

3.       Создать одну или несколько групп рабочих нагрузок

4.       Связать каждую группу рабочей нагрузки с пулом ресурсов

5.       Создать и протестировать функцию –классификатор

6.       Связать функцию – классификатор с регулятором ресурсов


1.Включение регулятора ресурсов:

ALTER RESOURCE GOVERNOR RECONFIGURE;


2. Создание пулов

CREATE RESOURCE POOL [test_pool1] WITH(min_cpu_percent=0,

            max_cpu_percent=15,

            min_memory_percent=0,

            max_memory_percent=15)

GO
CREATE RESOURCE POOL [test_pool2] WITH(min_cpu_percent=20,

            max_cpu_percent=50,

            min_memory_percent=20,

            max_memory_percent=50)

GO

ALTER RESOURCE GOVERNOR RECONFIGURE;

3.4 Создание рабочей нагрузки и связывание рабочей нагрузки с пулом

CREATE WORKLOAD GROUP [Group_for_pool1] WITH(group_max_requests=0,

            importance=Medium,

            request_max_cpu_time_sec=180,

            request_max_memory_grant_percent=25,

            request_memory_grant_timeout_sec=0,

            max_dop=0) USING [test_pool1]



GO



CREATE WORKLOAD GROUP [group_for_poo2] WITH(group_max_requests=0,

            importance=Medium,

            request_max_cpu_time_sec=0,

            request_max_memory_grant_percent=25,

            request_memory_grant_timeout_sec=0,

            max_dop=0) USING [test_pool2]


GO


ALTER RESOURCE GOVERNOR RECONFIGURE;

GO

Графически это должно выглядеть так:

5. Создание функции-классификатора

Текст самой функции:

CREATE FUNCTION dbo.func_classifier1() RETURNS sysname

WITH SCHEMABINDING

AS

BEGIN

    DECLARE @grp_name sysname

      IF (SUSER_NAME() = 'user1')

          SET @grp_name = 'Group_for_pool1';

      IF (SUSER_NAME() = 'user2')

        SET @grp_name = 'group_for_poo2';



    insert into master.dbo.cl_table(usr,[group])

    values(SUSER_NAME(),@grp_name);

     RETURN (@grp_name)

END;

Для классификации можно использовать следующие системные функции: HOST_NAME(), APP_NAME(), SUSER_NAME(), SUSER_SNAME(), IS_SRVROLEMEMBER() и IS_MEMBER().
 Функция-классификатор срабатывает каждый раз при подсоединение к серверу, поэтому это надо учесть , т.к функция создает дополнительную задержку при подключение, а при большом количестве это может привезти к ошибкам подключения  и снизить скоростьсоединений.

6.  Связывание функции – классификатора с регулятором ресурсов

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = [dbo].[func_classifier1]);

GO

ALTER RESOURCE GOVERNOR RECONFIGURE;

GO

После этого можно проверить  работу нашего  регулятора ресурсов:
Проверка  правильности назначений групп
Войдем под пользователем user 1 или user2 , затем под администратором выполним следующий зарос:

select b.name,a.login_name,a.session_id from sys.dm_exec_sessions a

inner join  sys.dm_resource_governor_workload_groups b

on a.group_id=b.group_id

В результате получим, куда в какую группу попали наши соединения.

Далее проверим саму нагрузку и ограничения ресурсов.
На сервере запускаем счетчики:

SQLServer :Workload Group Loader –CPU usage  и  SQLServer:Resource Pool Status: CPU usage для наших пулов.
Создаем нагрузку на сервере под различными учетными записями.
В результате должна отобразиться нагрузка в зависимости от пула.

Небольшое замечание, даже при включенном регуляторе ресурсов  SQL Server старается выделить как можно больше ресурсов на выполнение запросов,  если есть ресурсы у других пулов, то SQL  Server может их использовать для выполнения запроса в другом пуле.

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

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