Freigeben über


Lernprogramm: Konfigurationsbeispiele für Ressourcenkontrolle und bewährte Methoden

Gilt für:SQL ServerAzure SQL Managed Instance

Dieser Artikel enthält exemplarische Vorgehensweisen, die Sie beim Konfigurieren der Ressourcenverwaltung unterstützen und überprüfen können, ob Ihre Konfiguration wie erwartet funktioniert. Es beginnt mit einem einfachen Beispiel und führt zu den komplexeren.

Der Artikel enthält auch Beispiele für Abfragen zur Überwachung des Resource Governor und eine Liste von bewährten Praktiken für den Resource Governor.

In allen Beispielen wird davon ausgegangen, dass die Ressourcenkontrolle anfänglich deaktiviert ist und Standardeinstellungen verwendet und dass keine benutzerdefinierten Ressourcenpools, Workloadgruppen und Klassifizierungsfunktionen vorhanden sind.

Hinweis

Um die Konfiguration der Ressourcenkontrolle in der verwalteten Azure SQL-Instanz zu ändern, müssen Sie sich im Kontext der master Datenbank im primären Replikat befinden.

Ändern der Standardgruppe

In diesem Beispiel wird die Ressourcenkontrolle verwendet, um die maximale Größe einer Speichererteilung für alle Benutzerabfragen einzuschränken. Dies geschieht durch Reduzierung der Einstellung REQUEST_MAX_MEMORY_GRANT_PERCENT für die Workload-Gruppe default von den standardmäßigen 25 % auf 10 %. Im Beispiel wird keine Klassifiziererfunktion verwendet. Dies bedeutet, dass die Anmeldeverarbeitung nicht betroffen ist und alle Benutzersitzungen weiterhin in der default Workloadgruppe klassifiziert werden.

Möglicherweise müssen Sie die Größe der Speichererteilungen einschränken, wenn Abfragen auf Arbeitsspeicher warten, da andere Abfragen zu viel Arbeitsspeicher reserviert haben. Weitere Informationen finden Sie unter Behandeln von Problemen mit langsamer Leistung oder geringem Arbeitsspeicher, die durch Speichererteilungen in SQL Server verursacht werden.

  1. Ändern Sie die Standardarbeitsauslastungsgruppe.

    ALTER WORKLOAD GROUP [default] WITH (REQUEST_MAX_MEMORY_GRANT_PERCENT = 10);
    
  2. Aktivieren Sie den Ressourcen-Governor, um unsere Konfiguration wirksam umzusetzen.

    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
  3. Überprüfen Sie die neue Einstellung, einschließlich der neuen maximalen Größe einer Speichererteilung.

    SELECT group_id,
           wg.name AS workload_group_name,
           rp.name AS resource_pool_name,
           wg.request_max_memory_grant_percent_numeric AS request_max_memory_grant_percent,
           rp.max_memory_kb * wg.request_max_memory_grant_percent_numeric AS request_max_memory_grant_size_kb
    FROM sys.resource_governor_workload_groups AS wg
    INNER JOIN sys.dm_resource_governor_resource_pools AS rp
    ON wg.pool_id = rp.pool_id;
    
  4. Führen Sie das folgende Skript aus, um zur ursprünglichen Konfiguration zurückgesetzt zu werden:

    ALTER WORKLOAD GROUP [default] WITH (REQUEST_MAX_MEMORY_GRANT_PERCENT = 25);
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    ALTER RESOURCE GOVERNOR DISABLE;
    

Verwenden einer benutzerdefinierten Workloadgruppe

In diesem Beispiel wird die Ressourcenkontrolle verwendet, um sicherzustellen, dass alle Anforderungen an Sitzungen mit einem bestimmten Anwendungsnamen nicht mit dem Grad der Parallelität (DOP) ausgeführt werden, der höher als vier ist. Dazu klassifizieren Sie Sitzungen in eine Workloadgruppe, wobei die MAX_DOP Einstellung auf 4 festgelegt ist.

Weitere Informationen zum Konfigurieren des maximalen Parallelitätsgrads finden Sie unter Serverkonfiguration: max. Parallelitätsgrad.

  1. Erstellen Sie eine Workloadgruppe, die DOP einschränkt. Die Gruppe verwendet den default Ressourcenpool, da wir DOP nur für eine bestimmte Anwendung einschränken möchten, aber keine CPU-, Arbeitsspeicher- oder E/A-Ressourcen reservieren oder einschränken möchten.

    CREATE WORKLOAD GROUP limit_dop
    WITH (
         MAX_DOP = 4
         )
    USING [default];
    
  2. Erstellen Sie die Klassifiziererfunktion. Die Funktion verwendet die integrierte APP_NAME() -Funktion, um den in der Clientverbindungszeichenfolge angegebenen Anwendungsnamen zu ermitteln. Wenn der Anwendungsname auf limited_dop_application festgelegt ist, gibt die Funktion den Namen der Workloadgruppe zurück, die DOP einschränkt. Andernfalls gibt die Funktion den Namen der Workloadgruppe zurück default .

    USE master;
    GO
    
    CREATE FUNCTION dbo.rg_classifier()
    RETURNS sysname
    WITH SCHEMABINDING
    AS
    BEGIN
    
    DECLARE @WorkloadGroupName sysname = N'default';
    
    IF APP_NAME() = N'limited_dop_application'
        SELECT @WorkloadGroupName = N'limit_dop';
    
    RETURN @WorkloadGroupName;
    
    END;
    GO
    
  3. Ändern Sie die Konfiguration des Ressourcengouverneurs, um unsere Konfiguration effektiv zu gestalten und Ressourcenkontrolle zu aktivieren.

    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier);
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
  4. Abfrage sys.resource_governor_configuration , um zu überprüfen, ob die Ressourcensteuerung aktiviert ist und die von uns erstellte Klassifiziererfunktion verwendet.

    SELECT OBJECT_SCHEMA_NAME(classifier_function_id) AS classifier_schema_name,
           OBJECT_NAME(classifier_function_id) AS classifier_object_name,
           is_enabled
    FROM sys.resource_governor_configuration;
    
    classifier_schema_name      classifier_object_name      is_enabled
    ----------------------      ----------------------      ----------
    dbo                         rg_classifier               1
    
  5. Überprüfen Sie, ob Sitzungen mit einem bestimmten Anwendungsnamen in die limit_dop Workloadgruppe klassifiziert werden, während andere Sitzungen weiterhin in der default Workloadgruppe klassifiziert werden. Wir verwenden eine Abfrage, die sys.dm_exec_sessions und sys.resource_governor_workload_groups Systemansichten verwendet, um den Anwendungsnamen und den Workloadgruppennamen für die aktuelle Sitzung zurückzugeben.

    1. Wählen Sie in SQL Server Management Studio (SSMS) im Hauptmenü " Datei " aus, "Neu", "Datenbankmodulabfrage".

    2. Geben Sie im Dialogfeld "Mit Datenbankmodul verbinden " dieselbe Datenbankmodulinstanz an, in der Sie die Workloadgruppe und die Klassifizierungsfunktion erstellt haben. Wählen Sie die Registerkarte "Zusätzliche Verbindungsparameter " aus, und geben Sie ein App=limited_dop_application. Dadurch verwendet SSMS limited_dop_application als Anwendungsname, wenn eine Verbindung mit der Instanz hergestellt wird.

    3. Wählen Sie "Verbinden" aus, um eine neue Verbindung zu öffnen.

    4. Führen Sie im gleichen Abfragefenster die folgende Abfrage aus:

      SELECT s.program_name AS application_name,
             wg.name AS workload_group_name,
             wg.max_dop
      FROM sys.dm_exec_sessions AS s
      INNER JOIN sys.resource_governor_workload_groups AS wg
      ON s.group_id = wg.group_id
      WHERE s.session_id = @@SPID;
      

      Es sollte die folgende Ausgabe angezeigt werden, die zeigt, dass die Sitzung in die limit_dop Workloadgruppe eingeteilt wurde, wobei der maximale DOP-Wert auf vier festgelegt ist:

      application_name            workload_group_name     max_dop
      ----------------            -------------------     -------
      limited_dop_application     limit_dop               4
      
    5. Wiederholen Sie die obigen Schritte, geben Sie jedoch nichts in das Feld auf der Registerkarte "Zusätzliche Verbindungsparameter " ein. Die Ausgabe ändert sich, wobei der Standardname der SSMS-Anwendung und die default Workloadgruppe mit dem Standardwert 0 für maximale DOP angezeigt werden.

      application_name                                    workload_group_name     max_dop
      ----------------                                    -------------------     -------
      Microsoft SQL Server Management Studio - Query      default                 0
      
  6. Wenn Sie zur erstkonfiguration dieses Beispiels zurückkehren möchten, trennen Sie alle Sitzungen mithilfe der limit_dop Workloadgruppe, und führen Sie das folgende T-SQL-Skript aus. Das Skript enthält die folgenden Schritte:

    1. Deaktivieren Sie die Ressourcenkontrolle, damit die Klassifiziererfunktion gelöscht werden kann.
    2. Löschen Sie die Workloadgruppe. Dies erfordert, dass keine Sitzungen diese Workloadgruppe verwenden.
    3. Konfigurieren Sie die Ressourcenkontrolle neu, um die effektive Konfiguration ohne die Klassifiziererfunktion und die Workloadgruppe neu zu laden. Dies aktiviert den Resource Governor.
    4. Deaktivieren Sie die Ressourcenkontrolle, um zur ursprünglichen Konfiguration zurückgesetzt zu werden.
    /* Disable resource governor so that the classifier function can be dropped. */
    ALTER RESOURCE GOVERNOR DISABLE;
    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL);
    DROP FUNCTION IF EXISTS dbo.rg_classifier;
    
    /* Drop the workload group. This requires that no sessions are using this workload group. */
    DROP WORKLOAD GROUP limit_dop;
    
    /* Reconfigure resource governor to reload the effective configuration without the classifier function and the workload group. This enables resource governor. */
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
    /* Disable resource governor to revert to the initial configuration. */
    ALTER RESOURCE GOVERNOR DISABLE;
    

Verwenden mehrerer Ressourcenpools und Workloadgruppen

In diesem Beispiel wird die Ressourcenkontrolle verwendet, um Sitzungen aus einer Auftragsverarbeitungsanwendung in verschiedene Workloadgruppen und Ressourcenpools zu klassifizieren, je nach Tageszeit. Diese Konfiguration weist der Anwendung während der Spitzenverarbeitungszeit weitere Ressourcen zu und schränkt ihre Ressourcen während der Arbeitsstunden ein. Im Beispiel wird davon ausgegangen, dass die Anwendung keine langen Sitzungen verwendet.

  1. Erstellen Sie zwei Ressourcenpools für die Verarbeitung von Spitzenzeiten und arbeitsfreie Stunden.

    • Der peak_hours_pool Pool garantiert (reserviert) mindestens 20% der durchschnittlichen CPU-Bandbreite über MIN_CPU_PERCENT und begrenzt die CPU-Bandbreite nicht, indem MAX_CPU_PERCENT auf 100 festgelegt wird.
    • Der off_hours_pool-Pool reserviert keine CPU-Bandbreite, indem MIN_CPU_PERCENT auf 0 gesetzt wird, begrenzt jedoch die CPU-Bandbreite auf 50%, wenn CPU-Auslastung vorhanden ist, indem MAX_CPU_PERCENT auf 50 gesetzt wird.
    CREATE RESOURCE POOL peak_hours_pool
    WITH (
         MIN_CPU_PERCENT = 20,
         MAX_CPU_PERCENT = 100
         );
    
    CREATE RESOURCE POOL off_hours_pool
    WITH (
         MIN_CPU_PERCENT = 0,
         MAX_CPU_PERCENT = 50
         );
    

    Ressourcenpools können Systemressourcen wie CPU, Arbeitsspeicher und E/A reservieren und einschränken. Weitere Informationen finden Sie unter CREATE RESOURCE POOL.

  2. Erstellen Sie zwei Workloadgruppen, jeweils eine für jeden Ressourcenpool.

    • peak_hours_group begrenzt die Anzahl der gleichzeitigen Anforderungen nicht, indem GROUP_MAX_REQUESTS auf den Standardwert von 0 gesetzt wird.
    • Die off_hours_group begrenzt die Anzahl der gleichzeitigen Anforderungen für alle Sitzungen, die in diese Gruppe klassifiziert sind, durch Festlegen von GROUP_MAX_REQUESTS auf 200.
    CREATE WORKLOAD GROUP peak_hours_group
    WITH (
         GROUP_MAX_REQUESTS = 0
         )
    USING peak_hours_pool;
    
    CREATE WORKLOAD GROUP off_hours_group
    WITH (
         GROUP_MAX_REQUESTS = 200
         )
    USING off_hours_pool;
    

    Workloadgruppen definieren Richtlinien, z. B. die maximale Anzahl von Anforderungen, den maximalen Grad an Parallelität und die maximale Größe der Speicherzuteilung. Weitere Informationen finden Sie unter CREATE WORKLOAD GROUP.

  3. Erstellen und auffüllen Sie eine Tabelle, die die Zeitintervalle für Spitzen- und Abwesenheitszeiten definiert.

    • Jede Zeile in der Tabelle definiert die Start- und Endzeit des Intervalls und den Namen der Workloadgruppe, die während des Intervalls verwendet werden soll.
    • Die Start- und Endzeit jedes Intervalls ist inklusive.
    • Die Tabelle wird in der master Datenbank erstellt, sodass sie in einer schemagebundenen Klassifiziererfunktion verwendet werden kann.
    USE master;
    GO
    
    CREATE TABLE dbo.workload_interval
    (
    workload_group_name sysname NOT NULL,
    start_time time(7) NOT NULL,
    end_time time(7) NOT NULL,
    CONSTRAINT pk_workload_interval PRIMARY KEY (start_time, workload_group_name),
    CONSTRAINT ak_workload_interval_1 UNIQUE (end_time, workload_group_name),
    CONSTRAINT ck_workload_interval_1 CHECK (start_time < end_time)
    );
    GO
    
    INSERT INTO dbo.workload_interval
    VALUES (N'off_hours_group', '00:00', '06:29:59.9999999'),
           (N'peak_hours_group', '06:30', '18:29:59.9999999'),
           (N'off_hours_group', '18:30', '23:59:59.9999999');
    
  4. Erstellen Sie die Klassifiziererfunktion.

    • Es wird erwartet, dass die Daten in der Tabelle eine einzelne übereinstimmende Zeile für eine bestimmte Tageszeit aufweisen. Wenn die Daten gegen diese Regel verstoßen, gibt die Funktion den Namen der Workloadgruppe zurück default .
    • Die folgende Beispielfunktion gibt default zurück, wenn der von der integrierten APP_NAME()-Funktion zurückgegebene Anwendungsname etwas anderes als order_processing ist.
    USE master;
    GO
    
    CREATE OR ALTER FUNCTION dbo.rg_classifier()
    RETURNS sysname
    WITH SCHEMABINDING
    AS
    BEGIN
    
    DECLARE @WorkloadGroupName sysname = N'default';
    
    SELECT @WorkloadGroupName = workload_group_name
    FROM dbo.workload_interval
    WHERE APP_NAME() = N'order_processing'
          AND
          CAST(GETDATE() AS time(7)) BETWEEN start_time AND end_time;
    
    IF @@ROWCOUNT > 1
        SELECT @WorkloadGroupName = N'default';
    
    RETURN @WorkloadGroupName;
    
    END;
    GO
    
  5. Dies ist ein optionaler Schritt. Anstatt eine Tabelle in der master Datenbank zu erstellen, können Sie einen Tabellenkonstruktor verwenden, um die Zeitintervalle direkt in der Klassifiziererfunktion zu definieren. Dies ist der empfohlene Ansatz, wenn die Datengröße klein ist und die Kriterien der Klassifiziererfunktion nicht häufig geändert werden. Hier ist ein Beispiel für denselben Klassifikator, der einen Konstruktor mit Tabellenwert anstelle einer Tabelle in master verwendet.

    USE master;
    GO
    
    CREATE OR ALTER FUNCTION dbo.rg_classifier()
    RETURNS sysname
    WITH SCHEMABINDING
    AS
    BEGIN
    
    DECLARE @WorkloadGroupName sysname = N'default';
    
    SELECT @WorkloadGroupName = workload_group_name
    FROM (
         VALUES (CAST(N'off_hours_group' AS sysname),  CAST('00:00' AS time(7)), CAST('06:29:59.9999999' AS time(7))),
                (CAST(N'peak_hours_group' AS sysname), CAST('06:30' AS time(7)), CAST('18:29:59.9999999' AS time(7))),
                (CAST(N'off_hours_group' AS sysname),  CAST('18:30' AS time(7)), CAST('23:59:59.9999999'AS time(7)))
         ) AS wg (workload_group_name, start_time, end_time)
    WHERE APP_NAME() = N'order_processing'
          AND
          CAST(GETDATE() AS time(7)) BETWEEN start_time AND end_time;
    
    IF @@ROWCOUNT > 1
        SELECT @WorkloadGroupName = N'default';
    
    RETURN @WorkloadGroupName;
    
    END;
    GO
    
  6. Ändern Sie die Konfiguration des Ressourcengouverneurs, um unsere Konfiguration effektiv zu gestalten und Ressourcenkontrolle zu aktivieren.

    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier);
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
  7. Überprüfen Sie, ob die Ressourcensteuerung aktiviert ist, die angegebene Klassifiziererfunktion verwendet, und dass die Klassifiziererfunktion wie im vorherigen Beispiel wie erwartet funktioniert. Dieses Mal geben wir App=order_processing auf der Registerkarte "Zusätzliche Verbindungsparameter" im SSMS-Dialogfeld "Verbinden" ein, um dem Anwendungsnamen in der Klassifiziererfunktion zu entsprechen. Führen Sie die folgende Abfrage aus, um den Anwendungsnamen, die Workloadgruppe, den Ressourcenpool und die CPU-Reservierung und den Grenzwert für die aktuelle Sitzung zu ermitteln:

    SELECT s.program_name AS application_name,
           wg.name AS workload_group_name,
           wg.group_max_requests,
           rp.name AS resource_pool_name,
           rp.min_cpu_percent,
           rp.max_cpu_percent
    FROM sys.dm_exec_sessions AS s
    INNER JOIN sys.resource_governor_workload_groups AS wg
    ON s.group_id = wg.group_id
    INNER JOIN sys.resource_governor_resource_pools AS rp
    ON wg.pool_id = rp.pool_id
    WHERE s.session_id = @@SPID;
    

    Die Ergebnisse hängen von der Tageszeit ab. Wenn die aktuelle Uhrzeit beispielsweise 14:30 ist, wird das Ergebnis angezeigt, dass peak_hours_group und peak_hours_pool verwendet werden.

    application_name    workload_group_name     group_max_requests      resource_pool_name      min_cpu_percent     max_cpu_percent
    -----------------   --------------------    ------------------      -------------------     ---------------     ---------------
    order_processing    peak_hours_group        0                       peak_hours_pool         20                  100
    
  8. Um zur anfänglichen Konfiguration dieses Beispiels zurückzukehren, trennen Sie alle Sitzungen über die Workload-Gruppen peak_hours_group und off_hours_group, und führen Sie das folgende T-SQL-Skript aus. Das Skript enthält die folgenden Schritte:

    1. Deaktivieren Sie die Ressourcenkontrolle, damit die Klassifiziererfunktion gelöscht werden kann.
    2. Löschen Sie die Workloadgruppen. Dies erfordert, dass keine Sitzungen diese Workloadgruppen verwenden.
    3. Sobald die Workloadgruppen gelöscht wurden, löschen Sie auch die Ressourcenpools.
    4. Konfigurieren Sie die Ressourcenkontrolle neu, um die effektive Konfiguration ohne die Klassifiziererfunktion und benutzerdefinierte Workloadgruppen und Ressourcenpools neu zu laden. Dies aktiviert den Resource Governor.
    5. Deaktivieren Sie die Ressourcenkontrolle, um zur ursprünglichen Konfiguration zurückgesetzt zu werden.
    /* Disable resource governor so that the classifier function can be dropped. */
    ALTER RESOURCE GOVERNOR DISABLE;
    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL);
    DROP FUNCTION IF EXISTS dbo.rg_classifier;
    DROP TABLE IF EXISTS dbo.workload_interval;
    
    /* Drop the workload groups. This requires that no sessions are using these workload groups. */
    DROP WORKLOAD GROUP peak_hours_group;
    DROP WORKLOAD GROUP off_hours_group;
    
    /* Once the workload groups are dropped, drop the resource pools. */
    DROP RESOURCE POOL peak_hours_pool;
    DROP RESOURCE POOL off_hours_pool;
    
    /* Reconfigure resource governor to reload the effective configuration without the classifier function and user-defined workload groups and resource pools. This enables resource governor. */
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
    /* Disable resource governor to revert to the initial configuration. */
    ALTER RESOURCE GOVERNOR DISABLE;
    

Überwachen des Resource Governor mithilfe von Systemansichten

Beispielabfragen in diesem Abschnitt zeigen, wie Sie Laufzeitstatistiken und Verhalten der Ressourcenverwaltung überwachen können.

Statistiken zur Ressourcenkontrolle sind seit dem letzten Serverneustart kumulativ. Wenn Sie Statistiken ab einer bestimmten Zeit sammeln müssen, können Sie Statistiken mithilfe der ALTER RESOURCE GOVERNOR RESET STATISTICS Anweisung zurücksetzen.

Statistiken zur Ressourcenpoollaufzeit

Für jeden Ressourcenpool verfolgt der Ressourcen-Controller die CPU- und Speicherauslastung, Out-of-Memory-Ereignisse, Speicherzuteilungen, E/A und andere Statistiken. Weitere Informationen finden Sie unter sys.dm_resource_governor_resource_pools.

Die folgende Abfrage gibt eine Teilmenge der verfügbaren Statistiken für alle Ressourcenpools zurück:

SELECT rp.pool_id,
       rp.name AS resource_pool_name,
       wg.workload_group_count,
       rp.statistics_start_time,
       rp.total_cpu_usage_ms,
       rp.target_memory_kb,
       rp.used_memory_kb,
       rp.out_of_memory_count,
       rp.active_memgrant_count,
       rp.total_memgrant_count,
       rp.total_memgrant_timeout_count,
       rp.read_io_completed_total,
       rp.write_io_completed_total,
       rp.read_bytes_total,
       rp.write_bytes_total,
       rp.read_io_stall_total_ms,
       rp.write_io_stall_total_ms
FROM sys.dm_resource_governor_resource_pools AS rp
OUTER APPLY (
            SELECT COUNT(1) AS workload_group_count
            FROM sys.dm_resource_governor_workload_groups AS wg
            WHERE wg.pool_id = rp.pool_id
            ) AS wg;

Arbeitsauslastungsgruppen-Laufzeitstatistiken

Für jede Workloadgruppe verfolgt der Ressourcen-Governor die CPU-Zeit, die Anzahl der Anforderungen, blockierte Aufgaben, Sperrwartezeit, Abfrageoptimierungen und andere Statistiken. Weitere Informationen finden Sie unter sys.resource_governor_workload_groups.

Die folgende Abfrage gibt eine Teilmenge der verfügbaren Statistiken für alle Workloadgruppen zurück:

SELECT wg.name AS workload_group_name,
       rp.name AS resource_pool_name,
       wg.statistics_start_time,
       wg.total_request_count,
       wg.total_cpu_usage_ms,
       wg.blocked_task_count,
       wg.total_lock_wait_time_ms,
       wg.total_query_optimization_count,
       wg.max_request_grant_memory_kb,
       wg.active_parallel_thread_count,
       wg.effective_max_dop,
       wg.request_max_memory_grant_percent_numeric
FROM sys.dm_resource_governor_workload_groups AS wg
INNER JOIN sys.dm_resource_governor_resource_pools AS rp
ON wg.pool_id = rp.pool_id

Aggregieren von Sitzungen nach Workloadgruppen- und Sitzungsattributen

Die folgende Abfrage gibt eine Verteilung von Sitzungen über Workloadgruppen hinweg und aggregierte Sitzungsstatistiken für jede Workloadgruppe zurück.

Eine hohe Anzahl von Sitzungen mit dem preconnect Status kann auf langsame Ausführung der Klassifizierer hinweisen.

SELECT wg.name AS workload_group_name,
       rp.name AS resource_pool_name,
       s.program_name AS application_name,
       s.login_name,
       s.host_name,
       s.status,
       d.name AS database_name,
       MIN(s.login_time) AS first_login_time,
       MAX(s.login_time) AS last_login_time,
       MAX(s.last_request_start_time) AS last_request_start_time,
       COUNT(1) AS session_count
FROM sys.dm_exec_sessions AS s
INNER JOIN sys.dm_resource_governor_workload_groups AS wg
ON s.group_id = wg.group_id
INNER JOIN sys.dm_resource_governor_resource_pools AS rp
ON wg.pool_id = rp.pool_id
INNER JOIN sys.databases AS d
ON s.database_id = d.database_id
GROUP BY wg.name,
         rp.name,
         s.program_name,
         s.login_name,
         s.host_name,
         s.status,
         d.name;

Aggregieren von Anforderungen nach Workloadgruppe und Anforderungsattributen

Die folgende Abfrage gibt eine Verteilung von Anforderungen über Workloadgruppen hinweg und aggregierte Anforderungsstatistiken für jede Workloadgruppe zurück:

SELECT wg.name AS workload_group_name,
       rp.name AS resource_pool_name,
       r.command,
       r.status,
       d.name AS database_name,
       COUNT(1) AS request_count,
       MIN(r.start_time) AS first_request_start_time,
       MAX(r.start_time) AS last_request_start_time,
       SUM(CAST(r.total_elapsed_time AS bigint)) AS total_elapsed_time_ms
FROM sys.dm_exec_requests AS r
INNER JOIN sys.dm_resource_governor_workload_groups AS wg
ON r.group_id = wg.group_id
INNER JOIN sys.dm_resource_governor_resource_pools AS rp
ON wg.pool_id = rp.pool_id
INNER JOIN sys.databases AS d
ON r.database_id = d.database_id
GROUP BY wg.name,
         rp.name,
         r.command,
         r.status,
         d.name;

Bewährte Methoden für den Ressourcen-Manager

  • Konfigurieren Sie dedizierte Administratorverbindung (Dedicated Administrator Connection, DAC), und erfahren Sie, wie Sie sie verwenden. Weitere Informationen finden Sie unter Diagnoseverbindung für Datenbankadministratoren. Wenn Ihre Ressourcensteuerungskonfiguration Fehlfunktionen hat, können Sie DAC verwenden, um sie zu beheben oder die Ressourcensteuerung zu deaktivieren.

  • Achten Sie beim Konfigurieren von Ressourcenpools darauf, große Werte für MIN_CPU_PERCENT, MIN_MEMORY_PERCENT und MIN_IOPS_PER_VOLUME anzugeben. Eine MIN Konfigurationseinstellung reserviert Ressourcen für einen Ressourcenpool und macht sie für andere Ressourcenpools, einschließlich des default Pools, nicht verfügbar. Weitere Informationen finden Sie unter Erstellen eines Ressourcenpools.

  • Die Klassifiziererfunktion erweitert die Anmeldeverarbeitungszeit. Vermeiden Sie komplexe Logik und lange ausgeführte oder ressourcenintensive Abfragen im Klassifizierer, insbesondere, wenn Abfragen große Tabellen verwenden. Eine übermäßig komplexe Funktion kann zu Anmeldeverzögerungen oder Verbindungstimeouts führen.

  • Wenn Sie im Klassifizierer eine Tabelle verwenden müssen und diese Tabelle klein und hauptsächlich statisch ist, sollten Sie stattdessen einen tabellenwertiger Konstruktor verwenden, wie in einem Beispiel weiter oben in diesem Artikel gezeigt.

  • Vermeiden Sie die Verwendung einer häufig geänderten Tabelle im Klassifizierer. Dies erhöht das Risiko, Blockierungen zu verursachen, die Anmeldungen verzögern und Verbindungstimeouts verursachen können. Die folgenden Problemumgehungen können das Risiko mindern, haben jedoch Nachteile, einschließlich des Risikos einer falschen Klassifizierung:

    • Erwägen Sie die Verwendung des NOLOCK Tabellenhinweiss oder des entsprechenden READUNCOMMITTED Hinweises. Weitere Informationen finden Sie unter READUNCOMMITTED.
    • Erwägen Sie die Verwendung der LOCK_TIMEOUT Einstellung am Anfang der Klassifiziererfunktion, indem Sie sie auf einen niedrigen Wert festlegen, z. B. 1.000 Millisekunden. Weitere Informationen finden Sie unter SET LOCK_TIMEOUT.
  • Wenn Sie ALTER RESOURCE GOVERNOR RECONFIGURE nach dem Löschen eines nicht verwendeten Ressourcenpools auf einem Computer mit viel Arbeitsspeicher ausführen, kann der Befehl lange dauern. Wenn eine Klassifizierungsfunktion aktiv ist, bevor die Konfiguration neu gestartet wird, können neue Verbindungsversuche, die in diesem Zeitraum unternommen werden, abbrechen.

    Wenn Sie einen nicht verwendeten Ressourcenpool löschen, wird empfohlen, die Ressourcenkontrolle während eines Wartungsfensters oder einen Zeitraum mit geringer Aktivität neu zu konfigurieren.

  • Sie können eine Klassifiziererfunktion nicht ändern, während sie in der Ressourcenverwaltungskonfiguration referenziert wird. Sie können die Konfiguration jedoch so ändern, dass eine andere Klassifiziererfunktion verwendet wird. Wenn Sie Änderungen am Klassifizierer vornehmen möchten, sollten Sie ein Paar Klassifiziererfunktionen erstellen. Sie können z. B. erstellen dbo.rg_classifier_A() und dbo.rg_classifier_B(). Wenn eine Änderung an der Klassifiziererlogik erforderlich ist, führen Sie die folgenden Schritte aus:

    1. Verwenden Sie die ALTER FUNCTION-Anweisung , um die Änderungen an der Funktion vorzunehmen, die derzeit nicht in der Konfiguration der Ressourcenkontrolle verwendet wird.
    2. Verwenden Sie die ALTER RESOURCE GOVERNOR-Anweisung , um den geänderten Klassifizierer aktiv zu machen, und konfigurieren Sie dann die Ressourcenkontrolle neu. Beispiel:
      ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier_B);
      ALTER RESOURCE GOVERNOR RECONFIGURE;
      
    3. Wenn eine Änderung erneut erforderlich ist, führen Sie dieselben Schritte mit der anderen Funktion aus (dbo.rg_classifier_A()).
  • Die Konfiguration der Ressourcenkontrolle wird in der master Datenbank gespeichert. Stellen Sie sicher, dass Sie master regelmäßig sichern, und wissen, wie Sie es wiederherstellen. Weitere Informationen finden Sie unter Sichern und Wiederherstellen: Systemdatenbanken. Da es Einschränkungen beim Wiederherstellen mastergibt, empfiehlt es sich, auch eine Kopie der Konfigurationsskripts für Ressourcenkontrolle separat zu speichern. Sie können die Konfiguration der Ressourcenkontrolle aus Skripts neu erstellen, wenn die master Datenbank neu erstellt werden muss.