Resource Governor
Resource Governor — это компонент системы управления базами данных Microsoft SQL Server, предназначенный для ограничения и распределения ресурсов сервера (процессорного времени, памяти и операций ввода-вывода) между различными рабочими нагрузками. Resource Governor позволяет администратору определять политики управления ресурсами, гарантируя предсказуемую производительность для критически важных приложений и предотвращая монополизацию ресурсов одной нагрузкой.
История
Механизм Resource Governor был впервые представлен в версии SQL Server 2008 (ранее известной как Katmai) под кодовым название «R2». Основной целью разработки было решение проблемы «голодных» запросов, когда один ресурсоёмкий запрос (например, длительный отчёт или массовая загрузка данных) мог существенно замедлить выполнение оперативных транзакций.
В последующих версиях SQL Server функциональность Resource Governor расширялась:
- SQL Server 2012: добавлена возможность классификации нагрузок на основе встроенных функций, а также улучшена поддержка пулов ресурсов (Resource Pools).
- SQL Server 2014: появилась поддержка управления ресурсами для операций In-Memory OLTP (Hekaton) и улучшена интеграция с Always On Availability Groups.
- SQL Server 2016: добавлена возможность управления степенью параллелизма (MAXDOP) на уровне рабочей нагрузки в пулах ресурсов, что позволило более тонко настраивать использование CPU.
- SQL Server 2017 и 2019: расширена поддержка управления памятью для временных таблиц (tempdb) и улучшена диагностика. В версии 2019 года появилась возможность использовать Resource Governor в сочетании с Big Data Clusters.
- SQL Server 2022: добавлена поддержка управления ресурсами для Azure SQL Managed Instance, а также улучшено логирование и мониторинг через динамические административные представления (DMV).
Архитектура и компоненты
Resource Governor состоит из трёх ключевых концептуальных компонентов:
Пул ресурсов (Resource Pool)
Пул ресурсов представляет собой логический контейнер, который определяет долю ресурсов сервера (CPU, память, I/O), доступную для группы рабочих нагрузок. На сервере существуют два предопределённых пула:
- Внутренний пул (Internal Pool): используется только системными процессами SQL Server. Администратор не может изменять его настройки напрямую, но может регулировать потребление ресурсов через другие пулы.
- Пул по умолчанию (Default Pool): используется для всех рабочих нагрузок, которые не привязаны к пользовательским пулам. По умолчанию этот пул охватывает все ресурсы сервера.
Администратор может создавать собственные пулы ресурсов, задавая для них минимальные и максимальные проценты использования CPU, памяти и пропускной способности I/O. Например, можно создать пул «Отчёты», который получает максимум 30% CPU и 2 ГБ памяти.
Группа рабочей нагрузки (Workload Group)
Группа рабочей нагрузки является контейнером внутри пула ресурсов. Для каждой группы задаются специфические параметры выполнения запросов, такие как:
- Важность (Importance): определяет приоритет доступа к ресурсам внутри пула (Low, Medium, High).
- Максимальная степень параллелизма (MAXDOP): ограничивает количество процессоров, используемых для выполнения одного запроса.
- Максимальное количество запросов в памяти (Request max memory grant): ограничивает объём памяти, выделяемый на один запрос.
- Максимальный процент времени CPU (Request max CPU time): если запрос превышает заданный лимит, он завершается с ошибкой.
- Максимальный объем операций ввода-вывода (Max disk I/O per session/session instance): ограничение на частоту и объём операций ввода-вывода.
Важной особенностью является то, что группы рабочей нагрузки не могут быть вложены друг в друга. Каждая группа привязана ровно к одному пулу ресурсов.
Функция классификатора (Classifier Function)
Классификатор — это пользовательская функция на языке Transact-SQL (T-SQL), которая определяет, к какой группе рабочей нагрузки следует отнести каждый входящий сеанс. Функция анализирует свойства сеанса (например, имя пользователя, имя приложения, имя хоста, роль базы данных или логин) и возвращает имя группы рабочей нагрузки.
Типичный пример: функция проверяет, является ли пользователь «ReportUser», и возвращает имя «ReportingWorkloadGroup». Если пользователь не найден, возвращается NULL, что означает направление сеанса в пул по умолчанию.
Принцип работы
Процесс работы Resource Governor можно описать в несколько этапов:
- Входящий запрос: клиентское приложение отправляет запрос на SQL Server.
- Классификация: система вызывает функцию классификатора (если она определена). Функция анализирует логин, имя приложения, хост и другие параметры, и возвращает идентификатор группы рабочей нагрузки.
- Привязка к группе: запрос привязывается к определённой группе рабочей нагрузки, а та, в свою очередь, к пулу ресурсов.
- Выделение ресурсов: SQL Server использует предопределённые лимиты пула для управления выделением CPU, памяти и I/O для данного сеанса. Если пул достиг своего максимума, запрос может быть поставлен в очередь или завершён, в зависимости от настроек группы (параметр «Request execution timeout»).
- Выполнение: запрос выполняется в рамках выделенного бюджета ресурсов. Если запрос пытается превысить лимиты (например, запросить больше памяти, чем разрешено), он может быть приостановлен, завершён или выполнен с использованием меньшего объёма ресурсов.
Возможности и ограничения
Возможности
- Изоляция ресурсов: гарантирует, что ресурсоёмкие отчёты не будут влиять на быстродействие систем OLTP (Online Transaction Processing).
- Гибкая настройка приоритетов: позволяет назначать важность для разных рабочих нагрузок внутри одного пула.
- Ограничение памяти и I/O: предотвращает исчерпание памяти или перегрузку дисковой подсистемы.
- Поддержка In-Memory OLTP: в версиях SQL Server начиная с 2014 года можно управлять памятью для таблиц, оптимизированных для памяти.
Ограничения
- Не распространяется на все операции: Resource Governor не может управлять ресурсами, потребляемыми внешними компонентами (например, CLR-сборками, выполняющими массовые операции), а также операциями, выполняемыми в рамках системных процессов (Internal Pool).
- Не является планировщиком задач: Resource Governor не управляет очередностью запросов на уровне операционной системы. Он лишь ограничивает максимальную долю ресурсов для определённых групп.
- Требует тонкой настройки: неправильная настройка пулов и групп может привести к ухудшению производительности, если, например, слишком сильно ограничить пул для критических приложений.
- Ограничение на количество пулов и групп: в каждом экземпляре SQL Server можно создать до 20 пулов ресурсов и до 20 групп рабочей нагрузки (не считая встроенных).
Настройка и управление
Настройка Resource Governor осуществляется через графический интерфейс SQL Server Management Studio (SSMS) или с помощью Transact-SQL (T-SQL). Основные шаги:
- Создание пула ресурсов:
CREATE RESOURCE POOL ReportsPool WITH (MIN_CPU_PERCENT = 10, MAX_CPU_PERCENT = 30, MIN_MEMORY_PERCENT = 10, MAX_MEMORY_PERCENT = 20); - Создание группы рабочей нагрузки:
CREATE WORKLOAD GROUP ReportingGroup USING ReportsPool; - Создание функции классификатора:
CREATE FUNCTION dbo.Classifier() RETURNS SYSNAME WITH SCHEMABINDING AS ... - Привязка классификатора:
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.Classifier); - Включение Resource Governor:
ALTER RESOURCE GOVERNOR RECONFIGURE;
Для мониторинга использования ресурсов администраторы используют динамические административные представления (DMV), такие как sys.dm_resource_governor_resource_pools и sys.dm_resource_governor_workload_groups.
Применение
Resource Governor широко применяется в средах, где одновременно выполняются разнородные нагрузки. Типичные сценарии:
- Мультиарендные среды: когда один экземпляр SQL Server используется для нескольких приложений или клиентов.
- Смешанные нагрузки: когда на одном сервере выполняются как оперативные транзакции (OLTP), так и аналитические отчёты (OLAP).
- Ограничение ресурсов для отдельных пользователей: например, администратор может ограничить влияние пользователя, выполняющего случайные ресурсоёмкие запросы.
- Обеспечение SLA (Service Level Agreement): критические приложения получают гарантированный минимум ресурсов независимо от других нагрузок.
Источники
- Документация Microsoft SQL Server — Resource Governor (SQL Server Technical Documentation).
- SQL Server Books Online (BOL) — компоненты и настройка Resource Governor.
- Г. К. Баранов, «Администрирование SQL Server 2019», 2021.
- П. В. Дмитриев, «Оптимизация производительности SQL Server», 2020.
- Статья «Resource Governor: Best Practices and Troubleshooting» на сайте SQLShack (без ссылки).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →