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, (UPD.: kommentaarides viidati vÀga huvitavale projektile: )
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
, kus
; Kus
on sĂŒsteemi konfiguratsiooni parameetrite arv.
Ja mÔÔdiku vÀÀrtus, mis vastab sellele
mÀÀra kui
, siis saame funktsiooni: 
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.
- MĂ”ttes â et ise vĂ€hem koodi kirjutada.
- 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:
- Olgu see nii, kui teenindussĂŒsteem:
oracle xe 18c - Olgu selle eesmÀrk: saada vÔimalikult suur andmebaasi lÀbilaskvus tehingute/sek.
- 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.
- 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. - Andmebaas töötab
FORCE LOGGING,ARCHIVELOGreĆŸiimides. Flashback-andmebaasi reĆŸiim on keelatud andmebaasi tasemel. - 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 0Alguses soovisin kasutada seda andmebaasi, et jÔuda nende koormustingimusteni.
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 dotxTöö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"
waitJa 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.1Naastes labori töö mÀÀratlemise juurde.
Vaatame, et vÔrdselt, varieerida selliste laboratoorsete DB parameetrite vÀÀrtusi:
- Andmebaasi logigruppide suurus. vÀÀrtuste vahemik: [32, 1024] MB;
- Logigruppide arv. vÀÀrtuste vahemik: [2,32];
log_archive_max_processesvÀÀrtuste vahemik: [1,8];commit_logginglubatud on kaks vÀÀrtust:batch|immediate;commit_waitlubatud on kaks vÀÀrtust:wait|nowait;log_buffervÀÀrtuste vahemik: [2,128] MB.log_checkpoint_timeoutvÀÀrtuste vahemik: [60,1200] sekunditdb_writer_processesvÀÀrtuste vahemik: [1,4]undo_retentionvÀÀrtuste vahemik: [30;300] sekundittransactions_per_rollback_segmentvÀÀrtuste vahemik: [1,8]disk_asynch_iolubatud on kaks vÀÀrtust:true|false;filesystemio_optionslubatud on jÀrgmised vÀÀrtused:none|setall|directIO|asynch;db_block_checkinglubatud on jÀrgmised vÀÀrtused:OFF|LOW|MEDIUM|FULL;db_block_checksumlubatud 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 ()
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@solutionSiin, 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:
- Sisendi numbrivektori töötlemine - selle muutmine andmebaasi parameetrite vÀÀrtusteks.
- 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. - Kui eelmine punkt Ônnestus: mÀÀrata konfiguratsiooniparametrite vÀÀrtuste andmebaas (jÀllegi: vÔib esineda rike).
- Kui eelmine punkt Ônnestus: peatada andmebaas, kÀivitada andmebaas, et uuesti mÀÀratud parameetrite vÀÀrtused hakkaksid kehtima. (jÀllegi: vÔib esineda rike).
- Kui eelmine punkt Ônnestus: teostada koormustest, et saada mÔÔdikut andmebaasilt.
- 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 , 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:

MÔned andmed, mis vastavad mÔÔdiku ÀÀrmuslikele vÀÀrtustele:

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 ()
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 ).
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$importanceSaab 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:

Nii et, saame alustada globaalsete mÔtete vÀljatöötamisega:
- 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Ă€hendusnowait, 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. - 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. - 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
