CiAgICA8IS0tIExpbmtlZEluIC0tPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIF9saW5rZWRpbl9wYXJ0bmVyX2lkID0gIjEyMzUwNzMiOwogICAgICAgIHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyA9IHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyB8fCBbXTsKICAgICAgICB3aW5kb3cuX2xpbmtlZGluX2RhdGFfcGFydG5lcl9pZHMucHVzaChfbGlua2VkaW5fcGFydG5lcl9pZCk7CiAgICA8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgKGZ1bmN0aW9uKCl7dmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiO2IuYXN5bmMgPSB0cnVlOwogICAgICAgICAgICBiLnNyYyA9ICJodHRwczovL3NuYXAubGljZG4uY29tL2xpLmxtcy1hbmFseXRpY3MvaW5zaWdodC5taW4uanMiOwogICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsIHMpO30pKCk7CiAgICA8L3NjcmlwdD4KICAgIDxub3NjcmlwdD4KICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBhbHQ9IiIgc3JjPSJodHRwczovL3B4LmFkcy5saW5rZWRpbi5jb20vY29sbGVjdC8/cGlkPTEyMzUwNzMmZm10PWdpZiIgLz4KICAgIDwvbm9zY3JpcHQ+CiAgICA8IS0tIEVuZCBMaW5rZWRJbiAtLT4KICAgIA==
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Volle Ressourcenkontrolle

Der Microsoft SQL-Server als Plattform für BI-Lösungen hat sich etabliert. Aber was kann man tun, wenn aus Projektsicht mehr Ressourcen benötigt werden, aber zudem die Infrastrukturen für den Betrieb nicht weiter verkompliziert werden sollen. Wie die Datenbanksysteme sinnvoller ausgelastet werden können, gleichzeitig aber die verteilten Ressourcen verwaltet und dediziert zugewiesen werden können, zeigt dieser Blogbeitrag mit Hilfe des „Resource Governor“.

Hintergrund

„Time is money!“, wer hat diesen oder ähnlich formulierten Satz nicht schon in seinem Projektumfeld gehört? Oftmals sind damit die menschlichen, quantitativ begrenzten Ressourcen gemeint. Ein Projekt dauert länger und wird dadurch teurer. Es fehlen Mitarbeiter, das Projekt verzögert sich, was wiederum mehr Kosten verursacht. Diese Beispiele kann man quasi beliebig schachteln, das Ergebnis bleibt fast immer gleich. Unternehmen begegnen diesem Dilemma meist mit einer auf das Problem bezogenen Planung. Am Beispiel von IT-Projekten könnte das bedeuten, mehr Personal für die Umsetzung zur Verfügung zu stellen, Projekte zu priorisieren oder einfach direkt von Dienstleistern umsetzen zu lassen, um eigene Personalressourcen zu sparen.

Wie sieht es aber mit nicht-menschlichen Ressourcen aus?

Mit heutigen Technologien wie virtuellen Maschinen, Wolken (Cloud) und dergleichen gilt das nicht minder, ich zahle einen Betrag X für die Nutzung von Y für die Dauer von Z.

Und wenn man dann doch wieder die IT-Systeme selbst betreibt, also damit keine Dienstleister in Anspruch nimmt? Wer nicht auf Open-Source Produkte setzt, der darf Lizenzgebühren entrichten.

Hier sind wir dann auch bei dem heutigen Thema angelangt: wie kann man möglichst viel Nutzung aus seinen Systemen bekommen, ohne dafür unnötigerweise Lizenzen zu benötigen, dies am Beispiel von Microsoft SQL-Server (kurz: MS SQL) ?

Anwendungsfälle

In den folgenden Fällen sollte der Einsatz der in diesem Blogbeitrag vorgestellten Ressourcenkontrolle mindestens erwogen werden:

  • Ein „All-In“ Server (Datenbank (relational und OLAP) und Applikation) für Entwicklung, Test und Produktion
  • Simulationen der Auswirkungen von Latenzzeiten (Fehler in Folge von Timeouts)
  • Abbildung von getrennten Systemumgebungen für mind. Entwicklung und Produktion bei gleichzeitig stark begrenztem Budget (Server)
  • Minimierung des administrativen Aufwands für das Betreiben einer Systemlandschaft

Technische Lösung

Der MS SQL-Server bietet hier von Hause aus eine recht unbekannte, dennoch sehr nützliche Funktionalität: den sogenannten „Resource Governor“ (kurz: RG)! Man findet diesen im Microsoft Management Studio (kurz: SSMS) nach Verbindung zu einer Datenbankinstanz unter dem Knoten „Verwaltung“.


Abbildung 1: Übersicht im SSMS

Mit Hilfe des RG können Grenzwerte für den Verbrauch von CPU, Arbeitsspeicher und physischen I/Os festgelegt und zugeordnet werden. Diese Zuordnungen sind auf die Datenbankengine begrenzt und können nicht für die Verwaltung von Analysis-Services (kurz: SSAS) oder Integration-Services (kurz: SSIS) verwendet werden. Für die Interessierten unter uns: am Ende des Blogbeitrags befindet sich der entsprechende Link zum MSDN mit weiteren Details.

Grundsätzlich besteht die Ressourcenverwaltung aus drei Bausteinen:

  • Ressourcenpool = definiert, was konkret eingeschränkt wird
  • Arbeitsauslastungsgruppe (engl.: workload group)
  • Klassifizierung (engl.: classifier function)

Das Zusammenspiel der Bausteine und die Konfiguration werden im folgenden Kapitel anhand eines konkreten Beispiels beschrieben.

Beispiel

In diesem Beispiel wird eine Ressourcenverwaltung für die Verwendung der physischen Laufwerke (I/O pro Sekunde) festgelegt. In der Praxis wurde damit eine Simulation von SQL-Timeouts provoziert, um eine gezielte Fehleranalyse betreiben zu können.

Zunächst sollte ein separates Login angelegt werden, damit später in der Klassifizierung die Auswirkung dediziert zugewiesen werden kann und nicht versehentlich das gesamte System ausgebremst wird.

CREATE LOGIN SlowDiskSimulation WITH PASSWORD = 'Laaangsaam!';
GO
ALTER SERVER ROLE [sysadmin] ADD MEMBER [SlowDiskSimulation]
GO 

Anschließend können direkt ein Ressourcenpool für die zu verwaltende Ressource und eine Arbeitsauslastungsgruppe für die spätere Zuordnung der Gruppe innerhalb der Klassifizierungsfunktion erstellt werden.

CREATE RESOURCE POOL SlowDiskPool;
GO
CREATE WORKLOAD GROUP SlowDiskGroup USING SlowDiskPool;
GO

Als nächstes legen wir eine Klassifizierungsfunktion an, welche dafür sorgt, dass eingehende Verbindungen einer Arbeitsauslastungsgruppe zugeordnet werden. Im Standard legt MS SQL-Server bereits bei Installation eine Gruppe „default“ an.

CREATE FUNCTION dbo.Throttle_Insert_Performance()
RETURNS SYSNAME WITH SCHEMABINDING
AS
BEGIN
       DECLARE @GroupName SYSNAME
          IF SUSER_NAME() = 'SlowDiskSimulation'
             BEGIN
               SET @GroupName = 'SlowDiskGroup'
           END
       ELSE
       BEGIN
               SET @GroupName = 'default'
       END
       RETURN @GroupName;
END

Schließlich muss der Verwaltung noch die Funktion zugewiesen werden.

ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.Throttle_Insert_Performance);
GO
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO

Mit der Anweisung RECONFIGURE wird die Ressourcenkontrolle bereits aktiviert. Da aktuell noch keine Bremse eingebaut ist, merken wir bei Abfragen gegen die Datenbankinstanz auch noch keine Auswirkungen.


Abbildung 2: Ausführungsdauer ohne Einschränkung des I/O

Um die Funktionalität zu testen, drosseln wir jetzt einmal das Festplattensubsystem und gewähren SQL-Server nur 10 I/Os pro Sekunde.

ALTER RESOURCE POOL SlowDiskPool WITH (MAX_IOPS_PER_VOLUME = 10);
GO
ALTER RESOURCE GOVERNOR RECONFIGURE;
GO

Um das Ergebnis zu sehen, melden wir uns an der Datenbankinstanz mit dem zuvor angelegten SQL-Server Login an und führen erneut auf der zuvor verwendeten Datenbank die Prozedur P_Transform_All aus.


Abbildung 3: Gleiche Abfrage unter Ressourcenkontrolle

Siehe da, dem ausführenden (angemeldeten) Benutzer werden jetzt nur noch 10 I/Os pro Sekunde zugestanden, daher steigt die Ausführungszeit von ehemals nahezu 0 Sekunden auf jetzt ca. 8.

Wer am Anfang des Beispiels aufgepasst hat, wird feststellen, dass die Ressourcenkontrolle auch für Systemadministratoren gilt, also Vorsicht beim Einsatz auf Kundenumgebungen!

Ein weiterer Vorteil dieses Vorgehens ist, dass sehr schnell die gesamte Verwaltung an- und abgeschaltet werden kann, einfach mit Rechtsklick auf dem Topknoten Resource Governor.


Abbildung 4: Und alles wieder ungebremst

Zeigen wir uns zum Abschluss noch den Ressourcenpool in Skriptform an, erkennen wir die weiteren Parameter, die unter Punkt 3 angegeben sind.

CREATE RESOURCE POOL [SlowDiskPool] WITH
(
	MIN_CPU_PERCENT=0, 
	MAX_CPU_PERCENT=100,
	MIN_MEMORY_PERCENT=0,
	MAX_MEMORY_PERCENT=100, 
	CAP_CPU_PERCENT=100, 
	AFFINITY SCHEDULER = AUTO, 
	MIN_IOPS_PER_VOLUME=0, 
	MAX_IOPS_PER_VOLUME=10
)
GO

Für weitere Simulationen bzw. Einschränkungen reicht es also vollkommen aus, die ALTER RESOURCE POOL Anweisung von der vorherigen Seite anzupassen und auszuführen.

Fazit

Aus dem hier gezeigten einfachen Beispiel geht klar hervor, wie nützlich die Ressourcenkontrolle sein kann. Wenn das Budget etwas knapper gefasst ist, brauchen wir dennoch nicht auf unsere gewünschte 2-Systemlandschaft zu verzichten. Einfach zwei getrennte Datenbankinstanzen unter verschiedenen Systemkonten installieren, die Ressourcenkontrolle für die Entwicklungsinstanz aktivieren, und schon kann ein zu großer negativer Effekt für die Produktion verhindert werden.

Nützliche Links

https://docs.microsoft.com/de-de/sql/relational-databases/resource-governor/resource-governor?view=sql-server-2017