Teadusliku meetodi kasutamine ehk kuidas leida andmebaasi konfiguratsioon benchmarkide ja optimeerimisalgoritmi abil

Tere.

Otsustasin jagada oma leid, mĂ”tetes, katsetes ja vigades sĂŒndinud vilja.
Aga suuresti: see ei ole mingi leid, muidugi — see peaks olema ammu teada neile, kes tegelevad rakendusliku andmete töötlemise ja mingi sĂŒsteemi, mitte tingimata andmebaasi, optimeerimisega.
Ja: jah, nad teavad, kirjutavad huvitavaid artikleid oma uurimistöödest, nÀide (UPD.: kommentaarides viidati vÀga huvitavale projektile: ottertune )
Teiselt poolt: esmapilgul ei tundu, et sellist lÀhenemist oleks internetis, IT-spetsialistide seas, laialdaselt mainitud vÔi levinud.

Nii et, asja tuum.

Oletame, et meil on ĂŒlesanne: seadistada mingi teenussĂŒsteem, et teenindada mingit tööd.

Selle töö kohta — on teada: milline see on, milles mÔÔdetakse selle töö kvaliteeti ja milline on kvaliteedi mÔÔtmisnĂ€itaja.

Samuti oletame, et enam-vĂ€hem on teada, kuidas töö sellise teenussĂŒsteemiga toimub (vĂ”i milles see toimub).

"Enam-vĂ€hem" — see tĂ€hendab, et on vĂ”imalik ette valmistada (vĂ”i kuskilt hankida) mingi tööriista, utiliidi, teenuse, millega saab sĂŒnteesida ja esitada sĂŒsteemile testkoormuse, mis on piisavalt adekvaatne sellele, mis toimub tootmises, piisavalt adekvaatsetes tingimustes tootmises.

Noh ja oletame, et on teada selle teenussĂŒsteemi reguleeritavate parameetrite kogum, millega saab seda sĂŒsteemi seadistada, mĂ”ttes selle töö efektiivsust.

Ja probleem on selles — ei ole piisavalt tĂ€ielikku arusaamist sellest teenussĂŒsteemist, mis vĂ”imaldaks eksperdina seadistada selle sĂŒsteemi koormuse jaoks, antud platvormil ja saavutada vajaliku sĂŒsteemi töö efektiivsus.

Noh. Nii see peaaegu alati on.

Mis siin teha saab.

Noh, esimene mĂ”te, mis tuleb meelde: piiluda selle sĂŒsteemi dokumentatsiooni. MĂ”ista — millised seal on lubatud vahemikud reguleeritavate parameetrite vÀÀrtustele. Ja nĂ€iteks, koordinaatide laskumise meetodil, sobitada parameetrite vÀÀrtusi testides.

T.e. seadistada sĂŒsteemile mingi konfiguratsioon, konkreetsete vÀÀrtuste komplektina selle seadistamisparameetrite kohta.

Esitada sellele testkoormus, selle tööriista-utiliidi, koormuse generaatori abil.
Ja vaadata vÀÀrtust — vastust, noh vĂ”i sĂŒsteemi töö kvaliteedi mÔÔdik.

Teine mĂ”te vĂ”iks olla jĂ€reldus, et — see on ju vĂ€ga ajamahukas.

Noh, see tÀhendab: kui seadistamise parameetreid on palju, kui nende vÀÀrtuste lÀbimise vahemikud on suured, kui iga eraldi koormustesti tÀidetakse kaua aega, siis: jah, see kÔik vÔib vÔtta ebanormaalselt palju aega.

Noh ja siin on, mida saab mÔista ja meenutada.

Saab teada, et teenuse sĂŒsteemi seadistusparameetrite vÀÀrtuste komplektis on vektor, mis on mingite vÀÀrtuste jĂ€rjestus.

Iga sellise vektori puhul, kui kĂ”ik muud aspektid on vĂ”rdsed (kui see vektor ei mĂ”juta), vastab sellele kindlasti mÀÀratud mÔÔdik — sĂŒsteemi töö kvaliteedi nĂ€itaja koormustesti all.

St.

MÀÀrame sĂŒsteemi konfiguratsiooni vektori kui Teadusliku meetodi kasutamine ehk kuidas leida andmebaasi konfiguratsioon benchmarkide ja optimeerimisalgoritmi abil, kus Teadusliku meetodi kasutamine ehk kuidas leida andmebaasi konfiguratsioon benchmarkide ja optimeerimisalgoritmi abil; Kus Teadusliku meetodi kasutamine ehk kuidas leida andmebaasi konfiguratsioon benchmarkide ja optimeerimisalgoritmi abil on sĂŒsteemi konfiguratsiooni parameetrite arv.

Ja mÔÔdiku vÀÀrtus, mis vastab sellele Teadusliku meetodi kasutamine ehk kuidas leida andmebaasi konfiguratsioon benchmarkide ja optimeerimisalgoritmi abil mÀÀra kui
Teadusliku meetodi kasutamine ehk kuidas leida andmebaasi konfiguratsioon benchmarkide ja optimeerimisalgoritmi abil, siis saame funktsiooni: Teadusliku meetodi kasutamine ehk kuidas leida andmebaasi konfiguratsioon benchmarkide ja optimeerimisalgoritmi abil

Noh ja siis: kĂ”ik vĂ€hendab tagasi, minu puhul: peaaegu unustatud ĂŒlikooli pingilt, funktsiooni ÀÀrmuste otsimise algoritmid.

HĂ€sti, aga siin tekib organisatsiooniline ja praktiline kĂŒsimus: millist konkreetselt algoritmi kasutada.

  1. MĂ”ttes — et ise vĂ€hem koodi kirjutada.
  2. Ja et see töötaks, st et leiaks ÀÀrmuse (kui see on olemas), noh, vĂ€hemalt — kiiremini kui koordinaatide langus.

Esimene punkt viitab sellele, et tuleb vaadata selliste keskkondade poole, kus sellised algoritmid on juba rakendatud ja olemas mingis vormis, valmis koodis kasutamiseks.
Noh, mulle on teada python ja cran-r

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

Ja mida need annavad, vÔivad olla kasulikud kÔrvalmÔjud - tulemused, kas otseselt, algoritmist endast.

VÔi need vÔivad tulla algoritmi töö tulemustest.

Siin sÔltub palju sisetingimustest.

NÀiteks, kui mingitel pÔhjustel tuleb tulemust kiiremini saada, noh, tuleb vaadata gradientide languse algoritmide poole, valida mÔni neist.

VÔi, kui aeg ei ole nii oluline, vÔib nÀiteks kasutada stohhastilise optimeerimise meetodeid, nagu geneetiline algoritm.

Pakun vaadata sellise lĂ€henemise tööd, sĂŒsteemi konfiguratsiooni valiku osas, geneetilise algoritmi kasutamisega, jĂ€rgmisel, nii-öelda: laboris.

Algandmed:

  1. Olgu see nii, kui teenindussĂŒsteem: oracle xe 18c
  2. Olgu selle eesmÀrk: saada vÔimalikult suur andmebaasi lÀbilaskvus tehingute/sek.
  3. Tehingud on oma olemuselt ja andmete töötlemise kontekstis vÀga erinevad.
    Kokkuleppel on need tehingud, mis ei töötle suures mahus tabeliandmeid.
    Selle all mÔtleme, et need ei genereeri kinnitusandeid rohkem kui taastamisandeid ega töödelda suurt protsenti ridade, suurte tabelite hulgast.

Need on tehingud, mis muudavad ĂŒhte rida enam-vĂ€hem suures tabelis, millel on vĂ€he indekseid ĂŒle selle tabeli.

Sellisel juhul mÀÀrab andmebaasi produktiivsus tehingute töötlemisel, tingimusel, kvaliteedi taastamisandmete töötlemise poolt.

Kvaliteet - kui arvestada tÀpselt andmebaasi seadistuste kontekstis.

Sest ĂŒldiselt vĂ”ivad esineda nĂ€iteks tehingu lukustused, SQL-seansside vahel, olenevalt kasutajate töö tehingute andmetega ja/vĂ”i tabeli mudeliga.

Need mĂ”jutavad kindlasti tps-mÔÔtmist ja see on eksogeenine, andmebaasi suhtes, tegur: nii on tabeli mudel ja andmetöötlus ĂŒles ehitatud, et tekivad lukustused.

SeetÔttu vÀlistame eksperimentaalselt selle teguri, selgitame allpool, kuidas tÀpselt.

  1. Oletame, et kahtlusteta, et 100% andmebaasi edastatud SQL-kÀskudest: on DML-kÀskud.
    Olgu andmebaasi kasutajate töö omadused: samad, testides.
    Nimelt: SQL-seansside arv, tabeliandmed, see, kuidas SQL-seanssid nendega töötavad.
  2. Andmebaas töötab FORCE LOGGING, ARCHIVELOG reĆŸiimides. Flashback-andmebaasi reĆŸiim on keelatud andmebaasi tasemel.
  3. Taastamislogid: asuvad eraldi failisĂŒsteemis, eraldi "ketasel";
    Kogu ĂŒlejÀÀnud fĂŒĂŒsiline andmebaasi komponent: on teises, eraldi FS-is, eraldi "ketasel":

Rohkem teavet labori andmebaasi fĂŒĂŒsilise komponendi seadmest

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 soovisin kasutada seda andmebaasi, et jÔuda nende koormustingimusteni. SLOB eesmÀrk
Sellel on selline tÀhelepanuvÀÀrne omadus, tsiteerin autorit:

SLOBi keskmes on "SLOB meetod". SLOB meetodi eesmÀrk on testida platvorme
ilma rakenduse konfliktita. Maksimaalset riistvara jÔudlust ei saa saavutada
rakenduskoodiga, mis nÀiteks sÔltub rakenduse lukustamisest vÔi isegi
Oracle Database'i plokkide jagamisest. Just nii – andmeblokki jagamisel on ĂŒlevaade!
Kuid SLOB – oma vaikimisi seadistuses – on selliste konfliktide suhtes immuunne.

See vÀide: vastab tÔele.
Mugav on reguleerida paralleelsuse taset SQL-sessioonides, see on peamine -t utility kÀivitus runit.sh SLOB-i komplektist
Reguleeritakse DML-kÀskude protsent, milles SQL-sessioonid saadavad andmebaasi, iga SQL-sessiooni parameeter UPDATE_PCT
Eraldi ja vÀga mugav: SLOB ise valmistab enne ja pÀrast koormuse seanssi statsparimaid vÔi AWR-lÔike (kui on mÀÀratud ette valmistada).

Kuid selgus, et SLOB ei toeta SQL-sessioonide töötamist, mille pikkus on alla 30 sekundi.
SeetÔttu programmeerisin esmalt oma versiooni koormustestijast, mis jÀi tööle.

Selgitan koormustesti kohta — mida ja kuidas see teeb, et oleks selgem.
Tegelikult nÀeb koormustestija vÀlja jÀrgmiselt:

Töötaja 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;
\/\n
exit
__EOF__
}
export -f dotx

Töötajaid kÀivitatakse jÀrgmiselt:

Töötajate kÀivitus

echo "alguse test, kestus: ${TEST_DURATION}" >> "$v_logfile"
for((i=1;i> "$v_logfile"
 dotx "$i" "${TEST_DURATION}" &
done
echo "ootamist oodatakse..." >> "$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;
\/\n
create table system.testtab_&&wnum tablespace &&ts_name as
select rownum as col1, t.*
from sys.dba_objects t
where rownum> "$v_logfile"

See tÀhendab, et iga töötaja (peaaegu: eraldi SQL-seanss andmebaasis) loob eraldi tabeli, millega töötaja töötab.

Sellega saavutatakse tehingute lukustamise puudumine, töötajate SQL-seansside vahel.
Iga töötaja: teeb sama, oma tabeliga, kÔik tabelid on identsed.
KÔik töötajad teevad tööd sama aja jooksul.
Ja seejuures piisavalt pika aja, et nĂ€iteks kindlasti toimuks ja mitte ĂŒks kord logi vahetus.
Noh ja vastavalt tekivad sellega seotud kulutused ja efektid.
Minu puhul olen seadnud töötajate töö kestuse 8 minutiks.

TĂŒkk statspak-aruandest, koos kirjeldustega andmebaasi töö kohta koormuse all.

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

Hosti nimi             Platvorm                CPU-d Cores Pesa   MĂ€lu (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
     billing.izhevsk1 Linux x86 64-bit           2     2       1         15.6

KuvatÔmmis       Snap Id     Snap Aeg      Sessioonid Curs/Sess Kommentaar
~~~~~~~~    ---------- ------------------ -------- --------- ------------------
Alusta Snap:       1630 07-Sep-20 23:12:27       55        .7
  LÔpeta Snap:       1631 07-Sep-20 23:20:29       62        .6
   Aeg:       8.03 (min) Keskmine aktiivne sessioon:       8.4
   DB aeg:      67.31 (min)      DB CPU:      15.01 (min)

VahemÀlu suurused            Algus        LÔpp
~~~~~~~~~~~       ---------- ----------
    PuhvermÀlu:     1,392M              Std Block Size:         8K
     Jagatud bassein:       288M                  Logi puhvrimÀlu:   103,424K

Koormuse profiil              Sekundi kaupa    Tehingu kaupa    TÀitmise kaupa    KÔne kaupa
~~~~~~~~~~~~      ------------------  ----------------- ----------- -----------
      DB aeg(d):                8.4                0.0        0.00        0.20
       DB CPU(d):                1.9                0.0        0.00        0.04
       Redo suurus:        7,685,765.6              978.4
   Loogilised lugemised:           60,447.0                7.7
   Ploki muutmised:           47,167.3                6.0
  FĂŒĂŒsilised lugemised:                8.3                0.0
 FĂŒĂŒsilised kirjutised:              253.4                0.0
      Kasutaja kÔned:               42.6                0.0
          Parsee:               23.2                0.0
     Raske parse:                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
       TagasivÔtmised:                0.0                0.0
    Tehingud:            7,855.1

Naastes labori töö mÀÀratlemise juurde.
Vaatame, et vÔrdselt, varieerida selliste laboratoorsete DB parameetrite vÀÀrtusi:

  1. Andmebaasi logigruppide 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 lubatud on kaks vÀÀrtust: batch|immediate;
  5. commit_wait lubatud on kaks 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 lubatud on kaks vÀÀrtust: true|false;
  12. filesystemio_options lubatud on jÀrgmised vÀÀrtused: none|setall|directIO|asynch;
  13. db_block_checking lubatud on jÀrgmised vÀÀrtused: OFF|LOW|MEDIUM|FULL;
  14. db_block_checksum lubatud on jÀrgmised vÀÀrtused: OFF|TYPICAL|FULL;

Inimene, kellel on kogemus oracle-andmebaaside hooldamises, oskab kindlasti juba praegu öelda — milliseid ja milliseid vÀÀrtusi seada, antud parameetrite ja nende lubatud vÀÀrtuste seast, et saavutada suuremat andmebaasi tootlikkust, vastavalt siia, ĂŒlal toodud, rakenduskoodiga mÀÀratletud andmetöötlusele.

Aga.

Laboratoorse töö mÔte on nÀidata, et optimeerimisalgoritm ise ning ka suhteliselt kiiresti selgub meile.

Meil jÀÀb vaid vaadata dokumentatsiooni, muudetava sĂŒsteemi kohta, tĂ€pselt niipalju, kui vajalik, et vĂ€lja selgitada: milliseid parameetreid ja millistes vahemikes muuta.
Ja samuti: kodeerida kood, millega rakendatakse valitud optimeerimisalgoritmi muudetava sĂŒsteemiga töötamist.

Nii et nĂŒĂŒd koodist.
Ülal mainisin cran-r, st: kĂ”ik manipuleerimised muudetava sĂŒsteemiga - orkestreeritakse R-skriptina.

Tegelikult on ĂŒlesanne, analĂŒĂŒs, parameetrite vÀÀrtuste valik, sĂŒsteemi olekute vektorid: see on paket. GA (dokumentatsioon)
Pakett, antud juhul, ei sobi vÀga hÀsti, kuna see ootab vektorite (kromosoomide, kui kasutada paketi termineid) mÀÀramist nagu reaalarvud, mis sisaldavad koma.

Ja minu vektor, seadistuste parameetrite vÀÀrtustest: see on 14 vÀÀrtust - tÀisarvud ja stringivÀÀrtused.

Probleem, muidugi, kergesti lahendatakse, mÀÀrates stringivÀÀrtustele teatud numbrid.

Nii et lÔpuks, peamine R-skripti osa nÀeb vÀlja selline:

Kutsu 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, abiga lower ja upper alprogrammi atribuudid ga mÀÀratakse sisuliselt otsinguruumi ala, mille sees otsitakse vektorit (vÔi vektoreid), mille jaoks saavutatakse maksimaalne fitness-funktsiooni vÀÀrtus.

ga-algoritm teostab otsingu maksimeerides fitness-funktsiooni.

Nii et, tulemuseks on see, et antud juhul peab olema nii, et fitness-funktsioon, mÔistes vektorit kui teatud parameetrite vÀÀrtuste kogumit andmebaasi jaoks, saab mÔÔdikuks andmebaasi kohta.

St: kui palju, antud andmebaasi seadistuse ja antud andmebaasi koormuse korral: andmebaas töötleb tehinguid sekundis.

St, lahtiselt öeldes, on vajalik, et fitness-funktsiooni sees toimuks selline mitmeastmeline protsess:

  1. Sisendi numbrivektori töötlemine - selle muutmine andmebaasi parameetrite vÀÀrtusteks.
  2. Katse luua soovitud arvu redo-gruppe, soovitud suurusega. Ja katse: vÔib ebaÔnnestuda.
    Juba eksisteeritud andmebaasi ajakirjade grupid, mingis koguses ja mingis suuruses, eksperimentide puhtuse huvides - tuleb eemaldada.
  3. Kui eelmine punkt Ônnestus: mÀÀrata konfiguratsiooniparametrite vÀÀrtuste andmebaas (jÀllegi: vÔib esineda rike).
  4. Kui eelmine punkt Ônnestus: peatada andmebaas, kÀivitada andmebaas, et uuesti mÀÀratud parameetrite vÀÀrtused hakkaksid kehtima. (jÀllegi: vÔib esineda rike).
  5. Kui eelmine punkt Ônnestus: teostada koormustest, et saada mÔÔdikut andmebaasilt.
  6. Tagastada andmebaas algsesse olekusse, s.t. eemaldada tÀiendavad ajakirjade grupid, taastada andmebaasi algne konfiguratsioon.

Funktsiooni koodi fitness

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)
}

Seega, kogu töö: toimub fitness-funktsiooni raames.

ga-alamprogramm, teostab vektoreid vÔi, tÀpsemalt öeldes - kromosoome.
Kus on meile kÔige olulisem: kromosoomide selektsioon, mille geenid annavad fitness-funktsiooni suured vÀÀrtused.

See on sisuliselt protsess optimaalse kromosoomide kogumi otsimisel vektorina N-dimensionaalses otsinguruumis.

VÀga selge, detailne selgitus, koos nÀidetega R-koodist, geneetilise algoritmi töö kohta.

Erikena tahan rÔhutada kahte tehnilist hetke.

Abikutsed, funktsioonist evaluate, nÀiteks peatamine-alustamine, parametri vÀÀrtuse mÀÀramine, toimuvad cran-r funktsiooni system2

Millega: kutsutakse ĂŒles mĂ”ni bash-skript vĂ”i kĂ€sk.

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 punkt - rida, evaluate funktsioon, sÀilitades konkreetse mÔÔdiku vÀÀrtuse ja vastava seadistuste vektori logifailis:

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

See on oluline, kuna sellest andmemassist on vÔimalik saada tÀiendavat teavet selle kohta, milline seadistuste vektori komponent rohkem vÔi vÀhem mÔjutab mÔÔdiku vÀÀrtust.

TeisisĂ”nu: on vĂ”imalik lĂ€bi viia feature-importance analĂŒĂŒs.

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

Graafikuna, kui jÀrjestada testid mÔÔdiku kasvamise jÀrjekorras, on pilt jÀrgmine:

Teadusliku meetodi kasutamine ehk kuidas leida andmebaasi konfiguratsioon benchmarkide ja optimeerimisalgoritmi abil

MÔned andmed, mis vastavad mÔÔdiku ÀÀrmuslikele vÀÀrtustele:
Teadusliku meetodi kasutamine ehk kuidas leida andmebaasi konfiguratsioon benchmarkide ja optimeerimisalgoritmi abil
Siin, ekraanipildil tulemustest, tÀpsustan: seadistuste vektori vÀÀrtused on antud fitness-funktsiooni koodi mÔistes, mitte numbriliste parameetrite/nÀitajate vÀÀrtuste loendi mÔistes, mille formuleerisin tekstis varem.

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

DĂŒnaamika on siin hea.
On selge, et vĂ€hemalt ĂŒks tegur, mis mĂ”jutab mÔÔdiku vÀÀrtust, ga-algoritm, lĂ€bides vektoreid-kromosoome: on tehtud.
Tuginedes, et muutuja kĂ”verad on piisavalt elujĂ”ulised, on veel vĂ€hemalt ĂŒks tegur, mis, kuigi see on oluliselt vĂ€iksem, mĂ”jutab.

Siin on vajalik attribute-importance analĂŒĂŒs, et mĂ”ista: millised atribuudid (antud juhul - seadistusteral) ja kui tugevalt nad mĂ”jutavad meetrika vÀÀrtust.
Ja selle info pÔhjal: mÔista - millised tegurid olid seotud oluliste atribuutide muutustega.

Teha attribute-importance vÔib erinevate viisidega.

Minu jaoks meeldib nende eesmÀrkide saavutamiseks algoritm randomForest samanimelisest R-paketist (dokumentatsioon)
randomForest, nagu ma mÔistan, toimib see nii, et see loob mudeli, kuidas sÔltuv muutuja sÔltub atribuutidest.

Meie puhul on sÔltuv muutuja - meetrika, mida saame andmebaasidest koormustestide kÀigus: tps;
Ja atribuudid on - seadistustera koostisosad.

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

Ja IncNodePurity - see number nĂ€itab, kui hĂ€sti vĂ”ib selle atribuudi vÀÀrtuste pĂ”hjal andmestikku jagada, nii et ĂŒhes osas oleksid andmed ĂŒhe selgitava meetrika vÀÀrtusega ja teises poleks.
Noh, see tÀhendab: kui klassifitseeriv atribuut see on (kÔige arusaadavam, venekeelne selgitus randomforesti kohta, mida olen nÀinud siit).

Töömees-kodanik R-kood, et töödelda andmestikku koormustestide tulemustega:

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

Saab otse kĂ€tega hĂŒperparameetreid kohandada ja tuginedes mudeli kvaliteedile valida tĂ€psemaid mudelit, mis teeb ennustusi valideerimisandmestikus.
Saab kirjutada mingi funktsiooni selle töö jaoks (muide, jÀlle, mingi optimeerimisalgoritmiga).

Saab kasutada R-paketti caret, ei ole oluline.

KokkuvÔttes saame sellise tulemuse atribuudi olulisuse hindamiseks:

Teadusliku meetodi kasutamine ehk kuidas leida andmebaasi konfiguratsioon benchmarkide ja optimeerimisalgoritmi abil

Nii et, saame alustada globaalsete mÔtete vÀljatöötamisega:

  1. Selgub, et kÔige olulisem parameeter antud testimise tingimustes on commit_wait
    Tehniliselt mÀÀrab see io-operatsiooni reĆŸiimi, mille kĂ€igus kirjutatakse redo-andmed subd logi puhtasse ajakirja gruppi: sĂŒnkroonne vĂ”i asĂŒnkroonne.
    TĂ€hendus nowait , mille tulemusena saavutatakse praktiliselt vertikaalne, korduvalt kasvav tps-mÔÔdik: see on io asĂŒnkroonne reĆŸiim redo-gruppides.
    Erinev kĂŒsimus on, kas seda on vaja vĂ”i mitte tootmisandmebaasis. Siin piirdun vaid konstateerimisega: see on oluline faktor.
  2. On loogiline, et subd logi puhvri suurus on oluline faktor.
    Mida vĂ€iksem on logi puhvri suurus, seda vĂ€iksem on selle puhverdamisvĂ”ime, seda sagedamini juhtuvad selle ĂŒletĂ€itumised ja/vĂ”i ei ole vĂ”imalik eraldada seal vaba ruumi uute redo-andmete jaoks.
    Ja see tÀhendab: viivitused, mis on seotud ruumi eraldamisega logi puhvris ja/vÔi redo-andmete vÀljaviskamisega sealt redo-gruppidesse.
    Need viivitused peavad loomulikult mÔjutama ja mÔjutavad subd lÀbilaskevÔimet tehingute osas.
  3. Parameeter db_block_checksum: no, see on ka ĂŒsna arusaadav — tehingute töötlemine toob kaasa darti-blokke subd puhverkasutuses.
    Need, kui kontrollitakse andmeplokkide tƥekksumme, tuleb andmebaasil töödelda - arvutada need tƥekksummad andmeploki kehast, vÔrrelda neid andmeploki pÀises kirjutatuga: vastab / ei vasta.
    Selline töö ei saa jÀlle mitte venitada andmete töötlemist ja seega on parameeter ja mehanism, mis selle parameetri mÀÀrab, mÀrkimisvÀÀrsed.
    SeetÔttu pakub tootja selle parameetri dokumentatsioonis erinevaid vÀÀrtusi ja rÔhutab, et jah, mÔju on, kuid siin on erinevad vÀÀrtused, isegi "vÀlja", ja erinev mÔju, mida saate valida.

Ja globaalne jÀreldus.

LĂ€htepunkt on ĂŒldiselt toimiv.

See vĂ”imaldab tugivĂ”rgu testimise varases etapis, et valida selle (sĂŒsteemi) optimaalselt koormuseks konfigureerimist mitte liiga sĂŒgavale siseneda sĂŒsteemi seadistamise eripĂ€radesse koormuse all.

Kuid see ei vĂ€lista tĂ€iesti — vĂ€hemalt mĂ”istmise tasemel: sĂŒsteem peab teadma "reguleerimisnuppe" ja nende pöörlemise lubatud vahemike vÀÀrtusi.

Edasi vĂ”ib lĂ€henemine ĂŒsna kiiresti leida sĂŒsteemi jaoks optimaalse konfiguratsiooni.
Ja testimise tulemuste pĂ”hjal saab teavet sĂŒsteemi töö kvaliteedi mÔÔdikute ja sĂŒsteemi seadistusparameetrite vÀÀrtuste vaheliste seoste kohta.

Mis peaks loomulikult soodustama sĂŒgava arusaama tekkimist sĂŒsteemist, selle töötamisest, vĂ€hemalt — antud koormuse tingimustes.

Praktiliselt tĂ€hendab see: kulutused sĂŒsteemi seadistamise mĂ”istmiseks ja sellise testimise ettevalmistamise kulud.

Eraldi mainin: selles lĂ€henemises on kriitiliselt oluline testimise adekvaatsuse mÀÀr sĂŒsteemi töötingimustele, millega see kĂ€ib tootmiseksploitatsioonis.

AitÀh teie tÀhelepanu eest, aega.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster