Samouczek: przykłady konfiguracji zarządcy zasobów i najlepsze rozwiązania

Dotyczy:SQL ServerAzure SQL Managed Instance

Ten artykuł zawiera przykłady przewodników, które ułatwiają skonfigurowanie zarządcy zasobów i sprawdzenie, czy konfiguracja działa zgodnie z oczekiwaniami. Zaczyna się od prostego przykładu i przechodzi do bardziej złożonych.

Artykuł zawiera również przykłady zapytań monitorowania zarządcy zasobów i listę najlepszych rozwiązań zarządcy zasobów.

We wszystkich przykładach założono, że początkowo zarządca zasobów jest wyłączony i używa ustawień domyślnych oraz że nie istnieją żadne funkcje klasyfikatora, a także pule zasobów zdefiniowanych przez użytkownika, grupy obciążeń i klasyfikator.

Note

Aby zmodyfikować konfigurację zarządcy zasobów w usłudze Azure SQL Managed Instance, musisz być w kontekście bazy danych master w replice podstawowej.

Modyfikowanie grupy domyślnej

W tym przykładzie użyto zarządcy zasobów, aby ograniczyć maksymalny rozmiar przydziału pamięci dla wszystkich zapytań użytkownika. Odbywa się to przez zmniejszenie ustawienia REQUEST_MAX_MEMORY_GRANT_PERCENT dla grupy obciążeń default z domyślnych 25% do 10%. W przykładzie nie jest używana funkcja klasyfikatora. Oznacza to, że nie ma to wpływu na przetwarzanie logowania, a wszystkie sesje użytkowników będą nadal klasyfikowane w default grupie obciążeń.

Może być konieczne ograniczenie wielkości przydziałów pamięci, jeśli zapytania oczekują na pamięć, ponieważ inne zapytania zarezerwowały jej zbyt dużo. Aby uzyskać więcej informacji, zobacz Rozwiązywanie problemów z niską wydajnością lub małą ilością pamięci spowodowanych przez przydziały pamięci w SQL Server.

  1. Zmodyfikuj domyślną grupę obciążeń.

    ALTER WORKLOAD GROUP [default] WITH (REQUEST_MAX_MEMORY_GRANT_PERCENT = 10);
    
  2. Włącz zarządcę zasobów, aby nasza konfiguracja obowiązywała.

    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
  3. Zweryfikuj nowe ustawienie, w tym nowy maksymalny rozmiar przydziału pamięci.

    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. Aby przywrócić początkową konfigurację, wykonaj następujący skrypt:

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

Używanie grupy obciążeń zdefiniowanej przez użytkownika

W tym przykładzie użyto zarządcy zasobów, aby upewnić się, że wszystkie żądania dotyczące sesji o określonej nazwie aplikacji nie są wykonywane z stopniem równoległości (DOP) wyższym niż cztery. Odbywa się to poprzez przypisanie sesji do grupy obciążeń z ustawieniem MAX_DOP ustawionym na 4.

Aby uzyskać więcej informacji na temat konfigurowania maksymalnego stopnia równoległości, zobacz Konfiguracja serwera: maksymalny stopień równoległości.

  1. Utwórz grupę obciążenia, która ogranicza DOP. Grupa używa puli zasobów default, ponieważ chcemy ograniczyć współczynnik DOP tylko dla konkretnej aplikacji, ale nie rezerwować ani nie ograniczać zasobów procesora, pamięci ani we/wy.

    CREATE WORKLOAD GROUP limit_dop
    WITH (
         MAX_DOP = 4
         )
    USING [default];
    
  2. Utwórz funkcję klasyfikatora. Funkcja używa wbudowanej funkcji APP_NAME() w celu określenia nazwy aplikacji określonej w parametry połączenia klienta. Jeśli nazwa aplikacji jest ustawiona na limited_dop_application, funkcja zwraca nazwę grupy obciążenia, która ogranicza DOP. W przeciwnym razie funkcja zwraca default jako nazwę grupy obciążenia.

    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. Zmodyfikuj konfigurację zarządcy zasobów, aby nasza konfiguracja stanie się skuteczna i włączyć zarządcę zasobów.

    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier);
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
  4. Wykonaj zapytanie sys.resource_governor_configuration w celu sprawdzenia, czy zarządca zasobów jest włączony i używa utworzonej funkcji klasyfikatora.

    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. Sprawdź, czy sesje o określonej nazwie aplikacji są klasyfikowane w limit_dop grupie obciążeń, podczas gdy inne sesje będą nadal klasyfikowane w default grupie obciążeń. Użyjemy zapytania, w którym używane są widoki systemowe sys.dm_exec_sessions i sys.resource_governor_workload_groups, aby zwrócić nazwę aplikacji i nazwę grupy obciążenia dla bieżącej sesji.

    1. W programie SQL Server Management Studio (SSMS) wybierz pozycję Plik w menu głównym, Nowy, Zapytanie silnika bazy danych.

    2. W oknie Połącz z Database Engine wskaż to samo wystąpienie silnika bazy danych, w którym wcześniej utworzono grupę obciążeń i funkcję klasyfikatora. Wybierz kartę Dodatkowe parametry połączenia , a następnie wprowadź wartość App=limited_dop_application. To powoduje, że SSMS używa limited_dop_application jako nazwy aplikacji podczas łączenia się z wystąpieniem.

    3. Wybierz pozycję Połącz, aby otworzyć nowe połączenie.

    4. W tym samym oknie zapytania wykonaj następujące zapytanie:

      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;
      

      Powinny zostać wyświetlone następujące dane wyjściowe pokazujące, że sesja została sklasyfikowana w limit_dop grupie obciążeń z maksymalną wartością DOP ustawioną na cztery:

      application_name            workload_group_name     max_dop
      ----------------            -------------------     -------
      limited_dop_application     limit_dop               4
      
    5. Powtórz powyższe kroki, ale nie wpisuj niczego w polu na karcie Dodatkowe parametry połączenia. Wynik zmieni się, tak że będą wyświetlane domyślna nazwa aplikacji SSMS oraz grupa obciążeń default z domyślną wartością 0 dla maksymalnego stopnia równoległości.

      application_name                                    workload_group_name     max_dop
      ----------------                                    -------------------     -------
      Microsoft SQL Server Management Studio - Query      default                 0
      
  6. Aby przywrócić początkową konfigurację tego przykładu, odłącz wszystkie sesje przy użyciu limit_dop grupy obciążeń i wykonaj następujący skrypt języka T-SQL. Skrypt zawiera następujące kroki:

    1. Wyłącz zarządcę zasobów, aby można było porzucić funkcję klasyfikatora.
    2. Usuń grupę obciążeń. Wymaga to, aby żadna sesja nie korzystała z tej grupy obciążeń.
    3. Skonfiguruj ponownie zarządcę zasobów, aby ponownie załadować efektywną konfigurację bez funkcji klasyfikatora i grupy obciążeń. Umożliwia to zarządcę zasobów.
    4. Wyłącz zarządcę zasobów, aby przywrócić początkową konfigurację.
    /* 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;
    

Używanie wielu pul zasobów i grup obciążeń

W tym przykładzie użyto zarządcy zasobów do klasyfikowania sesji z aplikacji przetwarzania zamówień do różnych grup obciążeń i pul zasobów w zależności od pory dnia. Ta konfiguracja przydziela więcej zasobów do aplikacji w godzinach szczytu przetwarzania i ogranicza zasoby poza godzinami pracy. W przykładzie przyjęto założenie, że aplikacja nie używa długotrwałych sesji.

  1. Utwórz dwie pule zasobów na potrzeby przetwarzania godzin szczytu i godzin wolnych.

    • Pula peak_hours_pool gwarantuje (rezerwuje) co najmniej 20% średniej przepustowości procesora za pomocą MIN_CPU_PERCENT i nie ogranicza przepustowości procesora przez ustawienie MAX_CPU_PERCENT na 100.
    • Pula off_hours_pool nie rezerwuje żadnej przepustowości procesora przez ustawienie MIN_CPU_PERCENT na 0, ale ogranicza przepustowość procesora do 50%, gdy występuje rywalizacja o zasoby procesora, przez ustawienie MAX_CPU_PERCENT na 50.
    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
         );
    

    Pule zasobów mogą rezerwować i ograniczać zasoby systemowe, takie jak procesor, pamięć i we/wy. Aby uzyskać więcej informacji, zobacz CREATE RESOURCE POOL.

  2. Utwórz dwie grupy obciążeń, po jednym dla każdej puli zasobów.

    • Parametr peak_hours_group nie ogranicza liczby współbieżnych żądań przez ustawienie GROUP_MAX_REQUESTS wartości domyślnej .0
    • off_hours_group ogranicza liczbę współbieżnych żądań we wszystkich sesjach sklasyfikowanych do tej grupy przez ustawienie parametru GROUP_MAX_REQUESTS na 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;
    

    Grupy obciążeń definiują zasady, takie jak maksymalna liczba żądań, maksymalny stopień równoległości i maksymalny rozmiar przydziału pamięci. Aby uzyskać więcej informacji, zobacz CREATE WORKLOAD GROUP.

  3. Utwórz i wypełnij tabelę, która definiuje interwały czasu szczytu i godzin wolnych.

    • Każdy wiersz w tabeli definiuje godzinę rozpoczęcia i zakończenia interwału oraz nazwę grupy obciążeń do użycia w interwale.
    • Czas rozpoczęcia i zakończenia każdego interwału jest włącznie.
    • Tabela jest tworzona w master bazie danych, aby mogła być używana w funkcji klasyfikatora powiązanego ze schematem.
    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. Utwórz funkcję klasyfikatora.

    • Dane w tabeli powinny zawierać jeden pasujący wiersz dla danej pory dnia. Jeśli dane naruszają tę regułę, funkcja zwraca default wartość jako nazwę grupy obciążeń.
    • Poniższa przykładowa funkcja zwraca default również, jeśli nazwa aplikacji zwrócona przez wbudowaną funkcję APP_NAME() jest niczym innym niż order_processing.
    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. Jest to krok opcjonalny. Zamiast tworzyć tabelę w master bazie danych, można użyć konstruktora wartości tabeli do zdefiniowania interwałów czasu bezpośrednio w funkcji klasyfikatora. Jest to zalecane podejście, gdy rozmiar danych jest mały, a kryteria funkcji klasyfikatora nie są często zmieniane. Oto przykład tego samego klasyfikatora wykorzystującego konstruktor tabelaryczny zamiast tabeli w master.

    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. Zmodyfikuj konfigurację zarządcy zasobów, aby nasza konfiguracja stanie się skuteczna i włączyć zarządcę zasobów.

    ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier);
    ALTER RESOURCE GOVERNOR RECONFIGURE;
    
  7. Sprawdź, czy zarządca zasobów jest włączony, używa określonej funkcji klasyfikatora i czy funkcja klasyfikatora działa zgodnie z oczekiwaniami, wykonując podobne kroki, jak w poprzednim przykładzie. Tym razem wprowadzamy App=order_processing na karcie Dodatkowe parametry połączenia w oknie dialogowym Łączenie programu SSMS, aby dopasować nazwę aplikacji do funkcji klasyfikatora. Wykonaj następujące zapytanie, aby określić nazwę aplikacji, grupę obciążeń, pulę zasobów oraz rezerwację procesora CPU i limit dla bieżącej sesji:

    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;
    

    Wyniki zależą od godziny dnia. Jeśli na przykład bieżąca godzina to 14:30, wynik pokazuje, że peak_hours_group i peak_hours_pool są używane:

    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. Aby przywrócić początkową konfigurację tego przykładu, odłącz wszystkie sesje przy użyciu peak_hours_group grup obciążeń i off_hours_group i wykonaj następujący skrypt języka T-SQL. Skrypt zawiera następujące kroki:

    1. Wyłącz zarządcę zasobów, aby można było porzucić funkcję klasyfikatora.
    2. Usuń grupy obciążeń. Wymaga to, aby żadne sesje nie używały tych grup obciążeń.
    3. Po usunięciu grup obciążeń usuń pule zasobów.
    4. Skonfiguruj ponownie zarządcę zasobów, aby ponownie załadować efektywną konfigurację bez funkcji klasyfikatora i grup obciążeń zdefiniowanych przez użytkownika i pul zasobów. Umożliwia to zarządcę zasobów.
    5. Wyłącz zarządcę zasobów, aby przywrócić początkową konfigurację.
    /* 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;
    

Monitorowanie zarządcy zasobów przy użyciu widoków systemowych

Przykładowe zapytania w tej sekcji pokazują, jak można monitorować statystyki i zachowanie zarządcy zasobów.

Statystyki zarządcy zasobów są skumulowane od czasu ostatniego ponownego uruchomienia serwera. Jeśli musisz zebrać statystyki począwszy od określonego czasu, możesz zresetować statystyki przy użyciu instrukcji ALTER RESOURCE GOVERNOR RESET STATISTICS .

Statystyki środowiska uruchomieniowego puli zasobów

Dla każdej puli zasobów zarządca zasobów śledzi wykorzystanie procesora i pamięci, zdarzenia związane z brakiem pamięci, przydziały pamięci, operacje we/wy i inne statystyki. Więcej informacji można znaleźć w sys.dm_resource_governor_resource_pools.

Następujące zapytanie zwraca podzbiór dostępnych statystyk dla wszystkich pul zasobów:

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;

Statystyki czasu wykonywania grupy obciążeń

Dla każdej grupy obciążeń zarządca zasobów śledzi czas procesora CPU, liczbę żądań, zablokowane zadania, czas oczekiwania na blokadę, optymalizacje zapytań i inne statystyki. Aby uzyskać więcej informacji, zobacz sys.resource_governor_workload_groups.

Następujące zapytanie zwraca podzestaw dostępnych statystyk dla wszystkich grup obciążeń:

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

Agregowanie sesji według atrybutów grupy obciążeń i sesji

Poniższe zapytanie zwraca dystrybucję sesji między grupami obciążeń i agregują statystyki sesji dla każdej grupy obciążeń.

Duża liczba sesji ze stanem preconnect może wskazywać na spowolnienie wykonywania klasyfikatora.

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;

Agregowanie żądań według grupy obciążeń i atrybutów żądania

Następujące zapytanie zwraca rozkład żądań między grupami obciążeń i agreguje statystyki żądań dla każdej grupy obciążeń:

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;

Najlepsze praktyki dotyczące zarządcy zasobów

  • Skonfiguruj dedykowane połączenie administratora (DAC) i dowiedz się, jak z niego korzystać. Aby uzyskać więcej informacji, zobacz Połączenie diagnostyczne dla administratorów bazy danych. Jeśli konfiguracja zarządcy zasobów nie działa, możesz użyć funkcji DAC, aby rozwiązać ten problem lub wyłączyć zarządcę zasobów.

  • Podczas konfigurowania pul zasobów należy zachować ostrożność przy określaniu dużych wartości dla MIN_CPU_PERCENT, MIN_MEMORY_PERCENT i MIN_IOPS_PER_VOLUME. Ustawienie konfiguracji MIN rezerwuje zasoby dla puli zasobów i sprawia, że są one niedostępne dla innych pul zasobów, w tym puli default. Aby uzyskać więcej informacji, zobacz Tworzenie puli zasobów.

  • Podobnie należy zachować ostrożność przy określaniu bardzo małych wartości parametrów MAX_CPU_PERCENT i CAP_CPU_PERCENT lub przy ustawianiu parametru MAX_IOPS_PER_VOLUME na wartość znacznie mniejszą, niż może zapewnić podsystem we/wy. Silnie ograniczone obciążenie korzystające z zasobów udostępnionych może mieć wpływ na inne obciążenia przy użyciu tych samych zasobów. Na przykład zapytanie ograniczane wydajnością CPU może utrzymywać blokady przez dłuższy czas i powodować długie łańcuchy blokowania. Obciążenie ograniczone przez operacje we/wy może dłużej utrzymywać zatrzaski na współdzielonych stronach systemowych, co skutkuje przekroczeniem limitu czasu oczekiwania na zatrzaski w przypadku innych obciążeń.

  • Funkcja klasyfikatora wydłuża czas przetwarzania logowania. Unikaj złożonej logiki oraz długotrwałych lub zasobochłonnych zapytań w klasyfikatorze, zwłaszcza jeśli odwołują się one do dużych tabel. Nadmiernie złożona funkcja może powodować opóźnienia logowania lub przekroczenia limitu czasu połączenia.

  • Jeśli musisz użyć tabeli w klasyfikatorze, a tabela jest mała i głównie statyczna, rozważ użycie konstruktora wartości tabeli , jak pokazano we wcześniejszej części tego artykułu.

  • Unikaj używania często modyfikowanej tabeli w klasyfikatorze. Zwiększa to ryzyko blokowania, które może opóźnić logowanie i spowodować przekroczenie limitu czasu połączenia. Następujące obejścia mogą ograniczyć ryzyko, jednak mają wady, w tym ryzyko nieprawidłowej klasyfikacji:

    • Rozważ użycie wskazówki tabeli NOLOCK lub równoważnej wskazówki READUNCOMMITTED. Aby uzyskać więcej informacji, zobacz READUNCOMMITTED.
    • Rozważ użycie LOCK_TIMEOUT ustawienia na początku funkcji klasyfikatora, ustawiając ją na niską wartość, taką jak 1000 milisekund. Aby uzyskać więcej informacji, zobacz SET LOCK_TIMEOUT.
  • Wykonanie polecenia ALTER RESOURCE GOVERNOR RECONFIGURE po usunięciu nieużywanej puli zasobów na maszynie z dużą ilością pamięci może zająć dużo czasu. Jeśli funkcja klasyfikująca obowiązuje, zanim rozpocznie się rekonfiguracja, nowe próby nawiązania połączenia podejmowane w tym czasie mogą zakończyć się przekroczeniem limitu czasu.

    Jeśli usuniesz nieużywaną pulę zasobów, zalecamy ponowne skonfigurowanie zarządcy zasobów w oknie obsługi lub okresie niskiej aktywności.

  • Nie można zmodyfikować funkcji klasyfikatora, gdy jest ona przywołyowana w konfiguracji zarządcy zasobów. Można jednak zmodyfikować konfigurację tak, aby korzystała z innej funkcji klasyfikatora. Jeśli chcesz wprowadzić zmiany w klasyfikatorze, rozważ utworzenie pary funkcji klasyfikatora. Możesz na przykład utworzyć elementy dbo.rg_classifier_A() i dbo.rg_classifier_B(). Jeśli wymagana jest zmiana logiki klasyfikatora, wykonaj następujące kroki:

    1. Użyj instrukcji ALTER FUNCTION , aby wprowadzić zmiany w funkcji , która nie jest obecnie używana w konfiguracji zarządcy zasobów.
    2. Użyj instrukcji ALTER RESOURCE GOVERNOR , aby uaktywnić zmodyfikowany klasyfikator, a następnie ponownie skonfigurować zarządcę zasobów. Przykład:
      ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = dbo.rg_classifier_B);
      ALTER RESOURCE GOVERNOR RECONFIGURE;
      
    3. Jeśli konieczna jest zmiana ponownie, wykonaj te same kroki, korzystając z innej funkcji (dbo.rg_classifier_A()).
  • Konfiguracja zarządcy zasobów jest przechowywana w master bazie danych. Pamiętaj, aby okresowo tworzyć kopie zapasowe masteri wiedzieć, jak je przywrócić. Aby uzyskać więcej informacji, zobacz Tworzenie kopii zapasowych i przywracanie: systemowe bazy danych. Ponieważ istnieją ograniczenia dotyczące przywracania master, zalecamy również osobne zapisanie kopii skryptów konfiguracji zarządcy zasobów. Konfigurację zarządcy zasobów można utworzyć ponownie za pomocą skryptów, jeśli master baza danych musi zostać ponownie skompilowana.