Contrôler les ressources SQL Server
Bien que certains serveurs SQL ou instances managées Azure SQL soient dédiés aux bases de données d’une seule application, une configuration souvent vue dans les applications critiques, de nombreux serveurs prennent en charge les bases de données pour plusieurs applications avec des exigences de performances variables et des cycles de charge de travail de pointe. L’équilibrage de ces différentes exigences peut être difficile pour les administrateurs. Une façon efficace de gérer les ressources du serveur consiste à utiliser Resource Governor, introduit dans SQL Server 2008.
Resource Governor est une fonctionnalité des instances managées SQL Server et Azure SQL qui permettent un contrôle granulaire du processeur, des E/S physiques et des ressources de mémoire pour les demandes d’application entrantes. Lorsqu’elle est activée au niveau de l’instance, Resource Governor utilise une fonction classifieur pour définir la façon dont les connexions sont traitées, subdivisant les sessions en groupes de charge de travail. Chaque groupe de charges de travail est configuré pour utiliser un pool spécifique de ressources système.
Pools de ressources
Un pool de ressources représente les ressources physiques disponibles sur le serveur. SQL Server a toujours deux pools : par défaut et interne, même quand Resource Governor n’est pas activé. Le pool interne est réservé aux fonctions SQL Server critiques et ne peut pas être restreint. Le pool par défaut, ainsi que les pools de ressources que vous définissez explicitement, peut être configuré avec des limites sur les ressources qu’ils peuvent utiliser. Pour chaque pool noninternal, vous pouvez spécifier les limites suivantes :
- Pourcentage min/max de processeur
- Plafond du pourcentage de processeur
- Pourcentage min/max de mémoire
- Affinité de nœud NUMA
- E/S par seconde min/max par volume
Notes
Les modifications apportées à un pool de ressources affectent uniquement les nouvelles sessions, et non celles déjà en cours. Par conséquent, la modification d’un pool ne limite pas les ressources d’un processus de longue durée. L’exception à cette règle est des pools externes utilisés avec SQL Server Machine Learning Services, qui peuvent être limités par une modification de pool même pour les sessions en cours.
Tous les paramètres du pool de ressources, à l’exception du pourcentage minimal et maximal du processeur, représentent des limites difficiles qui ne peuvent pas être dépassées. Le pourcentage d’UC min/max s’applique uniquement en cas de contention de l’UC. Par exemple, si vous définissez un maximum de 70%, la charge de travail peut utiliser jusqu’à 100% de cycles d’UC disponibles lorsqu’il n’y a pas de contention. Toutefois, si d’autres charges de travail sont en cours d’exécution, la charge de travail est limitée à 70%.
Groupe de charges de travail
Un groupe de charge de travail sert de conteneur pour les demandes de session, classés par la fonction classifieur. Comme pour les pools de ressources, il existe deux groupes intégrés : par défaut et interne. Chaque groupe de charges de travail est associé à un pool de ressources unique, mais un pool de ressources peut héberger plusieurs groupes de charges de travail. Par défaut, toutes les connexions sont dirigées vers le groupe de charge de travail par défaut, sauf si la fonction classifieur les affecte à un groupe défini par l’utilisateur. Le groupe de charge de travail par défaut utilise les ressources allouées au pool de ressources par défaut.
Fonction classifieur
La fonction classifieur s’exécute au moment où une connexion est établie à l’instance SQL Server et classifie chaque connexion dans un groupe de charges de travail donné. Si la fonction retourne une valeur NULL, une valeur par défaut ou le nom du groupe de charge de travail inexistant, la session est transférée dans le groupe de charge de travail par défaut. Étant donné que le classifieur est exécuté à chaque connexion, son efficacité doit être testée. L’illustration suivante montre un exemple de fonction classifieur qui classifie les utilisateurs en fonction de leur nom d’utilisateur.
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
Vous pouvez augmenter la complexité de la définition de fonction indiquée dans l’exemple, mais vous devez vérifier que la fonction plus complexe n’a pas d’impact sur les performances de l’utilisateur.
Cas d’usage de Resource Governor
Resource Governor est utilisé principalement dans les scénarios multilocataires où un groupe de bases de données partage une seule instance SQL Server, et les performances doivent être conservées de manière cohérente pour tous les utilisateurs du serveur. Vous pouvez également utiliser Resource Governor pour limiter les ressources utilisées par les opérations de maintenance, telles que les vérifications de cohérence et les reconstructions d’index, afin d’essayer de garantir des ressources suffisantes pour les requêtes utilisateur pendant les fenêtres de maintenance.