Учебное пособие: Примеры конфигурации регулятора ресурсов и передовые методы
применимо к:SQL ServerУправляемому экземпляру SQL Azure
В этой статье содержатся пошаговые примеры, помогающие настроить регулятор ресурсов и убедиться, что конфигурация работает должным образом. Оно начинается с простого примера и переходит к более сложным примерам.
В статье также приведены примеры запросов мониторинга регулятора ресурсов
Все примеры предполагают, что изначально регулятор ресурсов отключен и использует параметры по умолчанию, и что пользовательские пулы ресурсов, группы рабочей нагрузки и функции классификатора не существуют.
Заметка
Для управляемого экземпляра SQL Azure вы должны находиться в контексте базы данных master
, чтобы изменить конфигурацию регулятора ресурсов.
Изменение группы по умолчанию
В этом примере используется регулятор ресурсов, чтобы ограничить максимальный размер предоставления памяти для всех запросов пользователей. Это достигается путем уменьшения настройки REQUEST_MAX_MEMORY_GRANT_PERCENT
для группы рабочих нагрузок default
с 25% по умолчанию до 10%. В этом примере не используется функция классификатора. Это означает, что обработка входа не затрагивается, и все сеансы пользователей продолжают классифицироваться в группе рабочих нагрузок default
.
Возможно, потребуется ограничить размер выделения памяти, если запросы ожидают памяти, так как другие запросы зарезервировали слишком много памяти. Дополнительные сведения см. в статье Устранение проблем с низкой производительностью или нехваткой памяти, вызванных предоставлением памяти вSQL Server.
Измените группу рабочей нагрузки по умолчанию.
ALTER WORKLOAD GROUP [default] WITH (REQUEST_MAX_MEMORY_GRANT_PERCENT = 10);
Включите регулятор ресурсов, чтобы сделать конфигурацию эффективной.
ALTER RESOURCE GOVERNOR RECONFIGURE;
Проверьте новый параметр, включая новый максимальный размер предоставления памяти.
SELECT group_id, wg.name AS workload_group_name, rp.name AS resource_pool_name, wg.request_max_memory_grant_percent_numeric AS request_max_memory_grant_percent, rp.max_memory_kb * wg.request_max_memory_grant_percent_numeric AS request_max_memory_grant_size_kb FROM sys.resource_governor_workload_groups AS wg INNER JOIN sys.dm_resource_governor_resource_pools AS rp ON wg.pool_id = rp.pool_id;
Чтобы вернуться к начальной конфигурации, выполните следующий сценарий:
ALTER RESOURCE GOVERNOR DISABLE; ALTER WORKLOAD GROUP [default] WITH (REQUEST_MAX_MEMORY_GRANT_PERCENT = 25);
Использование определяемой пользователем группы рабочей нагрузки
В этом примере используется регулятор ресурсов для обеспечения того, чтобы все запросы на сеансах с определенным именем приложения не выполнялись с степенью параллелизма (DOP) выше четырех. Это делается путем классификации сеансов в группу рабочей нагрузки с установленным значением MAX_DOP
, равным 4.
Дополнительные сведения о настройке максимальной степени параллелизма см. в разделе Server configuration: max degree of parallelism.
Создайте группу рабочей нагрузки, которая ограничивает DOP. Группа использует пул ресурсов
default
, так как мы хотим ограничить doP для определенного приложения, но не зарезервировать или ограничить ресурсы ЦП, памяти или ввода-вывода.CREATE WORKLOAD GROUP limit_dop WITH ( MAX_DOP = 4 ) USING [default];
Создайте функцию классификатора. Функция использует встроенную функцию APP_NAME() для определения имени приложения, указанного в строке подключения клиента. Если для имени приложения задано значение
limited_dop_application
, функция возвращает имя группы рабочей нагрузки, ограничивающей DOP. В противном случае функция возвращаетdefault
в качестве имени группы рабочей нагрузки.USE master; GO CREATE FUNCTION dbo.rg_classifier() RETURNS sysname WITH SCHEMABINDING AS BEGIN DECLARE @WorkloadGroupName sysname = N'default'; IF APP_NAME() = N'limited_dop_application' SELECT @WorkloadGroupName = N'limit_dop'; RETURN @WorkloadGroupName; END; GO
Измените конфигурацию регулятора ресурсов, чтобы сделать конфигурацию эффективной и включить регулятор ресурсов.
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier); ALTER RESOURCE GOVERNOR RECONFIGURE;
Запрос к sys.resource_governor_configuration , чтобы проверить, включен ли диспетчер ресурсов и использует ли он созданную нами функцию классификации.
SELECT OBJECT_SCHEMA_NAME(classifier_function_id) AS classifier_schema_name, OBJECT_NAME(classifier_function_id) AS classifier_object_name, is_enabled FROM sys.resource_governor_configuration;
classifier_schema_name classifier_object_name is_enabled ---------------------- ---------------------- ---------- dbo rg_classifier 1
Убедитесь, что сеансы с определенным именем приложения классифицируются в группу рабочей нагрузки
limit_dop
, а другие сеансы продолжают классифицироваться в группе рабочей нагрузкиdefault
. Мы будем использовать запрос, использующий sys.dm_exec_sessions и sys.resource_governor_workload_groups системные представления для возврата имени приложения и имени группы рабочей нагрузки для текущего сеанса.В SQL Server Management Studio (SSMS) выберите Файл в главном меню, Создать, Запрос Движка Базы Данных.
В диалоговом окне Connect to Database Engine укажите тот же экземпляр ядра СУБД, где вы создали группу рабочей нагрузки и функцию классификатора. Перейдите на вкладку Дополнительные параметры подключения и введите
App=limited_dop_application
. Это заставляет SSMS использоватьlimited_dop_application
в качестве имени приложения при подключении к экземпляру.Выберите , затем Подключитесь с, чтобы открыть новое подключение.
В том же окне запроса выполните следующий запрос:
SELECT s.program_name AS application_name, wg.name AS workload_group_name, wg.max_dop FROM sys.dm_exec_sessions AS s INNER JOIN sys.resource_governor_workload_groups AS wg ON s.group_id = wg.group_id WHERE s.session_id = @@SPID;
Вы увидите следующие выходные данные, показывающие, что сеанс был классифицирован в группу рабочих нагрузок
limit_dop
с максимальным значением DOP, равным четырем:application_name workload_group_name max_dop ---------------- ------------------- ------- limited_dop_application limit_dop 4
Повторите описанные выше шаги, но не введите ничего в поле на вкладке Дополнительные параметры подключения. Выходные изменения, показывающие имя приложения SSMS по умолчанию и группу рабочих нагрузок
default
с значением по умолчанию0
для максимального значения DOP.application_name workload_group_name max_dop ---------------- ------------------- ------- Microsoft SQL Server Management Studio - Query default 0
Чтобы вернуться к начальной конфигурации этого примера, выполните следующий скрипт T-SQL:
ALTER RESOURCE GOVERNOR DISABLE; ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL); DROP FUNCTION IF EXISTS dbo.rg_classifier; DROP WORKLOAD GROUP limit_dop;
Использование нескольких пулов ресурсов и групп рабочей нагрузки
В этом примере используется регулятор ресурсов для классификации сеансов из приложения обработки заказов в разные группы рабочих нагрузок и пулы ресурсов в зависимости от времени суток. Эта конфигурация выделяет больше ресурсов приложению во время пиковой обработки и ограничивает ресурсы в нерабочее время. В примере предполагается, что приложение не использует длительные сеансы.
Создайте два пула ресурсов для пикового времени и внерабочего времени обработки.
- Пул
peak_hours_pool
гарантирует зарезервированный минимум в 20% средней полосы пропускания процессора черезMIN_CPU_PERCENT
, и не ограничивает пропускную способность ЦП, задавMAX_CPU_PERCENT
значение100
. - Пул
off_hours_pool
не резервирует пропускную способность ЦП, устанавливаяMIN_CPU_PERCENT
на0
, но ограничивает пропускную способность ЦП до 50% при возникновении конфликтов ЦП, устанавливаяMAX_CPU_PERCENT
на50
.
CREATE RESOURCE POOL peak_hours_pool WITH ( MIN_CPU_PERCENT = 20, MAX_CPU_PERCENT = 100 ); CREATE RESOURCE POOL off_hours_pool WITH ( MIN_CPU_PERCENT = 0, MAX_CPU_PERCENT = 50 );
Пулы ресурсов могут резервировать и ограничивать системные ресурсы, такие как ЦП, память и ввод-вывод. Дополнительные сведения см. в разделе CREATE RESOURCE POOL.
- Пул
Создайте две группы рабочей нагрузки, по одному для каждого пула ресурсов соответственно.
-
peak_hours_group
не ограничивает количество одновременных запросов, установив с помощьюGROUP_MAX_REQUESTS
значение по умолчанию0
. -
off_hours_group
ограничивает количество одновременных запросов во всех сеансах, классифицируемых в этой группе, установив дляGROUP_MAX_REQUESTS
значение200
.
CREATE WORKLOAD GROUP peak_hours_group WITH ( GROUP_MAX_REQUESTS = 0 ) USING peak_hours_pool; CREATE WORKLOAD GROUP off_hours_group WITH ( GROUP_MAX_REQUESTS = 200 ) USING off_hours_pool;
Группы рабочих нагрузок определяют такие политики, как максимальное количество запросов, максимальный уровень параллелизма и максимальный размер предоставления памяти. Дополнительные сведения см. в разделе CREATE WORKLOAD GROUP.
-
Создайте и заполните таблицу, которая определяет пиковые и нерабочие интервалы времени.
- Каждая строка в таблице определяет время начала и окончания интервала, а также имя группы рабочей нагрузки, используемой в течение интервала.
- Время начала и окончания каждого интервала учитывается полностью.
- Таблица создается в базе данных
master
, чтобы ее можно было использовать в функции классификатора с привязкой к схеме.
USE master; GO CREATE TABLE dbo.workload_interval ( workload_group_name sysname NOT NULL, start_time time(7) NOT NULL, end_time time(7) NOT NULL, CONSTRAINT pk_workload_interval PRIMARY KEY (start_time, workload_group_name), CONSTRAINT ak_workload_interval_1 UNIQUE (end_time, workload_group_name), CONSTRAINT ck_workload_interval_1 CHECK (start_time < end_time) ); GO INSERT INTO dbo.workload_interval VALUES (N'off_hours_group', '00:00', '06:29:59.9999999'), (N'peak_hours_group', '06:30', '18:29:59.9999999'), (N'off_hours_group', '18:30', '23:59:59.9999999');
Создайте функцию классификатора.
- Ожидается, что данные в таблице имеют одну соответствующую строку для любого заданного времени дня. Если данные нарушают это правило, функция возвращает
default
в качестве имени группы рабочей нагрузки. - В следующем примере функция также возвращает
default
, если имя приложения, возвращаемое встроенной функцией APP_NAME(), является что-либо, отличное отorder_processing
.
USE master; GO CREATE OR ALTER FUNCTION dbo.rg_classifier() RETURNS sysname WITH SCHEMABINDING AS BEGIN DECLARE @WorkloadGroupName sysname = N'default'; SELECT @WorkloadGroupName = workload_group_name FROM dbo.workload_interval WHERE APP_NAME() = N'order_processing' AND CAST(GETDATE() AS time(7)) BETWEEN start_time AND end_time; IF @@ROWCOUNT > 1 SELECT @WorkloadGroupName = N'default'; RETURN @WorkloadGroupName; END; GO
- Ожидается, что данные в таблице имеют одну соответствующую строку для любого заданного времени дня. Если данные нарушают это правило, функция возвращает
Это необязательный шаг. Вместо создания таблицы в базе данных
master
можно использовать табличное значение конструктора для определения интервалов времени непосредственно в функции классификатора. Это рекомендуемый подход, если размер данных мал, и критерии функции классификатора часто не изменяются. Ниже приведен пример того же классификатора, который использует конструктор с табличным значением вместо таблицы вmaster
.USE master; GO CREATE OR ALTER FUNCTION dbo.rg_classifier() RETURNS sysname WITH SCHEMABINDING AS BEGIN DECLARE @WorkloadGroupName sysname = N'default'; SELECT @WorkloadGroupName = workload_group_name FROM ( VALUES (CAST(N'off_hours_group' AS sysname), CAST('00:00' AS time(7)), CAST('06:29:59.9999999' AS time(7))), (CAST(N'peak_hours_group' AS sysname), CAST('06:30' AS time(7)), CAST('18:29:59.9999999' AS time(7))), (CAST(N'off_hours_group' AS sysname), CAST('18:30' AS time(7)), CAST('23:59:59.9999999'AS time(7))) ) AS wg (workload_group_name, start_time, end_time) WHERE APP_NAME() = N'order_processing' AND CAST(GETDATE() AS time(7)) BETWEEN start_time AND end_time; IF @@ROWCOUNT > 1 SELECT @WorkloadGroupName = N'default'; RETURN @WorkloadGroupName; END; GO
Измените конфигурацию регулятора ресурсов, чтобы сделать конфигурацию эффективной и включить регулятор ресурсов.
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier); ALTER RESOURCE GOVERNOR RECONFIGURE;
Убедитесь, что регулятор ресурсов включен, использует указанную функцию классификатора, и что функция классификатора работает должным образом, используя аналогичные шаги, как в предыдущем примере. На этот раз мы введем
App=order_processing
на вкладке Дополнительные параметры подключения в диалоговом окне подключения SSMS, чтобы соответствовать имени приложения в функции классификатора. Выполните следующий запрос, чтобы определить имя приложения, группу рабочей нагрузки, пул ресурсов и резервирование ЦП и ограничение текущего сеанса:SELECT s.program_name AS application_name, wg.name AS workload_group_name, wg.group_max_requests, rp.name AS resource_pool_name, rp.min_cpu_percent, rp.max_cpu_percent FROM sys.dm_exec_sessions AS s INNER JOIN sys.resource_governor_workload_groups AS wg ON s.group_id = wg.group_id INNER JOIN sys.resource_governor_resource_pools AS rp ON wg.pool_id = rp.pool_id WHERE s.session_id = @@SPID;
Результаты зависят от времени дня. Например, если текущее время равно 14:30, результат показывает, что используются
peak_hours_group
иpeak_hours_pool
:application_name workload_group_name group_max_requests resource_pool_name min_cpu_percent max_cpu_percent ----------------- -------------------- ------------------ ------------------- --------------- --------------- order_processing peak_hours_group 0 peak_hours_pool 20 100
Чтобы вернуться к начальной конфигурации, выполните следующий скрипт T-SQL:
ALTER RESOURCE GOVERNOR DISABLE; ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL); DROP FUNCTION IF EXISTS dbo.rg_classifier; DROP TABLE IF EXISTS dbo.workload_interval; DROP WORKLOAD GROUP peak_hours_group; DROP WORKLOAD GROUP off_hours_group; DROP RESOURCE POOL peak_hours_pool; DROP RESOURCE POOL off_hours_pool;
Мониторинг регулятора ресурсов с помощью системных представлений
Примеры запросов в этом разделе показывают, как отслеживать статистику и поведение диспетчера ресурсов.
Статистика регулятора ресурсов является накопительной с момента последнего перезапуска сервера. Если вам нужно собрать статистику, начиная с определенного времени, можно сбросить статистику с помощью инструкции ALTER RESOURCE GOVERNOR RESET STATISTICS
.
Статистика времени выполнения пула ресурсов
Для каждого пула ресурсов регулятор ресурсов отслеживает использование ЦП и памяти, события вне памяти, предоставление памяти, ввод-вывод и другую статистику. Дополнительную информацию см. в разделе sys.dm_resource_governor_resource_pools.
Следующий запрос возвращает подмножество доступной статистики для всех пулов ресурсов:
SELECT rp.pool_id,
rp.name AS resource_pool_name,
wg.workload_group_count,
rp.statistics_start_time,
rp.total_cpu_usage_ms,
rp.target_memory_kb,
rp.used_memory_kb,
rp.out_of_memory_count,
rp.active_memgrant_count,
rp.total_memgrant_count,
rp.total_memgrant_timeout_count,
rp.read_io_completed_total,
rp.write_io_completed_total,
rp.read_bytes_total,
rp.write_bytes_total,
rp.read_io_stall_total_ms,
rp.write_io_stall_total_ms
FROM sys.dm_resource_governor_resource_pools AS rp
OUTER APPLY (
SELECT COUNT(1) AS workload_group_count
FROM sys.dm_resource_governor_workload_groups AS wg
WHERE wg.pool_id = rp.pool_id
) AS wg;
Статистика времени выполнения группы рабочей нагрузки
Для каждой группы рабочей нагрузки регулятор ресурсов отслеживает время ЦП, количество запросов, заблокированные задачи, время ожидания блокировки, оптимизацию запросов и другую статистику. Дополнительные сведения см. в sys.resource_governor_workload_groups.
Следующий запрос возвращает подмножество доступной статистики для всех групп рабочих нагрузок:
SELECT wg.name AS workload_group_name,
rp.name AS resource_pool_name,
wg.statistics_start_time,
wg.total_request_count,
wg.total_cpu_usage_ms,
wg.blocked_task_count,
wg.total_lock_wait_time_ms,
wg.total_query_optimization_count,
wg.max_request_grant_memory_kb,
wg.active_parallel_thread_count,
wg.effective_max_dop,
wg.request_max_memory_grant_percent_numeric
FROM sys.dm_resource_governor_workload_groups AS wg
INNER JOIN sys.dm_resource_governor_resource_pools AS rp
ON wg.pool_id = rp.pool_id
Агрегирование сеансов по группам рабочей нагрузки и атрибутам сеанса
Следующий запрос возвращает распределение сеансов между группами рабочей нагрузки и статистической статистикой сеансов для каждой группы рабочей нагрузки.
Большое количество сеансов с состоянием preconnect
может указывать на замедление выполнения классификатора.
SELECT wg.name AS workload_group_name,
rp.name AS resource_pool_name,
s.program_name AS application_name,
s.login_name,
s.host_name,
s.status,
d.name AS database_name,
MIN(s.login_time) AS first_login_time,
MAX(s.login_time) AS last_login_time,
MAX(s.last_request_start_time) AS last_request_start_time,
COUNT(1) AS session_count
FROM sys.dm_exec_sessions AS s
INNER JOIN sys.dm_resource_governor_workload_groups AS wg
ON s.group_id = wg.group_id
INNER JOIN sys.dm_resource_governor_resource_pools AS rp
ON wg.pool_id = rp.pool_id
INNER JOIN sys.databases AS d
ON s.database_id = d.database_id
GROUP BY wg.name,
rp.name,
s.program_name,
s.login_name,
s.host_name,
s.status,
d.name;
Агрегирование запросов по группам рабочей нагрузки и атрибутам запроса
Следующий запрос возвращает распределение запросов между группами рабочей нагрузки и статистические статистические статистические данные запросов для каждой группы рабочей нагрузки:
SELECT wg.name AS workload_group_name,
rp.name AS resource_pool_name,
r.command,
r.status,
d.name AS database_name,
COUNT(1) AS request_count,
MIN(r.start_time) AS first_request_start_time,
MAX(r.start_time) AS last_request_start_time,
SUM(CAST(r.total_elapsed_time AS bigint)) AS total_elapsed_time_ms
FROM sys.dm_exec_requests AS r
INNER JOIN sys.dm_resource_governor_workload_groups AS wg
ON r.group_id = wg.group_id
INNER JOIN sys.dm_resource_governor_resource_pools AS rp
ON wg.pool_id = rp.pool_id
INNER JOIN sys.databases AS d
ON r.database_id = d.database_id
GROUP BY wg.name,
rp.name,
r.command,
r.status,
d.name;
Рекомендации по управлению ресурсами
- Настройте выделенное подключение администратора (DAC) и узнайте, как его использовать. Дополнительные сведения см. в разделе Диагностическое подключение для администраторов баз данных. Если конфигурация регулятора ресурсов не работает, можно использовать DAC для устранения неполадок или отключитьрегулятора ресурсов.
- При настройке пулов ресурсов следует тщательно указывать большие значения для
MIN_CPU_PERCENT
,MIN_MEMORY_PERCENT
иMIN_IOPS_PER_VOLUME
. Параметр конфигурацииMIN
резервирует ресурсы для пула ресурсов и делает их недоступными для других пулов ресурсов, включая пулdefault
. Дополнительные сведения см. в статье Создание пула ресурсов. - Функция классификатора расширяет время обработки входа. Избегайте сложных логики и длительных или ресурсоемких запросов в классификаторе, особенно если запросы используют большие таблицы. Слишком сложная функция может привести к задержкам входа или истечению времени ожидания подключения.
- Если необходимо использовать таблицу в классификаторе, а таблица является небольшой и в основном статической, рассмотрите возможность использования табличного конструктора, как показано в примере выше в этой статье.
- Избегайте использования часто измененной таблицы в классификаторе. Это повышает риск блокировки, которая может отложить входы и вызвать время ожидания подключения. Следующие обходные пути могут снизить риск, однако они имеют недостатки, включая риск неправильной классификации:
- Рекомендуется использовать подсказку таблицы
NOLOCK
или эквивалентнуюREADUNCOMMITTED
. Дополнительные сведения см. в READUNCOMMITTED. - Рекомендуется использовать параметр
LOCK_TIMEOUT
в начале функции классификатора, установив его на низкое значение, например 1000 миллисекундах. Дополнительные сведения см. в разделе SET LOCK_TIMEOUT.
- Рекомендуется использовать подсказку таблицы
- Вы не можете изменить функцию классификатора, пока она используется в конфигурации регулятора ресурсов. Однако можно изменить конфигурацию, чтобы использовать другую функцию классификатора. Если вы хотите внести изменения в классификатор, попробуйте создать пару функций классификатора. Например, можно создать
dbo.rg_classifier_A()
иdbo.rg_classifier_B()
. Если требуется изменить логику классификатора, выполните следующие действия.- Используйте инструкцию ALTER FUNCTION
ALTER FUNCTION, чтобы внести изменения в функции, не в настоящее время, используемой в конфигурации регулятора ресурсов. - Используйте инструкцию ALTER RESOURCE GOVERNOR, чтобы активировать изменённый классификатор, а затем перенастройте регулятор ресурсов. Например:
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier_B); ALTER RESOURCE GOVERNOR RECONFIGURE;
- Если изменение необходимо еще раз, выполните те же действия, что и другая функция (
dbo.rg_classifier_A()
).
- Используйте инструкцию ALTER FUNCTION
- Конфигурация регулятора ресурсов хранится в базе данных
master
. Обязательно периодически создайте резервную копиюmaster
и узнайте, как восстановить ее. Дополнительные сведения см. в разделе Резервное копирование и восстановление: системные базы данных. Так как существуют ограничения для восстановленияmaster
, рекомендуется также сохранить копию скриптов конфигурации регулятора ресурсов отдельно. Вы можете повторно создать конфигурацию регулятора ресурсов из скриптов, если необходимо перестроить базу данныхmaster
.
Связанное содержимое
- Регулятор ресурсов
- Включить регулятор ресурсов
- пул ресурсов управителя ресурсов
- группа рабочей нагрузки регулятора ресурсов
- Настройка регулятора ресурсов с помощью шаблона
- просмотр и изменение свойств регулятора ресурсов
- ALTER RESOURCE GOVERNOR
- CREATE RESOURCE POOL
- СОЗДАТЬ ГРУППУ НАГРУЗКИ
- СОЗДАТЬ ФУНКЦИЮ