Control de los recursos de SQL Server
Aunque algunas instancias de SQL Server o instancias administradas de Azure SQL solo admiten bases de datos de una aplicación (esta configuración se suele ver en aplicaciones críticas), muchos servidores admiten bases de datos para varias aplicaciones con diferentes requisitos de rendimiento y distintos ciclos de carga de trabajo. Encontrar el equilibrio de estos requisitos diferentes puede suponer un desafío para el administrador. Una de las formas de equilibrar los recursos del servidor es usar Resource Governor, que se presentó en SQL Server 2008.
Resource Governor es una característica de SQL Server y la instancia administrada de Azure SQL que permite controlar de forma granular la cantidad de recursos de CPU, de operaciones físicas de E/S y de memoria que puede usar una solicitud entrante desde una aplicación. Resource Governor se habilita en la instancia y permite definir cómo se tratan las conexiones mediante una función clasificadora, que subdivide las sesiones en el grupo de cargas de trabajo. Cada grupo de cargas de trabajo está configurado para usar un grupo específico de recursos del sistema.
Grupos de recursos
Un grupo de recursos representa los recursos físicos disponibles en el servidor. SQL Server siempre tiene dos grupos, (el predeterminado y el interno), incluso cuando Resource Governor no está habilitado. El grupo interno lo usan las funciones de SQL Server críticas y no se puede restringir. El grupo predeterminado y los grupos de recursos que defina explícitamente se pueden configurar con límites en los recursos que pueden usar. Puede especificar los límites siguientes para cada grupo no interno:
Porcentaje de CPU mínimo y máximo
Límite del porcentaje de CPU
Porcentaje de memoria mínimo y máximo
Afinidad del nodo NUMA
IOPS por volumen mínimas y máximas
Nota:
Los cambios en un grupo solo afectan a las nuevas sesiones, no a las existentes. Un cambio en un grupo no le ayudará a restringir los recursos de un proceso de ejecución prolongada. La excepción son los grupos externos que se usan junto con Machine Learning Services de SQL Server, que son externos a SQL Server y pueden verse limitados por un cambio en el grupo.
Con la excepción de los porcentajes de CPU mínimo y máximo, el resto de las opciones de configuración del grupo de recursos representan límites estrictos que no se pueden superar. Los porcentajes de CPU mínimo y máximo solo se aplicarán cuando se produzca una contención de CPU. Por ejemplo, si tiene un máximo del 70 % y hay ciclos de CPU disponibles, la carga de trabajo puede usar hasta un 100 %. Si hay otras cargas de trabajo en ejecución, la carga de trabajo se restringirá al 70 %.
Grupo de cargas de trabajo
Un grupo de cargas de trabajo es un contenedor para las solicitudes de sesión en función de cómo las clasifique la función clasificadora. Al igual que los grupos de recursos, hay dos grupos integrados (el predeterminado y el interno), y cada grupo de cargas de trabajo solo puede pertenecer a un grupo de recursos. Sin embargo, un grupo de recursos puede hospedar varios grupos de cargas de trabajo. Todas las conexiones se dirigen al grupo de cargas de trabajo predeterminado, a menos que la función clasificadora las pase a otro grupo definido por el usuario. Y, de forma predeterminada, el grupo de cargas de trabajo predeterminado usa los recursos asignados al grupo de recursos predeterminado.
Función clasificadora
La función clasificadora se ejecuta en el momento en que se establece una conexión con la instancia de SQL Server y clasifica cada conexión en un grupo de cargas de trabajo determinado. Si la función definida por el usuario devuelve NULL, el valor predeterminado o el nombre de un grupo que no existe, la sesión se transferirá al grupo de cargas de trabajo predeterminado. Puesto que el clasificador se ejecuta en cada conexión, se debe probar su eficacia. En la imagen siguiente, se muestra una función clasificadora de ejemplo que clasifica los usuarios según su nombre de usuario.
CREATE FUNCTION dbo.RGClassifier()
RETURNS SYSNAME
WITH SCHEMABINDING
AS
BEGIN
DECLARE @WorkloadGroup AS SYSNAME
IF(SUSER_NAME() = 'ReportUser')
SET @WorkloadGroup = 'ReportServerGroup'
ELSE IF (SUSER_NAME() = 'PrimaryUser')
SET @WorkloadGroup = 'PrimaryServerGroup'
ELSE
SET @WorkloadGroup = 'default'
RETURN @WorkloadGroup
END
Puede aumentar la complejidad de la definición de función que se muestra en el ejemplo, pero debe comprobar que la función más compleja no afecte al rendimiento de inicio de sesión del usuario.
Casos de uso de Resource Governor
Resource Governor se usa principalmente en escenarios de varios inquilinos en los que un grupo de bases de datos comparte una única instancia de SQL Server y el rendimiento debe ser coherente para todos los usuarios del servidor. También puede usar Resource Governor para limitar los recursos que utilizan las operaciones de mantenimiento, como las comprobaciones de coherencia y las recompilaciones de índices, con el fin de intentar garantizar suficientes recursos para las consultas de usuario durante los períodos de mantenimiento.