Die Ressourcen Kontrolle (engl. Resource Governor) ist ein Microsoft SQL Server Enterprise Feature, welches erlaubt, dass Anwendungen oder Benutzer im Verbrauch von Systemressourcen eingeschränkt werden. Die Einschränkung erfolgt jedoch nur, wenn nicht mehr ausreichend Ressourcen verfügbar sind. D.h. wenn eine Anwendung max. 50% der CPU Last verwenden darf, aber 100% verfügbar sind, erfolgt die Einschränkung nicht, erst wenn der Bedarf von höher konfigurierten und priorisierten Anwendungen vorhanden ist. Die Einschränungen können unter den folgenden Indikatoren vorgenommen werden:
- Arbeitsspeicher
- CPU
- Timeouts
- Anfragen
Die jeweiligen Einstellungen können mit min. und max. Werten konfiguriert werden.
In der Umsetzung werden sogenannte Pools erzeugt, die den Ressourcen Gruppen zur Verfügung stehen. Die Unterscheidung welcher Benutzer oder welche Anwendung wie eingeschränkt wird, bzw. hier überhaupt berücksichtigt wird, erfolgt über Klassifizierungsfunktionen.
Die Überwachung der Einstellungen kann über den Windows Ressourcen Monitor durchgeführt werden. Dafür wird eine Gruppe „Workload Group Stats“ zur Verfügung gestellt. Dazu aber später mehr …
In diesem Beispiel geht es nun um die Einschränkung von 2 Anwendern, die jeweils nur eine bestimmte CPU Zeit zugewiesen bekommen sollen. (kleiner Hinweis: Besser nur eine CPU im SQL Server verwenden, damit die CPU Auslastung besser sichtbar wird)
Um erstmal zu beginnen, werden 2 Logins erstellt:
CREATE LOGIN [BenutzerKundeA] WITH PASSWORD=N'asdf', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO CREATE LOGIN [BenutzerKundeB] WITH PASSWORD=N'asdf', DEFAULT_DATABASE=[master], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF GO |
Nun wird die Ressourcen Kontrolle aktiviert (zu finden unter der Verwaltung im SMSS):
ALTER RESOURCE GOVERNOR RECONFIGURE; |
Nun werden 2 Pools erstellt:
CREATE RESOURCE POOL [HoheLeistung] GO CREATE RESOURCE POOL [NiedrigeLeistung] GO |
Und nun 2 Gruppen die dem jeweiligen Pool zugewiesen werden (jeder Pool kann unterschiedliche Gruppen beinhalten die dazu noch priorisiert werden können):
CREATE WORKLOAD GROUP [KundeA] USING [HoheLeistung] GO CREATE WORKLOAD GROUP [KundeB] USING [NiedrigeLeistung] GO |
Nun wird die Ressourcen Kontrolle aktiviert und die Änderungen übernommen:
ALTER RESOURCE GOVERNOR RECONFIGURE; |
Nun erfolgt die Einschränkung der Pools:
ALTER RESOURCE POOL [HoheLeistung] WITH (min_cpu_percent=0, max_cpu_percent=50); ALTER RESOURCE POOL [NiedrigeLeistung] WITH (min_cpu_percent=0, max_cpu_percent=50); |
Beide Pools verfügen über maximal 50% CPU Last
… und nun wieder die Änderungen übernehmen)
ALTER RESOURCE GOVERNOR RECONFIGURE; |
Nun wird in der master Datenbank die Klassifizierungsfunktions erstellt, welche nach dem jeweiligen Benutzernamen die jeweilige, zu verwedende Gruppe zurückgibt:
CREATE FUNCTION dbo.RG_KlassifizierungsFunktion() RETURNS SYSNAME WITH SCHEMABINDING AS BEGIN DECLARE @GroupName SYSNAME IF(SUSER_NAME() = 'BenutzerKundeA') BEGIN SET @GroupName = 'KundeA' END IF(SUSER_NAME() = 'BenutzerKundeB') BEGIN SET @GroupName = 'KundeB' END RETURN @GroupName END GO |
Nun wird die Funktion der Ressourcen Kontrolle übergeben und die Änderungen werden angewendet:
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.RG_KlassifizierungsFunktion) GO ALTER RESOURCE GOVERNOR RECONFIGURE; GO |
Wenn man nun folgenden Code unter den beiden Benutzern ausführt und die Indikatoren in den PerfMon mit aufnimmt, tritt die Ressourcen Kontrolle in Kraft …
set nocount on declare @i int declare @s varchar(100) set @i = 100000000 while @i > 0 begin select @s = @@version; set @i = @i - 1; end |
und bringt folgendes Ergebnis im PerfMon:
Damit das Beispiel auch Sinn macht, werden die Gruppen angepasst:
ALTER RESOURCE POOL HoheLeistung WITH(min_cpu_percent=0, max_cpu_percent=75); GO ALTER RESOURCE POOL NiedrigeLeistung WITH(min_cpu_percent=0, max_cpu_percent=25); GO ALTER RESOURCE GOVERNOR RECONFIGURE; GO |
Nun erhält der eine Pool max. 75% CPU und der andere max. 25%. Im PerfMon sieht das dann folgendermaßen aus: