Teaduslik eksperiment, vÔi kuidas leida andmebaasi konfiguratsioon bÀnhmÀrkide ja optimeerimise algoritmide abil

Tere.

Otsustasin jagada oma leiutist — mĂ”tete, proovide ja vigade vilju.
Suures plaanis: see pole tegelikult leiutis, muidugi — see peaks olema ammu teada neile, kes tegelevaid rakenduslike andmetöötluse ja sĂŒsteemide optimeerimisega, mitte tingimata just andmebaasidega.
Ja: jah, nad teavad, kirjutavad huvitavaid artikleid oma uurimistööde kohta, an example (UPD.: kommentaarides viidati vÀga huvitavale projektile: ottertune )
Teisest kĂŒljest: mul ei tundu, et sarnast lĂ€henemist laialdaselt mainitakse vĂ”i levitatakse internetis it-spetsialistide, DBA-de seas.

Nii et, asja olemus.

Oletame, et meil on ĂŒlesanne: seadistada mingi teenindussĂŒsteem mingiks tööks.

Selle töö kohta on teada: milline see töö on, kuidas kvaliteeti mÔÔdetakse ja milline on selle kvaliteedi mÔÔtmise kriteerium.

Samuti oletame, et enam-vĂ€hem on teada, kuidas tööd teostatakse (vĂ”i selle teenindussĂŒsteemiga).

"Üks-kaks" tĂ€hendab, et on vĂ”imalus valmistada (vĂ”i kuskilt vĂ”tta) tööriist, utiliit vĂ”i teenus, millega saab sĂŒntiseerida ja testida sĂŒsteemi testkoormust, mis on piisavalt sarnane sellele, mis tootmises, piisavalt tĂ”husates tingimustes toimetamiseks.

Ja oletame, et on teada, millised on selle teenussĂŒsteemi kohandamisparameetrite komplektid, millega saab seda sĂŒsteemi konfigureerida, selle töö efektiivsuse osas.

Ja milles on probleem — ei ole piisavalt selget arusaama sellest teenussĂŒsteemist, mis vĂ”imaldab eksperdil seadistada sĂŒsteemi tulevase koormuse jaoks antud platvormil ja saavutada vajalik töö efektiivsus.

Noh. Nii see peaaegu alati on.

Mis siin teha saab.

Esiteks, mis pĂ€he tuleb: vaadata selle sĂŒsteemi dokumentatsiooni. MĂ”ista — millised on seal lubatud vahemikud kohandamisparameetrite vÀÀrtuste jaoks. Ja nĂ€iteks, koordinaatide langemise meetodil, sobitada sĂŒsteemi parameetrite vÀÀrtusi testides.

St. seada sĂŒsteemile mingisugune konfiguratsioon, konkreetse parameetrite vÀÀrtuste komplekti kujul.

Esitada testkoormust selle tööriista-utiliidi abil, koormuse generaatoriga.
Ja vaadata suurust — vastust, vĂ”i sĂŒsteemi töö kvaliteedi mÔÔdikut.

Teise mĂ”ttena vĂ”ib tekkida jĂ€reldus, et — see on ju vĂ€ga pikk protsess.

Nii et: kui seadeparameetreid on palju, kui nende vÀÀrtuste ulatus on suur, kui iga eraldi koormustest kestab kaua, siis: jah, see kÔik vÔib vÔtta vastuvÔetamatult palju aega.

Ja siin on, mida saab teada ja meeles pidada.

VĂ”ib teada saada seadeparameetrite vÀÀrtuste kogum — vektor, nagu mingite vÀÀrtuste jĂ€rjestus.

Iga sellise vektoriga, tingimusel et see vektor ei ole seotud, vastab tĂ€iesti mÀÀratud mÔÔdiku vÀÀrtus — sĂŒsteemi töö kvaliteedi nĂ€itaja katsekoormuse all.

St.

MĂ€rgime sĂŒsteemi konfiguratsiooni vektori kui Teaduslik eksperiment, vĂ”i kuidas leida andmebaasi konfiguratsioon bĂ€nhmĂ€rkide ja optimeerimise algoritmide abil, kus Teaduslik eksperiment, vĂ”i kuidas leida andmebaasi konfiguratsioon bĂ€nhmĂ€rkide ja optimeerimise algoritmide abil; Kus Teaduslik eksperiment, vĂ”i kuidas leida andmebaasi konfiguratsioon bĂ€nhmĂ€rkide ja optimeerimise algoritmide abil — konfiguratsiooni parameetrite arv, mitu neid parameetreid on.

Ja mÔÔdiku vÀÀrtus, mis vastab sellele Teaduslik eksperiment, vÔi kuidas leida andmebaasi konfiguratsioon bÀnhmÀrkide ja optimeerimise algoritmide abil mÀÀrame kui
Teaduslik eksperiment, vÔi kuidas leida andmebaasi konfiguratsioon bÀnhmÀrkide ja optimeerimise algoritmide abil, siis saame funktsiooni: Teaduslik eksperiment, vÔi kuidas leida andmebaasi konfiguratsioon bÀnhmÀrkide ja optimeerimise algoritmide abil

Nii et, siis: kĂ”ik vĂ€hendatakse kohe selle juurde, minu puhul: peaaegu unustatud ĂŒlikoolipingilt, funktsiooni ekstreemumi otsimise algoritmid.

Hea, aga siin tekib organisatsiooniline ja praktiline kĂŒsimus: millist algoritmi kasutada.

  1. MĂ”ttes — et ei peaks ise liiga palju kĂ€sitsi kodeerima.
  2. Ja et see töötaks, st leiaks ekstreemi (kui see olemas on), vÀhemalt kiiremini kui koordinaatide allaminek.

Esimene punkt viitab sellele, et tuleks vaadata mingite keskkondade poole, kus sellised algoritmid on juba realiseeritud ja olemas, mingil kujul, kasutamiseks valmis koodis.
Noh, mulle on teada python ja cran-r

Teine punkt tÀhendab, et tuleks lugeda tegelikult algoritmide kohta, millised need on, millised on nende nÔudmised, tööeripÀrad.

Ja mida nad pakuvad, vÔivad olla kasulikud kÔrvalmÔjud-tulemused, kas otse algoritmist.

VÔi neid saab saada algoritmi töö tulemustest.

Siin sÔltub palju sisetingimustest.

NÀiteks, kui mingitel pÔhjustel, tuleb tulemust kiiremini saada, siis tuleb vaadata gradiente allamÀge algoritmide poole, valida mÔni nende hulgast.

VÔi, kui aeg pole nii oluline, vÔib nÀiteks kasutada stohhastilise optimeerimise meetodeid, nÀiteks geneetilist algoritmi.

Pakun kaaluda sellise lĂ€henemise tööd, sĂŒsteemi konfiguratsiooni valimiseks geneetilise algoritmi kasutamisega jĂ€rgmise, ĂŒtleme nii: laboritöö kĂ€igus.

Algandmed:

  1. Oletame, et teenindussĂŒsteemiks on: oracle xe 18c
  2. Oletame, et see teenindab tehingu aktiivsust ja eesmÀrk on saavutada vÔimalikult suur subd lÀbilaskevÔime tehingute/s.
  3. Tehingud vÔivad olla vÀga erinevad oma andmete töötlemise ja konteksti poolest.
    Lepinguga lepime kokku, et need on tehingud, mis ei töötle suurt hulka tabeli andmeid.
    Selles mÔttes, et nad ei genereeri undo-andmeid rohkem kui redo ja ei töödelda suuri protsente ridade, suurte tabelite kohta.

Need on tehingud, mis muudavad ĂŒhte rida enam-vĂ€hem suurtes tabelites, millel on vĂ€ike arv indekseid selle tabeli kohal.

Sel juhul mÀÀrab subd toimetuleku kvaliteet tehingute töötlemisel redo-andmete baasi kvaliteet.

MĂ€rkus — kui rÀÀkida just andmebaasi seadistustest.

Sest ĂŒldiselt vĂ”ivad nĂ€iteks olla tehingute lukustused, skaneerimise sessioonide vahel, kasutajate töötamise disaini tĂ”ttu tabeliandmetega ja/vĂ”i tabelimudelitega.

Need on kindlasti koormavad tps-mÔÔdikule ja see on eksogeenne, subd suhtes, tegur: nii on loodud tabelimudel ja töö nende andmetega, et tekivad lukustused.

SeetÔttu, eksperimentaalse puhtuse nimel, vÀlistame selle teguri, allpool tÀpsustan, kuidas tÀpselt.

  1. Oletame, et selguse mÔttes, et 100% subd-le esitatavatest SQL-kÀskudest on DML-kÀskude.
    Oletame, et kasutaja töö omadused subd-ga on samad, testides.
    Kaasaarvatud: SQL-seansside arv, tabeliandmed, kuidas SQL-seansid nende andmetega töötavad.
  2. Subd töötab jĂ€rgnevates FORCE LOGGING, ARCHIVELOG reĆŸiimides. Flashback-andmebaasi reĆŸiim on subd tasemel vĂ€lja lĂŒlitatud.
  3. Redo-logid: asuvad eraldi failisĂŒsteemis, eraldi "ketas";
    Kogu ĂŒlejÀÀnud fĂŒĂŒsiline komponent andmebaasis asub teises, eraldi failisĂŒsteemis, eraldi "ketas":

Rohkem teavet labori andmebaasi fĂŒĂŒsilise komponendi ĂŒlesehituse kohta

SQL> select status||' '||name from v$controlfile;
 /db/u14/oradata/XE/control01.ctl
SQL> select GROUP#||' '||MEMBER from v$logfile;
1 /db/u02/oradata/XE/redo01_01.log
2 /db/u02/oradata/XE/redo02_01.log
SQL> select FILE_ID||' '||TABLESPACE_NAME||' '||round(BYTES/1024/1024,2)||' '||FILE_NAME as col from dba_data_files;
4 UNDOTBS1 2208 /db/u14/oradata/XE/undotbs1_01.dbf
2 SLOB 128 /db/u14/oradata/XE/slob01.dbf
7 USERS 5 /db/u14/oradata/XE/users01.dbf
1 SYSTEM 860 /db/u14/oradata/XE/system01.dbf
3 SYSAUX 550 /db/u14/oradata/XE/sysaux01.dbf
5 MONITOR 128 /db/u14/oradata/XE/monitor.dbf
SQL> !cat /proc/mounts | egrep "/db/u[0-2]"
/dev/vda1 /db/u14 ext4 rw,noatime,nodiratime,data=ordered 0 0
/dev/mapper/vgsys-ora_redo /db/u02 xfs rw,noatime,nodiratime,attr2,nobarrier,inode64,logbsize=256k,noquota 0 0

Alguses tahtsin nende koormustingimuste korral kasutada SQL-t SLOB-utiliid
Sellel on ĂŒks suurepĂ€rane omadus, ma tsiteerin autorit:

SLOB-i tuum on 'SLOB meetod'. SLOB meetod on mÔeldud platvormide testimiseks
rakenduse konfliktita. Maksimaalset riistvara jÔudlust ei saa saavutada
rakendusgraafikus, mis on nÀiteks piiratud rakenduse lukustamisega vÔi isegi
Oracle Database plokkide jagamisega. Just nii — andmete jagamisel on
plokkides teil on ĂŒlejÀÀk! Kuid SLOB — oma vaikimisi kasutuses — on sellsest konfliktist immuunne.

See deklaratsioon: vastab, nii see on.
Mugav on reguleerida SQL-seansside paralleelsuse taset, see on vÔtmes -t SLOB utiliidi runit.sh osades
Reguleeritakse DML-kÀskude protsent, selles hulk SQL-e, mida saadetakse DB-le, iga SQL-seanss, parameeter UPDATE_PCT
Erakordselt ja vĂ€ga mugavalt: SLOB ise, koormuse seansi eel ja jĂ€rel — valmistab ette statspakke vĂ”i AWR-snapshote (kuidas on ette nĂ€htud).

Kuid selgus, et SLOB ei toeta SKL-seansside töötlust, kui nende kestus on vÀhem kui 30 sekundit.
SeetÔttu kodeerisin alguses oma, töölisklassi variandi koormajast ja see jÀi tööle.

Selgitan koormaja kohta — mida ja kuidas ta teeb, et selgem oleks.
PÔhimÔtteliselt nÀeb koormaja vÀlja selline:

Töölise kood

function dotx()
{
local v_period="$2"
[ -z "v_period" ] && v_period="0"
source "/home/oracle/testingredotracĐ”/config.conf"

$ORACLE_HOME/bin/sqlplus -S system/${v_system_pwd} << __EOF__
whenever sqlerror exit failure
set verify off
set echo off
set feedback off

define wnum="$1"
define period="$v_period"
set appinfo worker_&&wnum

declare
 v_upto number;
 v_key  number;
 v_tots number;
 v_cts  number;
begin
 select max(col1) into v_upto from system.testtab_&&wnum;
 SELECT (( SYSDATE - DATE '1970-01-01' ) * 86400 ) into v_cts FROM DUAL;
 v_tots := &&period + v_cts;
 while v_cts <= v_tots
 loop
  v_key:=abs(mod(dbms_random.random,v_upto));
  if v_key=0 then
   v_key:=1;
  end if;
  update system.testtab_&&wnum t
  set t.object_name=translate(dbms_random.string('a', 120), 'abcXYZ', '158249')
  where t.col1=v_key
  ;
  commit;
  SELECT (( SYSDATE - DATE '1970-01-01' ) * 86400 ) into v_cts FROM DUAL;
 end loop;
end;
/

exit
__EOF__
}
export -f dotx

Töölisi kÀivitakse jÀrgmiselt:

Tööliste kÀivitamine

echo "testi alustamine, kestus: ${TEST_DURATION}" >> "$v_logfile"
for((i=1;i> "$v_logfile"
 dotx "$i" "${TEST_DURATION}" &
done
echo "ootamine..." >> "$v_logfile"
wait

Ja töötajate tabelid valmistatakse nii:

Tabelite loomine

function createtable() {
source "/home/oracle/testingredotracĐ”/config.conf"
$ORACLE_HOME/bin/sqlplus -S system/${v_system_pwd} << __EOF__
whenever sqlerror continue
set verify off
set echo off
set feedback off

define wnum="$1"
define ts_name="slob"

begin
 execute immediate 'drop table system.testtab_&&wnum';
exception when others then null;
end;
/

create table system.testtab_&&wnum tablespace &&ts_name as
select rownum as col1, t.*
from sys.dba_objects t
where rownum> "$v_logfile"

K.a. iga töötaja jaoks (praktiliselt: eraldi SQL-seanss andmebaasis) luuakse eraldi tabel, millega töötaja töötab.

Sellega saavutatakse, et andmebaasi seansside vahel ei esine tehingulisi lukustusi.
Iga töötaja: teeb sama, oma tabeliga, kÔik tabelid on samad.
Töötajad kĂ”ik — teevad tööd sama palju aega.
Ja see tÀhendas, et nÀiteks vÔttis aega, et tÀpselt juhtuda, ja see ei olnud ainus kord, kui logivahetus toimus.
Sellega seoses tekkisid kÔnealused kulud ja mÔjud.
Minu puhul - töötajate töö kestus kujunes 8 minutiks.

Statspaki aruande lÔik, millel on kirjeldus andmebaasi töö kohta koormuse all.

Andmebaas    DB Id    Instants        Inst Num  KĂ€ivitamise aeg   VĂ€ljalase     RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
          2929910313 XE                  1 07-sep-20 23:12 18.0.0.0.0  EI

Hosti nimi             Platvorm                CPUd SĂŒdamikud Pesad   MĂ€lu (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
     billing.izhevsk1 Linux x86 64-bit           2     2       1         15.6

Snapshoot       Snap Id     Snap Aeg      Sessioonid Curs/Sess Kommentaar
~~~~~~~~    ---------- ------------------ -------- --------- ------------------
Algus Snap:       1630 07-sep-20 23:12:27       55        .7
  LÔpp Snap:       1631 07-sep-20 23:20:29       62        .6
   Möödunud:       8.03 (min) Keskmine aktiivne sess:       8.4
   DB aeg:      67.31 (min)      DB CPU:      15.01 (min)

VahemÀlu suurused            Algus        LÔpp
~~~~~~~~~~~       ---------- ----------
    PuhversĂŒĆŸee:     1,392M              Std ploki suurus:         8K
     Jagatud bassein:       288M                  Logi vahemÀlu:   103,424K

Koormusprofiil              Sekundi kohta    Tehingu kohta    Üksuse kohta    KĂ”ne kohta
~~~~~~~~~~~~      ------------------  ----------------- ----------- -----------
      DB aeg(s):                8.4                0.0        0.00        0.20
       DB CPU(s):                1.9                0.0        0.00        0.04
       Uuendamise suurus:        7,685,765.6              978.4
   Loogilised lugemised:           60,447.0                7.7
   Bloki muutused:           47,167.3                6.0
  FĂŒĂŒsilised lugemised:                8.3                0.0
 FĂŒĂŒsilised kirjutised:              253.4                0.0
      Kasutajakutsed:               42.6                0.0
          Töötlemised:               23.2                0.0
     TÔsised töötlemised:                1.2                0.0
W/A MB töödeldud:                1.0                0.0
          Logimine:                0.5                0.0
        TĂ€itmine:           15,756.5                2.0
       TagasitÔmbamised:                0.0                0.0
    Tehingud:            7,855.1

Tagasi laboratoorsete tööde seadmise juurde.
Vaatame, vÔrdselt teistega, kuidas varieeruda labori andmebaasi parameetrite vÀÀrtustes:

  1. Logigrupi suurus. vÀÀrtuste vahemik: [32, 1024] MB;
  2. Logigruppide arv. vÀÀrtuste vahemik: [2,32];
  3. log_archive_max_processes vÀÀrtuste vahemik: [1,8];
  4. commit_logging lubatakse kahte vÀÀrtust: batch|immediate;
  5. commit_wait lubatakse kahte vÀÀrtust: wait|nowait;
  6. log_buffer vÀÀrtuste vahemik: [2,128] MB.
  7. log_checkpoint_timeout vÀÀrtuste vahemik: [60,1200] sekundit
  8. db_writer_processes vÀÀrtuste vahemik: [1,4]
  9. undo_retention vÀÀrtuste vahemik: [30;300] sekundit
  10. transactions_per_rollback_segment vÀÀrtuste vahemik: [1,8]
  11. disk_asynch_io lubatakse kahte vÀÀrtust: true|false;
  12. filesystemio_options lubatakse jÀrgmisi vÀÀrtusi: none|setall|directIO|asynch;
  13. db_block_checking lubatakse jÀrgmisi vÀÀrtusi: OFF|LOW|MEDIUM|FULL;
  14. db_block_checksum lubatakse jÀrgmisi vÀÀrtusi: OFF|TYPICAL|FULL;

Inimene, kellel on kogemusi oracle andmebaaside hooldamisel, vĂ”ib kindlasti juba öelda, milliseid ja milliseid vÀÀrtusi tuleks mÀÀrata, et saavutada suurem tootlikkus andmebaasis, selle andmetöötluse jaoks, mida esindab siin ĂŒlalmainitud rakenduskood.

Aga.

Laboratoorse töö eesmÀrk on nÀidata, et optimeerimisalgoritm tÀpsustab meid kiiresti.

Meile jÀÀb vaid vaadata dokumenti, mille kohta saab kohandatud sĂŒsteemi seadistada nii palju, kui vaja, et selgitada vĂ€lja, milliseid parameetreid ja millistes vahemikes muuta.
Samuti tuleb kirjutada kood, millega rakendatakse valitud optimeerimisalgoritmi kohandatud sĂŒsteemiga töötamine.

Nii et nĂŒĂŒd koodist.
Ülalpool rÀÀkisin cran-r, st: kĂ”ik kohandatud sĂŒsteemiga seotud toimingud orkestreeritakse R-skripti kujul.

Tegelik ĂŒlesanne, analĂŒĂŒs, mÔÔdikute vÀÀrtuste ja sĂŒsteemi oleku vektorite valik: see on pakett GA (dokumentatsioon)
Pakett ei sobi siinkohal eriti hÀsti, kuna see ootab vektorite (hromosoomide, kui kasutada paketi termineid) mÀÀratlemiseks reaalses arvude komaga esitlemist.

Kuid minu vektor, seadistamisparameetrite vÀÀrtustest, on 14 suurust – tĂ€isarvud ja stringivÀÀrtused.

Probleemi saab muidugi kergesti vÀltida, mÀÀrates stringivÀÀrtustele mÔningad kindlad nummer.

Seega nÀeb R-skripti peamine osa vÀlja nii:

Kutse GA::ga

cat( "", file=v_logfile, sep="n", append=F)

pSize = 10
elitism_value=1
pmutation_coef=0.8
pcrossover_coef=0.1
iterations=50

gam=GA::ga(type="real-valued", fitness=evaluate,
lower=c(32,2, 1,1,1,2,60,1,30,1,0,0, 0,0), upper=c(1024,32, 8,10,10,128,800,4,300,8,10,40, 40,30),
popSize=pSize,
pcrossover = pcrossover_coef,
pmutation = pmutation_coef,
maxiter=iterations,
run=4,
keepBest=T)
cat( "GA-session is done" , file=v_logfile, sep="n", append=T)
gam@solution

Siin, kasutades madalam ja ĂŒlemine alamprogrammi atribuute ga mÀÀratakse, pĂ”himĂ”tteliselt, otsingu ruum, mille sees toimub sellise vektori (vĂ”i vektorite) otsing, mille jaoks saadakse maksimaalne vÀÀrtus sobivusfunktsioonist.

ga-alamprogramm otsib, maksimeerides sobivusfunktsiooni.

Nii et, sel juhul, peab sobivusfunktsioon, mÔistes vektorit kui parameetrite vÀÀrtuste komplekti andmebaasi jaoks, saama mÔÔdiku andmebaasilt.

See tÀhendab: kui antud andmebaasi seadistusega ja antud koormusega töötleb andmebaas tehingute arvu sekundis.

Seega, arendades, on vajalik, et sobivusfunktsiooni sees toimuks selline mitmeastmeline kÀik:

  1. Sisendi numbri vektori töötlemine — selle muutmine vÀÀrtusteks andmebaasi parameetritele.
  2. PĂŒĂŒd luua mÀÀratud arvu redo-rĂŒhmi, mÀÀratud suurusega. See on siiski katse: see vĂ”ib osutuda ebaĂ”nnestunuks.
    Juba olemasolevad andmebaasi ajakirjerĂŒhmad, mingis koguses ja mingis suuruses, tuleb katse puhtuse huvides eemaldada.
  3. Kui eelmine punkt Ônnestub: seadistada konfiguratsiooni parameetrite vÀÀrtuste pÔhja (taas: vÔib esineda tÔrkeid).
  4. Kui eelmine punkt Ônnestub: peatada andmebaas, kÀivitada andmebaas, et uuesti mÀÀratud parameetrite vÀÀrtused saaksid kehtima. (taas: vÔib esineda tÔrkeid).
  5. Kui eelmine punkt Ônnestub: teostada koormustest, et saada mÔÔdik andmebaasilt.
  6. Tagasi tuua andmebaas algsesse seisundisse, st eemaldada tĂ€iendavad ajakirjerĂŒhmad ja taastada andmebaasi algne konfiguratsioon.

FĂŒĂŒsika-funktsiooni kood

evaluate=function(p_par) {
v_module="evaluate"
v_metric=0
opn=NULL
opn$rg_size=round(p_par[1],digit=0)
opn$rg_count=round(p_par[2],digit=0)
opn$log_archive_max_processes=round(p_par[3],digit=0)
opn$commit_logging="BATCH"
if ( round(p_par[4],digit=0) > 5 ) {
 opn$commit_logging="IMMEDIATE"
}
opn$commit_logging=paste("'", opn$commit_logging, "'",sep="")

opn$commit_wait="WAIT"
if ( round(p_par[5],digit=0) > 5 ) {
 opn$commit_wait="NOWAIT"
}
opn$commit_wait=paste("'", opn$commit_wait, "'",sep="")

opn$log_buffer=paste(round(p_par[6],digit=0),"m",sep="")
opn$log_checkpoint_timeout=round(p_par[7],digit=0)
opn$db_writer_processes=round(p_par[8],digit=0)
opn$undo_retention=round(p_par[9],digit=0)
opn$transactions_per_rollback_segment=round(p_par[10],digit=0)
opn$disk_asynch_io="true"
if ( round(p_par[11],digit=0) > 5 ) {
 opn$disk_asynch_io="false"
} 

opn$filesystemio_options="none"
if ( round(p_par[12],digit=0) > 10 && round(p_par[12],digit=0)  20 && round(p_par[12],digit=0)  30 ) {
 opn$filesystemio_options="asynch"
}

opn$db_block_checking="OFF"
if ( round(p_par[13],digit=0) > 10 && round(p_par[13],digit=0)  20 && round(p_par[13],digit=0)  30 ) {
 opn$db_block_checking="FULL"
}

opn$db_block_checksum="OFF"
if ( round(p_par[14],digit=0) > 10 && round(p_par[14],digit=0)  20 ) {
 opn$db_block_checksum="FULL"
}

v_vector=paste(round(p_par[1],digit=0),round(p_par[2],digit=0),round(p_par[3],digit=0),round(p_par[4],digit=0),round(p_par[5],digit=0),round(p_par[6],digit=0),round(p_par[7],digit=0),round(p_par[8],digit=0),round(p_par[9],digit=0),round(p_par[10],digit=0),round(p_par[11],digit=0),round(p_par[12],digit=0),round(p_par[13],digit=0),round(p_par[14],digit=0),sep=";")
cat( paste(v_module," try to evaluate vector: ", v_vector,sep="") , file=v_logfile, sep="n", append=T)

rc=make_additional_rgroups(opn)
if ( rc!=0 ) {
 cat( paste(v_module,"make_additional_rgroups failed",sep="") , file=v_logfile, sep="n", append=T)
 return (0)
}

v_rc=0
rc=set_db_parameter("log_archive_max_processes", opn$log_archive_max_processes)
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("commit_logging", opn$commit_logging )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("commit_wait", opn$commit_wait )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("log_buffer", opn$log_buffer )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("log_checkpoint_timeout", opn$log_checkpoint_timeout )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("db_writer_processes", opn$db_writer_processes )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("undo_retention", opn$undo_retention )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("transactions_per_rollback_segment", opn$transactions_per_rollback_segment )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("disk_asynch_io", opn$disk_asynch_io )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("filesystemio_options", opn$filesystemio_options )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("db_block_checking", opn$db_block_checking )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("db_block_checksum", opn$db_block_checksum )
if ( rc != 0 ) {  v_rc=1 }

if ( rc!=0 ) {
 cat( paste(v_module," can not startup db with that vector of settings",sep="") , file=v_logfile, sep="n", append=T)
 rc=stop_db("immediate")
 rc=create_spfile()
 rc=start_db("")
 rc=remove_additional_rgroups(opn)
 return (0)
}

rc=stop_db("immediate")
rc=start_db("")
if ( rc!=0 ) {
 cat( paste(v_module," can not startup db with that vector of settings",sep="") , file=v_logfile, sep="n", append=T)
 rc=stop_db("abort")
 rc=create_spfile()
 rc=start_db("")
 rc=remove_additional_rgroups(opn)
 return (0)
}

rc=run_test()
v_metric=getmetric()

rc=stop_db("immediate")
rc=create_spfile()
rc=start_db("")
rc=remove_additional_rgroups(opn)

cat( paste("result: ",v_metric," ",v_vector,sep="") , file=v_logfile, sep="n", append=T)
return (v_metric)
}

Nii on, kogu töö: toimub sobivuse funktsioonis.

ga-algoritm, teostab vektorite töötlemist, vĂ”i Ă”igemini öelda — kromosoome.
Kus on meie jaoks kÔige olulisem: kromosoomide selektsioon selliste geenidega, mille puhul sobivuse funktsioon annab suuremaid vÀÀrtusi.

See on sisuliselt protsess, mille kÀigus otsitakse optimaalse kromosoomide komplekti vektoriga N-mÔÔtmelises otsinguruumis.

ÄÀrmiselt arusaadav, ĂŒksikasjalik selgitus, koos R-koodi nĂ€idete ja geneetilise algoritmi tööga.

Eriliselt mÀrkida kaks tehnilist momenti.

Abikutsed, funktsioonist evaluate, nÀiteks peatamine-kÀivitamine, andmete mÀÀramine alamandmebaasi vÀÀrtuseks, teostatakse cran-r funktsiooni system2

Mille kaudu: kutsub vÀlja mingi skripti vÔi kÀsu.

NĂ€iteks:

set_db_parameter

set_db_parameter=function(p1, p2) {
v_module="set_db_parameter"
v_cmd="/home/oracle/testingredotracĐ”/set_db_parameter.sh"
v_args=paste(p1," ",p2,sep="")

x=system2(v_cmd, args=v_args, stdout=T, stderr=T, wait=T)
if ( length(attributes(x)) > 0 ) {
 cat(paste(v_module," failed with: ",attributes(x)$status," ",v_cmd," ",v_args,sep=""), file=v_logfile, sep="n", append=T)
 return (attributes(x)$status)
}
else {
 cat(paste(v_module," ok: ",v_cmd," ",v_args,sep=""), file=v_logfile, sep="n", append=T)
 return (0)
}
}

Teine moment — string, evaluate funktsioonid, sĂ€ilitades mÔÔtme konkreetse vÀÀrtuse ja vastava seadistuse suuna logifailis:

cat( paste("tulemus: ",v_metric," ",v_vector,sep="") , file=v_logfile, sep="n", append=T)

See on oluline, sest sellest andmehulgast saab lisainfot selle kohta, milline seadistuse suuna komponent rohkem vÔi vÀhem mÔjutab mÔÔtme vÀÀrtust.

TeisisĂ”nu: saab lĂ€bi viia atribuudi olulisuse analĂŒĂŒsi.

Nii et, mis vÔiks vÀlja tulla.

Diagrammina, kui jÀrjestada testid mÔÔtme kasvamise jÀrgi, on pilt jÀrgmine:

Teaduslik eksperiment, vÔi kuidas leida andmebaasi konfiguratsioon bÀnhmÀrkide ja optimeerimise algoritmide abil

MÔned andmed, mis vastavad mÔÔtme ÀÀrmuslikele vÀÀrtustele:
Teaduslik eksperiment, vÔi kuidas leida andmebaasi konfiguratsioon bÀnhmÀrkide ja optimeerimise algoritmide abil
Siin, tulemuste ekraanipildil, tÀpsustan: seadistuse suuna vÀÀrtused on esitatud funktsioonide koodi mÔistetena, mitte parametriliste vÀÀrtuste nimekirjana vÔi vahemike jÀrgi, nagu ma tekstis eespool formuleerisin.

Noh, see, kas see on palju vĂ”i vĂ€he, ~8 tuhat tps: on eraldi kĂŒsimus.
Laboratoorse töö raames ei ole see number oluline, oluline on dĂŒnaamika, kuidas see vÀÀrtus muutub.

DĂŒnaamika siin on hea.
On ilmne, et vĂ€hemalt ĂŒks tegur, mis oluliselt mĂ”jutab mÔÔtme vÀÀrtust, ga-algoritm, ei suutnud kromosoomivektoreid lĂ€bi töötledes ebaĂ”nnestuda.
Arvestades kĂ”verate vÀÀrtuste ĂŒsna elavat dĂŒnaamikat, on veel vĂ€hemalt ĂŒks tegur, mis, kuigi mĂ€rksa vĂ€iksem, mĂ”jutab.

Siin on vajalik attribute-importance analĂŒĂŒs, et mĂ”ista: millised atribuudid (selles kontekstis — seadistusvektor komponentide) ja kui palju nad mĂ”jutavad mÔÔdiku vÀÀrtust.
Ja sellest infost: mĂ”ista — millised tegurid mĂ”jutavad oluliste atribuutide muutusi.

Tehtud attribute-importance seda saab teha erinevatele viisidele.

Mulle, nende eesmÀrkide jaoks, meeldib algoritm randomForest sama nimega R-paketist (mida ma mÔistan, kuidas see suures plaanis töötab ja selle lÀhenemine atribuutide tÀhtsuse hindamisele, loob mingi mudeli sÔltuvuse vastusmuutujast atribuutidest.dokumentatsioon)
randomForest, ĐșаĐș я ĐżĐŸĐœĐžĐŒĐ°ŃŽ Đ”ĐłĐŸ Ń€Đ°Đ±ĐŸŃ‚Ńƒ ĐČĐŸĐŸĐ±Ń‰Đ” Đž Đ”ĐłĐŸ ĐżĐŸĐŽŃ…ĐŸĐŽ Đș ĐŸŃ†Đ”ĐœĐșĐ” ĐČĐ°Đ¶ĐœĐŸŃŃ‚Đž Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚ĐŸĐČ ĐČ Ń‡Đ°ŃŃ‚ĐœĐŸŃŃ‚Đž, ŃŃ‚Ń€ĐŸĐžŃ‚ ĐœĐ”Đșую ĐŒĐŸĐŽĐ”Đ»ŃŒ заĐČĐžŃĐžĐŒĐŸŃŃ‚Đž ĐżĐ”Ń€Đ”ĐŒĐ”ĐœĐœĐŸĐč-ĐŸŃ‚ĐșлОĐșа, ĐŸŃ‚ Đ°Ń‚Ń€ĐžĐ±ŃƒŃ‚ĐŸĐČ.

Meie juhul on vastusmuutuja — mÔÔdik, mida saadakse andmebaasidest koormustestide kĂ€igus: tps;
Ja atribuudid on — seadistusvektori komponendid.

Nii et randomForest hindab iga mudeli atribuudi tĂ€htsust kahe numbriga: %IncMSE — kuidas selle atribuutide olemasolu/puudumine mudelis muudab selle mudeli MSE kvaliteeti (Mean Squared Error);

IncNodePurity on number, which indicates how well a dataset of observations can be divided based on the values of this attribute, so that one part contains data with one specific value of the explained metric, while the other part contains another value of the metric.
So, i.e.: how much of a classification attribute this is (the most clear explanation related to random forests I’ve seen in Russian). siin).

Working-peasant R code for processing a dataset with load test results:

x=NULL
v_data_file=paste('/tmp/data1.dat',sep="")
x=read.table(v_data_file, header = TRUE, sep = ";", dec=",", quote = ""'", stringsAsFactors=FALSE)
colnames(x)=c('metric','rgsize','rgcount','lamp','cmtl','cmtw','lgbffr','lct','dbwrp','undo_retention','tprs','disk_async_io','filesystemio_options','db_block_checking','db_block_checksum')

idxTrain=sample(nrow(x),as.integer(nrow(x)*0.7))
idxNotTrain=which(! 1:nrow(x) %in% idxTrain )
TrainDS=x[idxTrain,]
ValidateDS=x[idxNotTrain,]

library(randomForest)
#mtry=as.integer( sqrt(dim(x)[2]-1) )
rf=randomForest(metric ~ ., data=TrainDS, ntree=40, mtry=3, replace=T, nodesize=2, importance=T, do.trace=10, localImp=F)
ValidateDS$predicted=predict(rf, newdata=ValidateDS[,colnames(ValidateDS)!="metric"], type="response")
sum((ValidateDS$metric-ValidateDS$predicted)^2)
rf$importance

You can manually adjust the hyperparameters of the algorithm and, based on the model quality, select a model that performs better predictions on the validation dataset.
Saab kirjutada mingi funktsioon selle töö jaoks (muide — jĂ€lle, mingil optimeerimisalgoritmil).

Saab kasutada R-paketti caret, ei ole oluline.

KokkuvÔtteks, antud juhul on tulemuseks jÀrgmine, et hinnata atribuutide olulisuse astet:

Teaduslik eksperiment, vÔi kuidas leida andmebaasi konfiguratsioon bÀnhmÀrkide ja optimeerimise algoritmide abil

Nii et, saab alustada globaalsete mÔtlemisega:

  1. Tuleb vÀlja, et kÔige olulisem, antud testimisolukordades, on parameeter commit_wait
    Tehniliselt mÀÀrab see io-operatsiooni kirjutamisreĆŸiimi redo-andmete logibufrisse, current-logigruppi: sĂŒnkroonne vĂ”i asĂŒnkroonne.
    VÀÀrtus nowait mille puhul on peaaegu vertikaalne, korduv vÀÀrtuse tps-mÔÔdikute tĂ”us: see on io asĂŒnkroonsuse sisselĂŒlitamine redo-gruppides.
    Erinev kĂŒsimus — kas peaks nii tegema tootmisandmebaasis vĂ”i mitte. Siin piirduksin ainult konstateerimisega: see on oluline tegur.
  2. On loogiline, et log-bufri suurus on andmebaasi jaoks tÀhtsate tegurite hulgas.
    Mida vĂ€iksem on log-bufri suurus, seda vĂ€hem on selle puhverdamisvĂ”ime, seda sagedamini juhtuvad selle ĂŒlevoolud ja/vĂ”i ei ole vĂ”imalik eraldada seal vaba ala uute redo-andmete partii jaoks.
    Seega: logi-buffer'i ruumi mÀÀramine ja/vÔi redo-andmete talletamine redo-gruppidesse seotud viivitused.
    Need viivitused peaksid loomulikult mÔjutama ja mÔjutavad andmebaasi tehingute lÀbilaskevÔimet.
  3. Parameeter db_block_checksum: noh, see on ka ĂŒldiselt arusaadav — tehingute töötlemine toob kaasa darit-blokkide tekkimise andmebaasi vahemĂ€lus.
    Need, kui andmeblokkide kontrollsumma kontrollimine on sisse lĂŒlitatud, peab andmebaas töötlema — arvutama neid kontrollsummasid andmebloki sisust ja vĂ”rreldes neid, mis on kirjas andmeploki pĂ€ises: kas need kattuvad/ei kattu.
    Selline töö ei saa jÀllegi mitte venitada andmete töötlemist ja vastavalt sellele on parameeter ja mehhanism, mida see parameeter mÀÀrab, olulised.
    SeetĂ”ttu pakub tootja selle parameetri dokumentatsioonis erinevaid vÀÀrtusi ja mĂ€rgib, et - jah, mĂ”ju on olemas, kuid, noh, erinevad vÀÀrtused, sealhulgas "vĂ€lja lĂŒlitatud" ja erinev mĂ”ju, saate valida.

Noh ja globaalne jÀreldus.

LĂ€hteviis nĂ€ib ĂŒldiselt töötavat.

See on tĂ€iesti piisav, et varases etapis koormustestimise mingisuguse teenusesĂŒsteemi jaoks oleks vĂ”imalik valida selle sĂŒsteemi jaoks optimaalse konfiguratsiooni koormuse all, sĂŒvenemata eriti sĂŒsteemi konfiguratsiooni ĂŒksikasjadesse.

Kuid see ei vĂ€lista tĂ€ielikult — vĂ€hemalt tasemel arusaamise: "reguleerimisnuppudest" ja lubatud pöördevahemikest nende nuppude jaoks peab sĂŒsteem olema teadlik.

Edasi liikudes suudab lĂ€henemine suhteliselt kiiresti leida sĂŒsteemi optimaalse konfiguratsiooni.
Ja testimise tulemuste pĂ”hjal on vĂ”imalik saada teavet sĂŒsteemi töö kvaliteedi mÔÔdikute ja sĂŒsteemi seadistamise parameetrite seoste kohta.

See peaks muidugi soodustama sĂŒgava arusaamise tekkimist sĂŒsteemist, selle toimimisest, vĂ€hemalt antud koormuse korral.

Praktiliselt tĂ€hendab see: kulude jaotamine sĂŒvenemise ning sĂŒsteemi seadistamise testimise ettevalmistamise vahel.

Erakordselt on oluline selles lĂ€henemises sĂŒsteemi testimise adekvaatsuse aste tingimustele, milles see töötab oma tootmisĂŒksteemis.

AitÀh teie tÀhelepanu ja aja eest.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster