Hej.
Jag ville dela med mig av min upptĂ€ckte â resultatet av reflektioner, prövningar och misstag.
I stora drag: det hÀr Àr förstÄs ingen upptÀckte, allt detta borde vara vÀlkÀnt för dem som arbetar med tillÀmpad dataanalys och optimering av system, inte nödvÀndigtvis bara databashanteringssystem.
Och: ja, det finns de som vet, som skriver intressanta artiklar om sina forskningar, (UPD.: i kommentarerna nÀmnde de ett mycket intressant projekt: )
Ă
andra sidan: jag kan inte spontant se en bred anvÀndning eller spridning av detta tillvÀgagÄngssÀtt pÄ nÀtet bland IT-specialister and DBA:er.
SĂ„, till saken.
LÄt oss anta att vi har följande uppgift: stÀlla in ett viss tjÀnstesystem för att hantera ett specifikt arbete.
Om detta arbete Àr kÀnt: hur det Àr, hur kvaliteten pÄ detta arbete mÀts och vilket kriterium som anvÀnds för att mÀta denna kvalitet.
LÄt oss ocksÄ anta att det mer eller mindre Àr klart hur arbetet genomförs i (eller med) detta tjÀnstesystem.
"Mer eller mindre" betyder att det finns möjlighet att förbereda (eller hÀmta) ett verktyg, en nytta, en tjÀnst som kan syntetisera och ge systemet en testbelastning som Àr tillrÀckligt lik den som kommer i produktion, under förhÄllanden som Àr rimliga för arbete i produktion.
Och antag att uppsÀttningen av justerbara parametrar för detta tjÀnstesystem Àr kÀnda, som kan stÀlla in systemet med avseende pÄ dess produktivitet.
Och vad Ă€r problemet â det finns inte tillrĂ€cklig fullstĂ€ndig förstĂ„else för detta tjĂ€nstesystem, sĂ„ mycket att man kan expertstĂ€rka instĂ€llningarna för detta system, för den framtida belastningen, pĂ„ denna plattform och fĂ„ den nödvĂ€ndiga produktiviteten.
NÄvÀl. SÄnt hÀnder nÀstan alltid.
Vad kan göras hÀr.
Det första som kommer i Ă„tanke: kolla dokumentationen för detta system. FörstĂ„ â vilka Ă€r de tillĂ„tna intervallen för vĂ€rdena pĂ„ de justerbara parametrarna. Och, till exempel, med hjĂ€lp av metoden med koordinatsĂ€nkning, finjustera vĂ€rdena för systemets parametrar i tester.
Det vill sÀga, ge systemet en viss konfiguration, i form av ett specifikt vÀrdeset för dess instÀllningsparametrar.
TillhandahÄlla en testbelastning med detta verktyg, utility, lastgenerator.
Och se pĂ„ storleken â svarstiden, eller nĂ„got mĂ„tt pĂ„ kvaliteten pĂ„ systemets arbete.
En annan tanke kan vara slutsatsen att â detta tar vĂ€ldigt lĂ„ng tid.
Det vill sÀga: om det finns mÄnga instÀllningsparametrar, om de vÀrden de kan anta Àr stora, om varje enskild belastningstest pÄgÄr under lÄng tid, dÄ: ja, allt det hÀr kan ta oacceptabelt lÄng tid.
Och hÀr kan man förstÄ och minnas vad som helst.
Man kan fĂ„ reda pĂ„ i uppsĂ€ttningen av instĂ€llningsparametrar för tjĂ€nstesystemet â en vektor, som en sekvens av vissa vĂ€rden.
Varje sĂ„dan vektor, under lika förutsĂ€ttningar (under förutsĂ€ttning att denna vektor inte pĂ„verkas), motsvarar ett ganska specifikt vĂ€rde av en metrik â kvalitetsmĂ„tt för systemets arbete under testbelastning.
Det vill sÀga.
LÄt oss beteckna vektorn av systemkonfigurationen som
, dÀr
; dÀr
â antalet konfigurationsparametrar för systemet, hur mĂ„nga av dessa parameter finns det.
Och vÀrdet av metrik som motsvarar denna
betecknar vi som
, sÄ fÄr vi en funktion: 
Och dÄ: allt reduceras omedelbart till, i mitt fall: nÀstan bortglömda frÄn studietiden, algoritmer för att söka extremalpunkter för en funktion.
Bra, men hÀr uppstÄr en organisatorisk tillÀmpningsfrÄga: vilken specifik algoritm ska man anvÀnda.
- Med andra ord â för att man sjĂ€lv ska behöva koda sĂ„ lite som möjligt.
- Och att det ska fungera, det vill sĂ€ga hitta extremvĂ€rdet (om det finns), Ă„tminstone â snabbare Ă€n koordinatnedstigning.
Den första punkten antyder att man bör titta pÄ nÄgon typ av miljö dÀr sÄdana algoritmer redan Àr implementerade, och finns i nÄgot format, redo att anvÀndas i koden.
NÄvÀl, jag kÀnner till python och cran-r
Den andra punkten innebÀr att man behöver lÀsa om sjÀlva algoritmerna, vilka som finns, vilka krav har de, vilka egenskaper har de i arbetet.
Och vad de ger, eventuella anvÀndbara sidoeffekter-resultat, direkt frÄn sjÀlva algoritmen.
Eller sÄ kan de erhÄllas frÄn resultaten av algoritmens arbete.
HÀr beror mycket pÄ ingÄngsvillkoren.
Till exempel, om man av nÄgon anledning behöver fÄ resultatet snabbare, sÄ bör man titta pÄ algoritmer för gradientnedstigning, vÀlja nÄgon av dem.
Eller, om tiden inte Àr sÄ viktig, kan man till exempel anvÀnda metoder för stokastisk optimering, som genetiska algoritmer.
Jag föreslÄr att vi övervÀger att arbeta med en sÄdan metod för att anpassa systemkonfigurationen, med hjÀlp av en genetisk algoritm, pÄ nÀsta, sÄ att sÀga: laboratoriearbete.
UtgÄngspunkter:
- LÄt oss ha som en serviceplattform:
oracle xe 18c - LÄt oss sÀga att den hanterar transaktionsaktiviteten och mÄlet: att uppnÄ en sÄ hög genomströmningskapacitet av databashanteraren som möjligt, i transaktioner/sek.
- Transaktioner kan vara mycket olika, beroende pÄ hur de arbetar med data och kontexten i arbetet.
Vi förutsÀtter att detta Àr transaktioner som inte bearbetar stora mÀngder tabulÀr data.
I den meningen att de inte genererar mer undo-data Àn redo och inte bearbetar stora procentandelar av rader i stora tabeller.
Det Àr transaktioner som Àndrar en rad i en mer eller mindre stor tabell, med ett litet antal index över denna tabell.
I ett sÄdant scenario kommer databashanterarens produktivitet för bearbetning av transaktioner, med förbehÄll, att bestÀmmas av kvaliteten pÄ behandlingen av redo-data.
FörbehĂ„llet â om vi pratar specifikt om instĂ€llningarna för databashanteraren.
För i allmÀnhet kan det finnas, till exempel, transaktionslÄsningar mellan SQL-sessioner, pÄ grund av designen av anvÀndarens arbete med tabulÀr data och/eller tabellmodellen.
Som sjÀlvklart skulle pÄverka tps-metriken negativt, och detta skulle vara en exogen, i förhÄllande till databashanteraren, faktor: sÄ hÀr designades tabellmodellen och arbetet med data att det uppstÄr lÄsningar.
DÀrför, för experimentets renhet, kommer vi att utesluta den faktorn, jag kommer senare att förtydliga hur exakt.
- LÄt oss anta, för tydlighetens skull, att 100% av de SQL-kommandon som ges till databashanteraren: Àr DML-kommandon.
LÄt oss sÀga att karakteristika för anvÀndarens arbete med databashanteraren: Àr desamma i testerna.
Det handlar om: antalet SQL-sessioner, tabulÀr data, hur SQL-sessionerna interagerar med dessa. - Databashanteraren arbetar i
FORCE LOGGING,ARCHIVELOGlÀgen. Flashback-databasen Àr avstÀngd, pÄ databashanterarnivÄ. - Redo-loggar: Àr belÀgna i ett separat filsystem, pÄ en separat "disk";
Hela den övriga delen av den fysiska komponenten av databas: Àr i ett annat, separat FS, pÄ en separat "disk":
Mer om konstruktionen av den fysiska komponenten av den laboratoriebaserade databasen
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 0Inledningsvis ville jag anvÀnda en databas för transaktionerna under dessa belastningsförhÄllanden
Den har en fantastisk egenskap som jag vill citera författaren:
KÀrnan i SLOB Àr "SLOB-metoden". SLOB-metoden syftar till att testa plattformar
utan applikationskonkurrens. Man kan inte nÄ maximal hÄrdvaruprestanda
med applikationskod som till exempel Àr begrÀnsad av applikationslÄsning eller ens
delning av Oracle-databasblock. Det stĂ€mmerâdet finns overhead vid delning av data
i datablok! Men SLOBâi sin standardinstallationâĂ€r immun mot sĂ„dan konkurrens.
Denna deklaration: Àr det som det Àr.
Det Àr praktiskt att justera graden av parallellism för SLOB-sessioner, detta Àr nyckeln -t att starta verktyget runit.sh frÄn SLOB-satsen
Den reglerar procentandelen DML-kommandon i det antal SQL-frÄgor som varje SQL-session skickar till databasen, parametern UPDATE_PCT
Separat och mycket praktiskt: SLOB sjĂ€lv, före och efter belastningssessionenâförbereder statspaket eller AWR-snapshots (vad som har beordrats att förberedas).
Det visade sig dock att SLOB inte stödjer SQL-sessioner som varar mindre Àn 30 sekunder.
DÀrför skrev jag först min egen, arbetarklassversion av belastaren, och sedan blev det kvar i anvÀndning.
LĂ„t mig förtydliga belastarenâvad den gör och hur, för tydlighetens skull.
I grund och botten ser belastaren ut sÄ hÀr:
Arbetarkod
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 dotxArbetare startas pÄ följande sÀtt:
Starta arbetarna
echo "startar test, varaktighet: ${TEST_DURATION}" >> "$v_logfile"
for((i=1;i> "$v_logfile"
dotx "$i" "${TEST_DURATION}" &
done
echo "vÀntar..." >> "$v_logfile"
waitOch tabellerna för arbetarna förbereds sÄ hÀr:
Skapande av tabeller
function createtable() {
source "/home/oracle/testingredotrace/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"Det vill sÀga, för varje arbetare (praktiskt taget: en separat SQL-session i databasen) skapas en separat tabell, som arbetaren arbetar med.
Detta uppnÄr avsaknaden av transaktionslÄsningar mellan SQL-sessionerna för arbetarna.
Varje arbetare gör samma sak med sin tabell, tabellerna Àr alla desamma.
Arbetarna utför alla sitt arbete under samma mÀngd tid.
Och tillrÀckligt lÄng tid för att till exempel klart ha skett, och inte en gÄng logg-switching.
Och motsvarande kostnader och effekter uppstod.
I mitt fall har jag konfigurerat arbetarnas varaktighet till 8 minuter.
Ett stycke frÄn ett statspak-rapporter, som beskriver databassystemets arbete under belastning.
Databas DB Id Instans Inst Num Starttid Release RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
2929910313 XE 1 07-Sep-20 23:12 18.0.0.0.0 NEJ
VĂ€rdnamn Plattform CPU: Cores Sockets Minne (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
billing.izhevsk1 Linux x86 64-bit 2 2 1 15.6
Snapshot Snap Id Snap Tid Sessioner Curs/Sess Kommentar
~~~~~~~~ ---------- ------------------ -------- --------- ------------------
Börja Snapshot: 1630 07-Sep-20 23:12:27 55 .7
Sluta Snapshot: 1631 07-Sep-20 23:20:29 62 .6
Förlopp: 8.03 (min) Genomsnittlig Aktiv Session: 8.4
DB tid: 67.31 (min) DB CPU: 15.01 (min)
Cache-storlekar Börja Sluta
~~~~~~~~~~~ ---------- ----------
Buffert Cache: 1,392M Std Blockstorlek: 8K
Delad Pool: 288M Logg Buffert: 103,424K
Lastprofil Per Sekund Per Transaktion Per Utförande Per Anrop
~~~~~~~~~~~~ ------------------ ----------------- ----------- -----------
DB tid(s): 8.4 0.0 0.00 0.20
DB CPU(s): 1.9 0.0 0.00 0.04
Redo-storlek: 7,685,765.6 978.4
Logiska lÀsningar: 60,447.0 7.7
BlockÀndringar: 47,167.3 6.0
Fysiska lÀsningar: 8.3 0.0
Fysiska skrivningar: 253.4 0.0
AnvÀndar-anrop: 42.6 0.0
Parser: 23.2 0.0
HÄrda parser: 1.2 0.0
W/A MB bearbetat: 1.0 0.0
Inloggningar: 0.5 0.0
Utförningar: 15,756.5 2.0
Ă
terstÀllningar: 0.0 0.0
Transaktioner: 7,855.1Ă
terkommande till uppdraget för laborationen.
Vi kommer, under lika förutsÀttningar, att variera vÀrdena för sÄdana parametrar i den laborativa databasen:
- Storlek pÄ databasens loggrupper. vÀrdeintervall: [32, 1024] MB;
- Antal loggrupper i databasen. vÀrdeintervall: [2,32];
log_archive_max_processesvÀrdeintervall: [1,8];commit_loggingtvÄ vÀrden tillÄts:batch|immediate;commit_waittvÄ vÀrden tillÄts:wait|nowait;log_buffervÀrdeintervall: [2,128] MB.log_checkpoint_timeoutvÀrdeintervall: [60,1200] sekunderdb_writer_processesvÀrdeintervall: [1,4]undo_retentionvÀrdeintervall: [30;300] sekundertransactions_per_rollback_segmentvÀrdeintervall: [1,8]disk_asynch_iotvÄ vÀrden tillÄts:true|false;filesystemio_optionstillÄtna vÀrden Àr:none|setall|directIO|asynch;db_block_checkingtillÄtna vÀrden Àr:OFF|LOW|MEDIUM|FULL;db_block_checksumtillÄtna vÀrden Àr:OFF|TYPICAL|FULL;
En person med erfarenhet av att underhĂ„lla oracle-databaser kan utan tvekan nu sĂ€ga â vad och vilka vĂ€rden som behöver stĂ€llas in, av de angivna parametrarna och deras tillĂ„tna vĂ€rden, för att uppnĂ„ större produktivitet av databasen, för det databehandling som anges, av programkoden, hĂ€r, ovan.
Men.
Syftet med laborationen Àr att visa att optimeringsalgoritmen, i sig sjÀlv och relativt snabbt, kommer att klargöra detta för oss.
För oss kvarstÄr endast att kolla in dokumentationen för det konfigurerbara systemet, precis sÄ mycket som behövs för att ta reda pÄ: vilka parametrar och inom vilka intervall som ska Àndras.
Och dessutom: koda koden som kommer att implementera arbetet med det konfigurerbara systemet av den valda optimeringsalgoritmen.
SĂ„, nu om koden.
Jag nÀmnde tidigare om cran-r, dvs.: alla manipuleringar med det konfigurerbara systemet styrs i form av ett R-skript.
Egentligen Àr uppgiften, analysen, valet baserat pÄ metriska vÀrden, tillstÄndsvektorer av systemet: det Àr paketet GA ()
Paketet, i det hÀr fallet, passar inte sÀrskilt bra, eftersom det förvÀntar sig att fÄ vektorer (kromosomer, om man anvÀnder paketets terminologi) i form av en sekvens av heltal med decimaler.
Och min vektor, bestĂ„ende av vĂ€rdena för instĂ€llningsparametrarna: det Ă€r 14 storheter â hela tal och strĂ€ngvĂ€rden.
Problemet kan sjÀlvklart enkelt hanteras genom att tilldela strÀngvÀrden specifika heltal.
SÄ, i slutÀndan ser huvuddelen av R-skriptet ut sÄ hÀr:
Anrop av 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@solutionHÀr, med hjÀlp av lower och upper attributen i underprogrammet ga anges egentligen omrÄdet för sökrymd, inom vilket sökningen efter en sÄdan vektor (eller vektorer) kommer att genomföras för att uppnÄ maximalt vÀrde pÄ fitness-funktionen.
ga-underprogrammet genomför sökningen för att maximera fitness-funktionen.
SÄ, det verkar som att i det hÀr fallet behöver fitness-funktionen, vilket förstÄr vektorn som en uppsÀttning av vÀrden för bestÀmda parametrar i databashanteringssystemet, fÄ metrik frÄn databashanteringssystemet.
Det vill sÀga: hur mÄnga transaktioner per sekund databashanteringssystemet hanterar med den specifika konfigurationen och belastningen pÄ databashanteringssystemet.
Det vill sÀga, för att klargöra, mÄste det inuti fitness-funktionen utföras en sÄ kallad multi-step process:
- Bearbetning av den inmatade vektorn av tal â omvandling av den till vĂ€rden för parametrarna i databashanteringssystemet.
- Försök att skapa ett angivet antal redo-grupper i angiven storlek. Notera att försöket: kan misslyckas.
De redan befintliga loggrupperna i databasen, i vilket antal och storlek som helst, mÄste för experimentets renhet tas bort. - Vid framgÄng med föregÄende punkt: att tilldela vÀrdegrunden för konfigurationsparametrarna (Äterigen: det kan uppstÄ ett fel)
- Vid framgÄng med föregÄende punkt: stoppa databasen, starta databasen sÄ att de nyligen angivna parameterstatusarna trÀder i kraft. (Äterigen: det kan uppstÄ ett fel)
- Vid framgÄng med föregÄende punkt: utföra belastningstestet. erhÄlla metrik frÄn databasen.
- à terstÀlla databasen till ursprungligt tillstÄnd, dvs ta bort ytterligare loggrupper, Äterföra den ursprungliga databaskonfigurationen.
Koden för fitnessfunktionen
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)
}SÄ allt arbete: utförs i fitnessfunktionen.
ga-underprogrammet, utför bearbetning av vektorer, eller mer korrekt sagt â kromosomer.
DÀr vi framför allt Àr intresserade av: selektion av kromosomer med sÄdana gener, dÀr fitnessfunktionen ger stora vÀrden.
Detta Àr i sjÀlva verket processen att söka efter den optimala uppsÀttningen kromosomer i ett N-dimensionellt sökomrÄde.
Mycket tydlig, detaljerad , med exempel pÄ R-kod, för arbetet med genetiska algoritmer.
Jag vill sÀrskilt framhÀva tvÄ tekniska punkter.
HjÀlpkallningar, frÄn funktionen evaluate, till exempel stÀnga-starta, stÀlla in vÀrdet av databaspÀrameter, utförs baserat pÄ cran-r funktionen system2
Genom vilken: som kallar pÄ nÄgon bash-script, eller kommando.
Till exempel:
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)
}
}Den andra punkten â raden, evaluate funktionen, med bevarande av det specifika vĂ€rdet av metrik och den motsvarande instĂ€llningsvektorn, i loggfilen:
cat( paste("resultat: ",v_metric," ",v_vector,sep="") , file=v_logfile, sep="n", append=T)Detta Àr viktigt, eftersom frÄn denna datamÀngd kan ytterligare information erhÄllas om vilken av komponenterna i instÀllningsvektorn som har större eller mindre pÄverkan pÄ metrikens vÀrde.
Det vill sÀga: en analys av attributens betydelse kan genomföras.
SĂ„, vad kan komma ut.
I form av ett diagram, om testerna ordnas efter stigande metrik, ser bilden ut sÄ hÀr:

NÄgra data som motsvarar extrema vÀrden pÄ metrik:

HÀr, pÄ skÀrmdumparna med resultaten, pÄpekar jag: vÀrdena pÄ instÀllningsvektorn Àr angivna i termer av koden för fitnessfunktionen, inte i termer av nummerlistan för parametrar/vÀrdenas intervall, som angavs tidigare i texten.
NĂ„vĂ€l. Ăr detta mycket eller lite, ~8 tusen tps: frĂ„gan Ă€r separat.
Inom ramen för laboratoriearbetet â Ă€r detta nummer, hur som helst, oviktigt, den viktiga dynamiken, hur detta vĂ€rde förĂ€ndras.
Dynamiken hÀr Àr bra.
Det Àr uppenbart att, minst en faktor, som signifikant pÄverkar metrikens vÀrde, ga-algoritmen, med att iterera genom vektor-kromosomer: tÀcker.
Baserat pÄ en ganska livlig dynamik i kurvans vÀrden finns det minst en faktor som, Àven om den Àr betydligt mindre, ÀndÄ pÄverkar.
HÀr behövs attribute-importance analys för att förstÄ vilka attribut (i det hÀr fallet komponenter av justeringsvektorn) som pÄverkar vÀrdet pÄ metrik och hur starkt.
Och frÄn denna information: förstÄ vilka faktorer som pÄverkades av förÀndringar i de betydande attributen.
Utför attribute-importance kan göras pÄ olika sÀtt.
För dessa ÀndamÄl gillar jag algoritmen randomForest av samma namn R-paketet ()
randomForest, som jag förstÄr hur det fungerar generellt och dess metod för att bedöma attributens vikt specifikt, bygger en modell av beroende mellan svarsvariabeln och attributen.
I vÄrt fall Àr svarsvariabeln den metrik som erhÄlls frÄn databaser, i belastningstester: tps;
Och attributen Àr komponenterna av justeringsvektorn.
SĂ„ bedömer den randomForest vikten av varje attribut i modellen med tvĂ„ siffror: %IncMSE â hur nĂ€rvaron/absensen av detta attribut i modellen förĂ€ndrar MSE-kvaliteten för denna modell (Mean Squared Error);
Och IncNodePurity â det Ă€r ett nummer som visar hur bra det gĂ„r att separera datasetet med observationer baserat pĂ„ vĂ€rdena av detta attribut, sĂ„ att en del innehĂ„ller data med ett visst vĂ€rde av den förklarade metrik, medan den andra har ett annat vĂ€rde av metrik.
AlltsÄ: hur mycket detta Àr ett klassificerande attribut (det mest tydliga, ryska förklaringen jag har sett om random forest) ).
Arbetar-bonde R-kod för att bearbeta datasetet med resultaten av belastningstester:
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$importanceMan kan direkt justera hyperparametrarna för algoritmen och, med tanke pÄ modellkvaliteten, vÀlja en mer exakt modell för att göra förutsÀgelser pÄ valideringsdatasetet.
Man kan skriva en funktion för detta arbete (för övrigt â Ă„terigen, med nĂ„got optimeringsalgoritm).
Man kan anvÀnda R-paketet caret, det spelar ingen roll.
I slutÀndan fÄr vi i det hÀr fallet ett resultat för bedömningen av attributens betydelse:

NÄvÀl. SÄledes kan vi pÄbörja de globala övervÀgandena:
- Det visar sig att det mest signifikanta, under dessa testförhÄllanden, var parameter
commit_wait
Tekniskt sett anger den lÀget för inskrivning av redo-data frÄn loggbufferten i nuvarande journalgrupp: synkront eller asynkront.
VÀrdenowaitvilket ger en nÀstan vertikal, multiplicerad ökning av tps-metriken: det Àr aktiveringen av asynkron io-lÀge i redo-grupper.
En separat frÄga Àr om detta bör göras i produktionsdatabasen. HÀr nöjer jag mig med att konstatera: det Àr en betydande faktor. - Det Àr logiskt att storleken pÄ loggbufferten Àr en betydande faktor.
Ju mindre storleken pÄ loggbufferten Àr, desto mindre buffertkapacitet har den, desto oftare intrÀffar överfyllningar och/eller kan inte utrymme avsÀttas för en portion nya redo-data.
Och det betyder: förseningar relaterade till allokeringen av utrymme i loggbufferten och/eller avskrivning av redo-data frÄn den till redo-grupper.
Dessa förseningar bör sjÀlvklart pÄverka databasens transaktionskapacitet. - Parameter
db_block_checksum: ja, det Àr ocksÄ ganska klart - behandlingen av transaktioner leder till bildandet av dirty blocks i databasens buffertcache.
Som, med aktiverad checksum-kontroll för datablokkar, databasen mÄste hantera - berÀkna dessa checksummer frÄn datablokkroppen, jÀmföra dem med vad som Àr skrivet i datablokkhuvudet: stÀmmer/inte stÀmmer.
Ett sÄdant arbete kan i sin tur inte undvika att försena databehandlingen, och dÀrmed framstÄr parametern och mekanismen som stÀller in den parametern - som betydelsefulla.
DÀrför erbjuder leverantören i dokumentationen för denna parameter olika vÀrden (för parametern) och pÄpekar att - ja, det kommer att finnas pÄverkan, men, hÀr Àr olika vÀrden, Ànda till "av" och olika pÄverkan, ni kan vÀlja.
Och den övergripande slutsatsen.
TillvÀgagÄngssÀttet visar sig vara fullt fungerande.
Det möjliggör helt, i de tidiga skedena av belastningstestning av ett service-system, att vÀlja dess (systemets) optimala konfiguration för belastning utan att behöva djupt förstÄ systemets instÀllningar för belastning.
Men det utesluter inte helt - Ätminstone pÄ förstÄelsenivÄ: "justeringshandtag" och tillÄtna rotationsomrÄden för dessa handtag mÄste systemet kÀnna till.
Dessutom kan tillvÀgagÄngssÀttet relativt snabbt hitta en optimal systemkonfiguration.
Och man kan, efter testerna, fÄ information om förhÄllandet mellan kvalitetsmÄtt pÄ systemets arbete och vÀrdena för systemets justeringsparametrar.
Detta bör naturligtvis bidra till att skapa en djupare förstÄelse för systemet och dess funktion, Ätminstone under denna belastning.
Praktiskt innebÀr detta: kostnaden för att sÀtta sig in i det justerbara systemet jÀmfört med kostnaderna för att förbereda en sÄdan systemtestning.
Jag vill sÀrskilt pÄpeka: i detta tillvÀgagÄngssÀtt Àr graden av adekvat systemtestning kritiskt viktig i förhÄllande till de driftsförhÄllanden som det kommer att ha i produktionsmiljö.
Tack för er uppmÀrksamhet och tid.
KĂ€lla: habr.com
