pirmdiena, 2012. gada 23. jūlijs

Resource Governor: CPU slodzes sadalīšana

Resource Governor nodrošina CPU slodzes un atmiņas sadalīšanu starp konekcijām (Enterprice un Developer redakciju fīča, kas pieejama sākot ar SQL Server 2008). Ideja tāda- Lietotājam pieslēdzoties SQL Server instancei, tas tiek iedalīts kādā grupā (Workload Group). Grupām ir definēta pieejamo resursu kopa (Resource Pool), ja sākas cīņa par resursiem, tad tiek piemēroti definētie ierobežojumi.

Šajā rakstā Resource Governor darbībā. Oarādīts, kā starp divām dažādām konkurējošām konekcijām tiek sadalīti CPU resursi. Šī ir tikai neliela daļa no iespējām, ko piedāvā Resource Governor.

[2012-07-31 papildināts ar saitēm]
Using the Resource Governor (SQL Server 2008)
Resource Governor in SQL Server 2012

Nepieciešamo objektu izveide
Uzmanību! Skriptus labi laist tikai tad, ja neesat sākuši izmantot Resource Governor.

Skriptā (zemāk) tiek veidoti sekojoši objekti:
  • Divi pieslēguma vārdi (izmantoti, lai klasificētu konekciju piederību resursu grupām)
  • Izdalītas divas resursu kopas, kur pateikts, ka lielas CPU noslodzes gadījumā- 
    • MyPool_1 kopai pienākas vismaz 20% CPU,
    • MyPool_2 kopai pienākas vismaz 80% CPU
  • Divas resursu grupas (katrā resursu kopā var tikt definētas vairākas grupas, šis ir ļoti vienkāršs gadījums):
    • MyWorkloadGroup_1 pieder MyPool_1
    • MyWorkloadGroup_2 pieder MyPool_2
  • Klasifikācijas funkcija, kas, katru konekciju klasificē pēc piederības kādai grupai. Konekcijas, kurām netiek definēta klasifikācija- tiek ievietotas "Default" resuru grupā.
  • Pieslēgta Resource Governor izmantošana.
Skripts:
USE [master]
GO
-- Create Test logins:
Create Login RG_Test_1 With Password = 'VeryStrongPWD';
Create Login RG_Test_2 With Password = 'VeryStrongPWD';
GO
-- RESOURCE POOLS
CREATE RESOURCE POOL [MyPool_1]
    WITH
    (
        min_cpu_percent=20,
        max_cpu_percent=100,
        min_memory_percent=0,
        max_memory_percent=100
    );
CREATE RESOURCE POOL [MyPool_2]
    WITH
    (
        min_cpu_percent=80,
        max_cpu_percent=100,
        min_memory_percent=0,
        max_memory_percent=100
    );
GO
-- WORKLOAD GROUPS
CREATE WORKLOAD GROUP [MyWorkloadGroup_1]
    WITH
    (
        group_max_requests=0,
        importance=Medium,
        request_max_cpu_time_sec=0,
        request_max_memory_grant_percent=25,
        request_memory_grant_timeout_sec=0,
        max_dop=0
    )
    USING [MyPool_1];
CREATE WORKLOAD GROUP [MyWorkloadGroup_2]
    WITH
    (
        group_max_requests=0,
        importance=Medium,
        request_max_cpu_time_sec=0,
        request_max_memory_grant_percent=25,
        request_memory_grant_timeout_sec=0,
        max_dop=0
    )
    USING [MyPool_2]
GO
-- Klasifikācijas funkcija
CREATE FUNCTION dbo.MyClassifierFunction()  
Returns sysname
With SchemaBinding
AS
BEGIN
    Declare @BelongsToGroup sysname;
    IF (SUSER_SNAME() = 'RG_Test_1')
        Set @BelongsToGroup = 'MyWorkloadGroup_1'; -- MyPool_1 (min 20%)
    IF (SUSER_SNAME() = 'RG_Test_2')
        Set @BelongsToGroup = 'MyWorkloadGroup_2'; -- MyPool_2 (min 80%)
    Return @BelongsToGroup;
END;
Go
-- Pieliekam Resource Governor funkciju un aktivizējam
ALTER RESOURCE GOVERNOR
    WITH
    (
        CLASSIFIER_FUNCTION= dbo.MyClassifierFunction
    );
ALTER RESOURCE GOVERNOR RECONFIGURE;
Go
Kā tas strādā
Kad ir izpildīts iepriekšējais skripts, tad Resource Governor uz konkrētās SQL Server instances jau strādā. Ja pie instances neslēdzas klāt lietotājs RG_Test_1 vai RG_Test_2, tad nekas nav mainījies.Visas konekcijas "iekrīt" noklusētajā grupā. Tās savā starpā cīnās par resursiem kā līdz šim.

Bet gribu nodemonstrēt darbību.

1. Pēc tam, kad izpildīts skrpits, Performance Monitor ir pieejamas izveidotās resursu grupas. Lai ilustrētu, izvēlos attiecīgo grupu CPU% noslodzi (start -> perfmon un tur pievieno skatiītājus):
 
2. Izmantojot agrāk aprakstīto SQL Server CPU slodzes simulācija pieslēdzos pie instances kā lietotājs RG_Test_1 un skatos, kas notiek ar CPU resursiem:

Kā redzams, tiek izmantots praktiski viss CPU.
Šeit Resource Governor vēl nav sācis nekādu darbu, jo uz resursiem nav konkurences. Tādēļ..

3. Izmantojot agrāk aprakstīto SQL Server CPU slodzes simulācija pieslēdzos pie instances kā lietotājs RG_Test_2 un skatos, kas notiek ar CPU resursiem:

Kā redzams, tagad Resource Governor ir sācis strādāt- lietotājams RG_Test_1 tiek iedalīti tam pienākošie 20% CPU un RG_Test_2- 80% CPU.

Arī vaicājumu izpildes laiks attiecīgi ir proporcionāls pieejamo resursu daudzumam!

Satīrīšanas darbi
Lai neatstātu aiz sevis pēdas, jāizpilda skripts:
 --Cleanup:
Use Master;
ALTER RESOURCE GOVERNOR
    WITH
    (
        CLASSIFIER_FUNCTION = NULL
    );
ALTER RESOURCE GOVERNOR RECONFIGURE;
ALTER RESOURCE GOVERNOR DISABLE;
Drop FUNCTION dbo.MyClassifierFunction;
Drop WORKLOAD GROUP MyWorkloadGroup_1;
Drop WORKLOAD GROUP MyWorkloadGroup_2;
Drop RESOURCE POOL MyPool_1;
Drop RESOURCE POOL MyPool_2;
Drop Login RG_Test_1;
Drop Login RG_Test_2;

Nav komentāru:

Ierakstīt komentāru