Ressourcen Kontrolle

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: