Sveiki
NolÄmu padalÄ«ties ar savu atradumu ā pÄrdomu, izmÄÄ£inÄjumu un kļūdu augli.
KopumÄ: tas, protams, nav atradums - tam visam jau sen vajadzÄja zinÄt tiem, kas nodarbojas ar lietiŔķo statistisko datu apstrÄdi un jebkuras sistÄmas optimizÄciju, ne vienmÄr tieÅ”i DBVS.
Un: jÄ, viÅi zina, viÅi raksta interesantus rakstus par saviem pÄtÄ«jumiem,
No otras puses: es neredzu, ka Ŕī pieeja bÅ«tu plaÅ”i pieminÄta vai izplatÄ«ta internetÄ IT speciÄlistu, DBA, vidÅ«.
TÄtad, pie lietas.
PieÅemsim, ka mums ir uzdevums: izveidot noteiktu pakalpojumu sistÄmu, lai apkalpotu kÄdu darbu.
Par Å”o darbu ir zinÄms: kas tas ir, kÄ tiek mÄrÄ«ta Ŕī darba kvalitÄte un kÄds ir Ŕīs kvalitÄtes mÄrÄ«Å”anas kritÄrijs.
PieÅemsim arÄ«, ka tas ir vairÄk vai mazÄk zinÄms un saprotams: kÄ tieÅ”i tiek veikts darbs Å”ajÄ pakalpojumu sistÄmÄ (vai ar to).
āVairÄk vai mazÄkā - tas nozÄ«mÄ, ka ir iespÄjams sagatavot (vai kaut kur iegÅ«t) noteiktu rÄ«ku, utilÄ«tu, servisu, ko var sintezÄt un pielietot sistÄmÄ ar testa slodzi, kas ir pietiekami adekvÄta tam, kas bÅ«s ražoÅ”anÄ, apstÄkļos, kas ir pietiekami piemÄroti darbam ražoÅ”anÄ.
Nu, pieÅemsim, ka ir zinÄms Ŕīs pakalpojumu sistÄmas regulÄÅ”anas parametru kopums, ar kuru palÄ«dzÄ«bu var konfigurÄt Å”o sistÄmu tÄs darba produktivitÄtes ziÅÄ.
Un kÄda ir problÄma - nav pietiekami pilnÄ«ga izpratne par Å”o pakalpojumu sistÄmu, kas ļauj prasmÄ«gi konfigurÄt Ŕīs sistÄmas iestatÄ«jumus turpmÄkai slodzei uz dotÄs platformas un iegÅ«t nepiecieÅ”amo sistÄmas produktivitÄti.
Nu. TÄ tas ir gandrÄ«z vienmÄr.
Ko jūs varat darīt Ŕeit?
Nu, pirmais, kas nÄk prÄtÄ, ir apskatÄ«t Ŕīs sistÄmas dokumentÄciju. Saprotiet, kÄdi ir regulÄÅ”anas parametru vÄrtÄ«bu pieļaujamie diapazoni. Un, piemÄram, izmantojot koordinÄtu nolaiÅ”anÄs metodi, testos atlasiet sistÄmas parametru vÄrtÄ«bas.
Tie. pieŔķiriet sistÄmai sava veida konfigurÄciju Ä«paÅ”as vÄrtÄ«bu kopas veidÄ tÄs konfigurÄcijas parametriem.
Pielietojiet tai testa slodzi, izmantojot Ŕo paŔu rīku-utilītu, slodzes ģeneratoru.
Un paskatieties uz vÄrtÄ«bu ā atbildi vai sistÄmas kvalitÄtes metriku.
Otra doma var bÅ«t secinÄjums, ka tas ir ļoti ilgs laiks.
Nu, tas ir: ja ir daudz regulÄÅ”anas parametru, ja to vÄrtÄ«bu diapazoni ir lieli, ja katra atseviŔķa slodzes pÄrbaude aizÅem daudz laika, tad: jÄ, tas viss var aizÅemt nepieÅemami daudz no laika.
LÅ«k, ko jÅ«s varat saprast un atcerÄties.
JÅ«s varat uzzinÄt, ka pakalpojumu sistÄmas iestatÄ«jumu parametru vÄrtÄ«bu kopÄ ir vektors kÄ dažu vÄrtÄ«bu secÄ«ba.
Katrs Å”Äds vektors, ja citas lietas ir vienÄdas (jo Å”is vektors to neietekmÄ), atbilst pilnÄ«gi noteiktai metrikas vÄrtÄ«bai - sistÄmas darbÄ«bas kvalitÄtes rÄdÄ«tÄjam testa slodzes apstÄkļos.
Ti
ApzÄ«mÄsim sistÄmas konfigurÄcijas vektoru kÄ Kur ; Kur ā sistÄmas konfigurÄcijas parametru skaits, cik no Å”iem parametriem ir.
Un tam atbilstoÅ”Ä metrikas vÄrtÄ«ba apzÄ«mÄsim to kÄ
, tad mÄs iegÅ«stam funkciju:
Nu tad: manÄ gadÄ«jumÄ viss uzreiz sanÄk: gandrÄ«z aizmirsts no studentu laikiem, algoritmi funkcijas galÄjÄ«bas meklÄÅ”anai.
Labi, bet Å”eit rodas organizatorisks un lietiŔķs jautÄjums: kuru algoritmu izmantot.
- TÄdÄ ziÅÄ - lai ar roku mazÄk varÄtu kodÄt.
- Un lai tas darbotos, t.i. atrada ekstrÄmu (ja tÄds ir), nu, vismaz ÄtrÄk par koordinÄtu nolaiÅ”anos.
Pirmais punkts norÄda, ka mums ir jÄskatÄs uz dažÄm vidÄm, kurÄs Å”Ädi algoritmi jau ir ieviesti un kaut kÄdÄ veidÄ ir gatavi lietoÅ”anai kodÄ.
Nu es zinu python
Šø cran-r
Otrais punkts nozÄ«mÄ, ka jums ir jÄizlasa par paÅ”iem algoritmiem, kas tie ir, kÄdas ir to prasÄ«bas un to darba iezÄ«mes.
Un tas, ko tie dod, var bÅ«t noderÄ«gi blakusefekti ā rezultÄti vai tieÅ”i no paÅ”a algoritma.
Vai arÄ« tos var iegÅ«t no algoritma rezultÄtiem.
Daudz kas ir atkarÄ«gs no ievades apstÄkļiem.
PiemÄram, ja kÄda iemesla dÄļ jums ir nepiecieÅ”ams ÄtrÄk iegÅ«t rezultÄtu, jums ir jÄmeklÄ gradienta nolaiÅ”anÄs algoritmi un jÄizvÄlas viens no tiem.
Vai arÄ«, ja laiks nav tik svarÄ«gs, varat, piemÄram, izmantot stohastiskÄs optimizÄcijas metodes, piemÄram, Ä£enÄtisko algoritmu.
Es ierosinu Ŕīs pieejas darbu, izvÄloties sistÄmas konfigurÄciju, izmantojot Ä£enÄtisko algoritmu, izskatÄ«t nÄkamajÄ, tÄ sakot, laboratorijas darbÄ.
OriÄ£inÄls:
- Lai pastÄv kÄ pakalpojumu sistÄma:
oracle xe 18c
- Lai tas kalpo transakciju darbÄ«bai un mÄrÄ·im: iegÅ«t pÄc iespÄjas lielÄku apakÅ”datubÄzes caurlaidspÄju, darÄ«jumos/sek.
- DarÄ«jumi var bÅ«t ļoti atŔķirÄ«gi pÄc darba ar datiem un darba konteksta.
Vienosimies, ka tie ir darÄ«jumi, kuros netiek apstrÄdÄts liels tabulas datu apjoms.
TÄdÄ ziÅÄ, ka tie neÄ£enerÄ vairÄk atsaukÅ”anas datu nekÄ pÄrtaisÄ«Å”ana un neapstrÄdÄ lielu rindu un lielu tabulu procentuÄlo daļu.
Tie ir darÄ«jumi, kas maina vienu rindu vairÄk vai mazÄk lielÄ tabulÄ ar nelielu skaitu indeksu Å”ajÄ tabulÄ.
Å ÄdÄ situÄcijÄ: darÄ«jumu apstrÄdes apakÅ”datu bÄzes produktivitÄti ar atrunu noteiks redox datu bÄzes apstrÄdes kvalitÄte.
Atruna - ja mÄs runÄjam tieÅ”i par subdb iestatÄ«jumiem.
Jo vispÄrÄ«gÄ gadÄ«jumÄ starp SQL sesijÄm var bÅ«t, piemÄram, transakciju bloÄ·ÄÅ”anas, kas izriet no lietotÄja darba dizaina ar tabulas datiem un/vai tabulas modeļa.
Kas, protams, nomÄcoÅ”i ietekmÄs TPS metriku, un tas bÅ«s eksogÄns faktors attiecÄ«bÄ pret apakÅ”datu bÄzi: lÅ«k, Å”Ädi tika izveidots tabulas modelis un darbs ar tajÄ esoÅ”ajiem datiem, kas rada aizsprostojumus.
TÄpÄc eksperimenta tÄ«rÄ«bas labad mÄs izslÄgsim Å”o faktoru, un tÄlÄk es paskaidroÅ”u, kÄ tieÅ”i.
- PrecÄ«zÄk pieÅemsim, ka 100% datu bÄzei iesniegto SQL komandu ir DML komandas.
Lai testos lietotÄja darba ar apakÅ”datu bÄzi raksturojums ir vienÄds.
Proti: skl sesiju skaits, tabulas dati, kÄ skl sesijas ar tÄm darbojas. - Subd darbojas
FORCE LOGGING
,ARCHIVELOG
modifikÄcijas. AtmiÅas datu bÄzes režīms ir izslÄgts apakÅ”lÄ«menÄ«. - PÄrtaisÄ«t žurnÄlus: atrodas atseviÅ”Ä·Ä failu sistÄmÄ, atseviÅ”Ä·Ä ādiskÄā;
PÄrÄjÄ datu bÄzes fiziskÄ sastÄvdaļa: citÄ, atseviÅ”Ä·Ä failu sistÄmÄ, atseviÅ”Ä·Ä ādiskÄā:
SÄ«kÄka informÄcija par fizisko ierÄ«ci. laboratorijas datu bÄzes komponenti
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
SÄkotnÄji Å”ajos slodzes apstÄkļos es gribÄju izmantot transakciju subd
Tam ir tik brÄ«niŔķīga iezÄ«me, es citÄÅ”u autoru:
SLOB pamatÄ ir āSLOB metodeā. SLOB metodes mÄrÄ·is ir pÄrbaudÄ«t platformas
bez strÄ«da par pieteikumu. Nevar nodroÅ”inÄt maksimÄlu aparatÅ«ras veiktspÄju
izmantojot lietojumprogrammas kodu, kas, piemÄram, ir saistÄ«ts ar lietojumprogrammas bloÄ·ÄÅ”anu vai pat
Oracle datu bÄzes bloku koplietoÅ”ana. TieÅ”i tÄ ā datu koplietoÅ”ana rada papildu izmaksas
datu blokos! TaÄu SLOB savÄ noklusÄjuma izvietoÅ”anÄ ir imÅ«na pret Å”Ädu strÄ«du.
Å Ä« deklarÄcija: atbilst, tÄ ir.
Ir Ärti regulÄt cl sesiju paralÄlisma pakÄpi, tas ir galvenais -t
palaidiet utilītu runit.sh
no SLOB
DML komandu procentuÄlais daudzums tiek regulÄts apakÅ”grupai nosÅ«tÄ«to Ä«sziÅu skaitÄ, katrÄ teksta sesijÄ, parametrÄ UPDATE_PCT
AtseviŔķi un ļoti Ärti: SLOB
pati pirms un pÄc ielÄdes sesijas - sagatavo statspack vai awr-snapshots (kas ir iestatÄ«ts sagatavoÅ”anÄ).
TomÄr izrÄdÄ«jÄs, ka SLOB
neatbalsta SQL sesijas, kuru ilgums ir mazÄks par 30 sekundÄm.
TÄpÄc es vispirms iekodÄju savu, strÄdnieku-zemnieku iekrÄvÄja versiju, un tad tÄ palika ekspluatÄcijÄ.
SkaidrÄ«bas labad ļaujiet man paskaidrot, ko dara iekrÄvÄjs un kÄ tas to dara.
BÅ«tÄ«bÄ iekrÄvÄjs izskatÄs Å”Ädi:
StrÄdnieka kods
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
Darbinieki tiek palaisti Å”ÄdÄ veidÄ:
SkriejoÅ”i strÄdnieki
echo "starting test, duration: ${TEST_DURATION}" >> "$v_logfile"
for((i=1;i<="$SQLSESS_COUNT";i++))
do
echo "sql-session: ${i}" >> "$v_logfile"
dotx "$i" "${TEST_DURATION}" &
done
echo "waiting..." >> "$v_logfile"
wait
Un galdi strÄdniekiem tiek sagatavoti Å”Ädi:
Tabulu veidoŔana
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<1000
;
create index testtab_&&wnum._idx on system.testtab_&&wnum (col1);
--alter table system.testtab_&&wnum nologging;
--alter index system.testtab_&&wnum._idx nologging;
exit
__EOF__
}
export -f createtable
seq 1 1 "$SQLSESS_COUNT" | xargs -n 1 -P 4 -I {} -t bash -c "createtable "{}"" | tee -a "$v_logfile"
echo "createtable done" >> "$v_logfile"
Tie. Katram darbiniekam (praktiski: atseviŔķa SQL sesija DB) tiek izveidota atseviŔķa tabula, ar kuru darbinieks strÄdÄ.
Tas nodroÅ”ina, ka starp darbinieku sesijÄm nav darÄ«jumu bloÄ·ÄÅ”anas.
Katrs strÄdnieks: dara vienu un to paÅ”u, ar savu galdu, visi galdi ir vienÄdi.
Visi darbinieki veic darbu vienÄdu laiku.
TurklÄt pietiekami ilgu laiku, lai, piemÄram, baļķu pÄrslÄgÅ”ana noteikti notiktu, un vairÄk nekÄ vienu reizi.
AttiecÄ«gi radÄs saistÄ«tÄs izmaksas un sekas.
ManÄ gadÄ«jumÄ strÄdnieku darba ilgumu konfigurÄju uz 8 minÅ«tÄm.
Statspack pÄrskata daļa, kurÄ aprakstÄ«ta apakÅ”grupas darbÄ«ba slodzes laikÄ
Database DB Id Instance Inst Num Startup Time Release RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
2929910313 XE 1 07-Sep-20 23:12 18.0.0.0.0 NO
Host Name Platform CPUs Cores Sockets Memory (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
billing.izhevsk1 Linux x86 64-bit 2 2 1 15.6
Snapshot Snap Id Snap Time Sessions Curs/Sess Comment
~~~~~~~~ ---------- ------------------ -------- --------- ------------------
Begin Snap: 1630 07-Sep-20 23:12:27 55 .7
End Snap: 1631 07-Sep-20 23:20:29 62 .6
Elapsed: 8.03 (mins) Av Act Sess: 8.4
DB time: 67.31 (mins) DB CPU: 15.01 (mins)
Cache Sizes Begin End
~~~~~~~~~~~ ---------- ----------
Buffer Cache: 1,392M Std Block Size: 8K
Shared Pool: 288M Log Buffer: 103,424K
Load Profile Per Second Per Transaction Per Exec Per Call
~~~~~~~~~~~~ ------------------ ----------------- ----------- -----------
DB time(s): 8.4 0.0 0.00 0.20
DB CPU(s): 1.9 0.0 0.00 0.04
Redo size: 7,685,765.6 978.4
Logical reads: 60,447.0 7.7
Block changes: 47,167.3 6.0
Physical reads: 8.3 0.0
Physical writes: 253.4 0.0
User calls: 42.6 0.0
Parses: 23.2 0.0
Hard parses: 1.2 0.0
W/A MB processed: 1.0 0.0
Logons: 0.5 0.0
Executes: 15,756.5 2.0
Rollbacks: 0.0 0.0
Transactions: 7,855.1
Atgriežoties pie laboratorijas darbiem.
Ja citas lietas bÅ«s vienÄdas, mÄs mainÄ«sim Å”Ädu laboratorijas apakÅ”datu bÄzes parametru vÄrtÄ«bas:
- Datu bÄzes žurnÄlu grupu lielums. vÄrtÄ«bu diapazons: [32, 1024] MB;
- ŽurnÄlu grupu skaits datu bÄzÄ. vÄrtÄ«bu diapazons: [2,32];
log_archive_max_processes
vÄrtÄ«bu diapazons: [1,8];commit_logging
ir atļautas divas vÄrtÄ«bas:batch|immediate
;commit_wait
ir atļautas divas vÄrtÄ«bas:wait|nowait
;log_buffer
vÄrtÄ«bu diapazons: [2,128] MB.log_checkpoint_timeout
vÄrtÄ«bu diapazons: [60,1200 XNUMX] sekundesdb_writer_processes
vÄrtÄ«bu diapazons: [1,4]undo_retention
vÄrtÄ«bu diapazons: [30;300] sekundestransactions_per_rollback_segment
vÄrtÄ«bu diapazons: [1,8]disk_asynch_io
ir atļautas divas vÄrtÄ«bas:true|false
;filesystemio_options
ir atļautas Å”Ädas vÄrtÄ«bas:none|setall|directIO|asynch
;db_block_checking
ir atļautas Å”Ädas vÄrtÄ«bas:OFF|LOW|MEDIUM|FULL
;db_block_checksum
ir atļautas Å”Ädas vÄrtÄ«bas:OFF|TYPICAL|FULL
;
CilvÄks ar pieredzi Oracle datu bÄzu uzturÄÅ”anÄ noteikti jau var pateikt, kÄdas un uz kÄdÄm vÄrtÄ«bÄm ir jÄiestata, no norÄdÄ«tajiem parametriem un to pieļaujamÄm vÄrtÄ«bÄm, lai iegÅ«tu lielÄku datu bÄzes produktivitÄti darbam ar datiem, ko norÄda pieteikuma kods Å”eit iepriekÅ”.
Bet
Laboratorijas darba jÄga ir parÄdÄ«t, ka pats optimizÄcijas algoritms to mums noskaidros salÄ«dzinoÅ”i Ätri.
Mums atliek tikai ieskatÄ«ties dokumentÄ, izmantojot pielÄgojamo sistÄmu, lai uzzinÄtu, kÄdus parametrus un kÄdos diapazonos mainÄ«t.
Un arÄ«: iekodÄjiet kodu, kas tiks izmantots darbam ar izvÄlÄtÄ optimizÄcijas algoritma pielÄgoto sistÄmu.
TÄtad, tagad par kodu.
Es runÄju iepriekÅ” par cran-r
, t.i.: visas manipulÄcijas ar pielÄgoto sistÄmu tiek organizÄtas R skripta formÄ.
Faktiskais uzdevums, analÄ«ze, atlase pÄc metriskÄs vÄrtÄ«bas, sistÄmas stÄvokļa vektori: Ŕī ir pakete GA
(
Pakete Å”ajÄ gadÄ«jumÄ nav Ä«paÅ”i piemÄrota tÄdÄ ziÅÄ, ka tÄ sagaida, ka vektori (hromosomas, ja paketes izteiksmÄ) tiks norÄdÄ«ti skaitļu virkÅu veidÄ ar daļÄju daļu.
Un mans vektors no iestatÄ«Å”anas parametru vÄrtÄ«bÄm: tie ir 14 daudzumi - veseli skaitļi un virkÅu vÄrtÄ«bas.
Protams, no problÄmas var viegli izvairÄ«ties, virkÅu vÄrtÄ«bÄm pieŔķirot dažus konkrÄtus skaitļus.
TÄdÄjÄdi galu galÄ R skripta galvenais gabals izskatÄs Å”Ädi:
Zvaniet uz 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
Lūk, ar palīdzību lower
Šø upper
apakŔprogrammas atribūti ga
bÅ«tÄ«bÄ ir norÄdÄ«ts meklÄÅ”anas telpas apgabals, kurÄ tiks veikta tÄda vektora (vai vektoru) meklÄÅ”ana, kuram tiks iegÅ«ta atbilstÄ«bas funkcijas maksimÄlÄ vÄrtÄ«ba.
ApakÅ”programma ga veic meklÄÅ”anu, maksimÄli palielinot fitnesa funkciju.
Nu, tad izrÄdÄs, ka Å”ajÄ gadÄ«jumÄ fitnesa funkcijai, saprotot vektoru kÄ vÄrtÄ«bu kopu noteiktiem subd parametriem, jÄsaÅem metrika no apakÅ”daļas.
Tas ir: cik daudz ar noteiktu apakÅ”grupas iestatÄ«jumu un noteiktu apakÅ”grupas slodzi: apakÅ”grupa apstrÄdÄ darÄ«jumus sekundÄ.
Tas nozÄ«mÄ, ka, atlokot, fitnesa funkcijÄ ir jÄveic Å”Ädas vairÄkas darbÄ«bas:
- ApstrÄdÄjiet skaitļu ievades vektoru - pÄrveidojiet to apakÅ”datu parametru vÄrtÄ«bÄs.
- MÄÄ£inÄjums izveidot noteiktu skaitu noteikta izmÄra pÄrtaisÄ«Å”anas grupu. TurklÄt mÄÄ£inÄjums var bÅ«t neveiksmÄ«gs.
ŽurnÄlu grupas, kas jau eksistÄja apakÅ”Ä, kaut kÄdÄ daudzumÄ un kÄda izmÄra, eksperimenta tÄ«rÄ«bas labad - d.b. dzÄsts. - Ja iepriekÅ”Äjais punkts ir veiksmÄ«gs: konfigurÄcijas parametru vÄrtÄ«bu norÄdÄ«Å”ana datu bÄzÄ (atkal: var bÅ«t kļūme)
- Ja iepriekÅ”ÄjÄ darbÄ«ba ir veiksmÄ«ga: apakÅ”grupas apturÄÅ”ana, apakÅ”grupas palaiÅ”ana, lai stÄtos spÄkÄ tikko norÄdÄ«tÄs parametru vÄrtÄ«bas. (atkal: var bÅ«t kļūme)
- Ja iepriekÅ”ÄjÄ darbÄ«ba ir veiksmÄ«ga: veiciet slodzes pÄrbaudi. iegÅ«t metriku no apakÅ”d.
- Atgrieziet subd sÄkotnÄjÄ stÄvoklÄ«, t.i. dzÄst papildu žurnÄlu grupas, atgriezt sÄkotnÄjo apakÅ”datubÄzes konfigurÄciju darbam.
Fitnesa funkcijas kods
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 ) {
opn$filesystemio_options="setall"
}
if ( round(p_par[12],digit=0) > 20 && round(p_par[12],digit=0) <= 30 ) {
opn$filesystemio_options="directIO"
}
if ( 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 ) {
opn$db_block_checking="LOW"
}
if ( round(p_par[13],digit=0) > 20 && round(p_par[13],digit=0) <= 30 ) {
opn$db_block_checking="MEDIUM"
}
if ( 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="TYPICAL"
}
if ( 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)
}
Tas. viss darbs: veikts fitnesa funkcijÄ.
Ga-apakÅ”programma apstrÄdÄ vektorus vai, pareizÄk sakot, hromosomas.
KurÄ mums vissvarÄ«gÄkÄ ir hromosomu atlase ar gÄniem, kuriem fitnesa funkcija rada lielas vÄrtÄ«bas.
Tas bÅ«tÄ«bÄ ir process, kurÄ tiek meklÄts optimÄlais hromosomu komplekts, izmantojot vektoru N-dimensijas meklÄÅ”anas telpÄ.
Ä»oti skaidri, detalizÄti
Es vÄlos atseviŔķi atzÄ«mÄt divus tehniskos punktus.
Papildzvani no funkcijas evaluate
, piemÄram, stop-start, iestatot subd parametra vÄrtÄ«bu, tiek veiktas, pamatojoties uz cran-r
funkcijas system2
Ar kuras palÄ«dzÄ«bu: tiek izsaukts kÄds bash skripts vai komanda.
PiemÄram:
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)
}
}
Otrais punkts ir līnija, evaluate
funkcijas, saglabÄjot noteiktu metrikas vÄrtÄ«bu un tai atbilstoÅ”o regulÄÅ”anas vektoru žurnÄla failÄ:
cat( paste("result: ",v_metric," ",v_vector,sep="") , file=v_logfile, sep="n", append=T)
Tas ir svarÄ«gi, jo no Ŕī datu masÄ«va bÅ«s iespÄjams iegÅ«t papildu informÄciju par to, kura no skaÅoÅ”anas vektora sastÄvdaļÄm vairÄk vai mazÄk ietekmÄ metrikas vÄrtÄ«bu.
Tas ir: bÅ«s iespÄjams veikt atribÅ«tu-importamce analÄ«zi.
TÄtad, kas var notikt?
Diagrammas formÄ, ja pasÅ«tÄt testus augoÅ”Ä metrikas secÄ«bÄ, attÄls ir Å”Äds:
Daži dati, kas atbilst metrikas galÄjÄm vÄrtÄ«bÄm:
Å eit, ekrÄnuzÅÄmumÄ ar rezultÄtiem, es precizÄÅ”u: regulÄÅ”anas vektora vÄrtÄ«bas ir norÄdÄ«tas fitnesa funkcijas koda izteiksmÄ, nevis parametru skaitļu saraksta / parametru vÄrtÄ«bu diapazona izteiksmÄ, kas tika formulÄts. augstÄk tekstÄ.
Nu. Vai tas ir daudz vai maz, ~8 tÅ«kstoÅ”i tps: atseviŔķs jautÄjums.
Laboratorijas darbu ietvaros Å”is skaitlis nav svarÄ«gs, svarÄ«ga ir dinamika, kÄ Å”Ä« vÄrtÄ«ba mainÄs.
Dinamika Ŕeit ir laba.
Ir acÄ«mredzams, ka vismaz viens faktors bÅ«tiski ietekmÄ metrikas vÄrtÄ«bu, ga-algoritms, Ŕķirojot pa hromosomu vektoriem: aptverts.
Spriežot pÄc diezgan spÄcÄ«gÄs lÄ«kÅu vÄrtÄ«bu dinamikas, ir vÄl vismaz viens faktors, kas, lai arÄ« ievÄrojami mazÄks, tomÄr ietekmÄ.
Šeit jums tas ir nepiecieŔams attribute-importance
analÄ«ze, lai saprastu, kÄdi atribÅ«ti (Å”ajÄ gadÄ«jumÄ skaÅoÅ”anas vektora komponenti) un cik lielÄ mÄrÄ tie ietekmÄ metrikas vÄrtÄ«bu.
Un no Ŕīs informÄcijas: izprotiet, kÄdus faktorus ietekmÄja nozÄ«mÄ«gu atribÅ«tu izmaiÅas.
skrÄjiens attribute-importance
iespÄjams dažÄdos veidos.
Šiem nolūkiem man patīk algoritms randomForest
R pakotne ar tÄdu paÅ”u nosaukumu (
randomForest
, kÄ es saprotu viÅa darbu kopumÄ un viÅa pieeju, lai novÄrtÄtu atribÅ«tu svarÄ«gumu, jo Ä«paÅ”i, veido noteiktu modeli atbildes mainÄ«gÄ atkarÄ«bai no atribÅ«tiem.
MÅ«su gadÄ«jumÄ atbildes mainÄ«gais ir metrika, kas iegÅ«ta no datu bÄzes slodzes testos: tps
;
Un atribÅ«ti ir regulÄÅ”anas vektora sastÄvdaļas.
Un tÄ randomForest
novÄrtÄ katra modeļa atribÅ«ta nozÄ«mi ar diviem skaitļiem: %IncMSE
ā kÄ Å”Ä« atribÅ«ta esamÄ«ba/neesamÄ«ba modelÄ« maina Ŕī modeļa MSE kvalitÄti (Mean Squared Error);
Un IncNodePurity ir skaitlis, kas atspoguļo to, cik labi, pamatojoties uz Ŕī atribÅ«ta vÄrtÄ«bÄm, var sadalÄ«t datu kopu ar novÄrojumiem tÄ, lai vienÄ daÄ¼Ä bÅ«tu dati ar vienu izskaidrotÄs metrikas vÄrtÄ«bu, bet otrÄ ar cita metrikas vÄrtÄ«ba.
Nu, tas ir: cik lielÄ mÄrÄ tas ir klasificÄjoÅ”s atribÅ«ts (visskaidrÄko skaidrojumu krievu valodÄ redzÄju RandomForest
StrÄdnieka-zemnieka R-kods datu kopas apstrÄdei ar slodzes testu rezultÄtiem:
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
JÅ«s varat tieÅ”i ar savÄm rokÄm atlasÄ«t algoritma hiperparametrus un, koncentrÄjoties uz modeļa kvalitÄti, atlasÄ«t modeli, kas precÄ«zÄk atbilst validÄcijas datu kopas prognozÄm.
Å im darbam var uzrakstÄ«t kaut kÄdu funkciju (starp citu, atkal izmantojot kaut kÄdu optimizÄcijas algoritmu).
Varat izmantot R pakotni caret
, ne jau būtība ir svarīga.
RezultÄtÄ Å”ajÄ gadÄ«jumÄ tiek iegÅ«ts Å”Äds rezultÄts, lai novÄrtÄtu atribÅ«tu svarÄ«guma pakÄpi:
Nu. TÄdÄjÄdi mÄs varam sÄkt globÄlas pÄrdomas:
- IzrÄdÄs, ka visnozÄ«mÄ«gÄkais Å”ajos testÄÅ”anas apstÄkļos bija parametrs
commit_wait
Tehniski tas norÄda izpildes režīmu io operÄcijai, rakstot redo datus no subdb žurnÄla bufera uz paÅ”reizÄjo žurnÄlu grupu: sinhrona vai asinhrona.
VÄrtÄ«banowait
kas rada gandrÄ«z vertikÄlu, vairÄkkÄrtÄju tps metrikas vÄrtÄ«bas pieaugumu: tas ir asinhronÄ io režīma iekļauÅ”ana pÄrtaisÄ«Å”anas grupÄs.
AtseviŔķs jautÄjums ir par to, vai jums tas jÄdara pÄrtikas datubÄzÄ. Å eit es aprobežojos tikai ar apgalvojumu: tas ir nozÄ«mÄ«gs faktors. - LoÄ£iski, ka subd: žurnÄla bufera lielums izrÄdÄs bÅ«tisks faktors.
Jo mazÄks ir žurnÄla bufera izmÄrs, jo mazÄka ir tÄ buferizÄcijas jauda, āājo biežÄk tas pÄrplÅ«st un/vai nespÄj tajÄ pieŔķirt brÄ«vu apgabalu daļai jaunu redoksdatu.
Tas nozÄ«mÄ: aizkaves, kas saistÄ«tas ar vietas pieŔķirÅ”anu žurnÄla buferÄ« un/vai pÄrtaisÄ«Å”anas datu izmeÅ”anu no tÄ pÄrtaisÄ«Å”anas grupÄs.
Å Ä«s kavÄÅ”anÄs, protams, ietekmÄ un ietekmÄ darÄ«jumu datu bÄzes caurlaidspÄju. - Parametrs
db_block_checksum
: labi, arÄ« kopumÄ ir skaidrs - darÄ«jumu apstrÄdes rezultÄtÄ apakÅ”datu bÄzes bufera keÅ”atmiÅÄ veidojas darty bloki.
Kura, pÄrbaudot datu bloku kontrolsummas ir iespÄjota, datu bÄzei ir jÄapstrÄdÄ - jÄaprÄÄ·ina Ŕīs kontrolsummas no datu bloka pamatteksta, jÄpÄrbauda ar to, kas rakstÄ«ts datu bloka galvenÄ: atbilst/nesakrÄ«t.
Å Äds darbs atkal nevar neaizkavÄt datu apstrÄdi, un attiecÄ«gi parametrs un mehÄnisms, kas nosaka Å”o parametru, izrÄdÄs bÅ«tisks.
TÄpÄc pÄrdevÄjs Ŕī parametra dokumentÄcijÄ piedÄvÄ dažÄdas tÄ (parametra) vÄrtÄ«bas un atzÄ«mÄ, ka jÄ, ietekme bÅ«s, bet, labi, jÅ«s varat izvÄlÄties dažÄdas vÄrtÄ«bas, lÄ«dz āizslÄgtsā un dažÄdas ietekmes.
Nu, globÄls secinÄjums.
KopumÄ pieeja izrÄdÄs diezgan efektÄ«va.
ViÅÅ” diezgan atļaujas noteiktas servisa sistÄmas slodzes testÄÅ”anas sÄkumposmÄ, lai izvÄlÄtos tÄs (sistÄmas) optimÄlo slodzei konfigurÄciju, pÄrÄk neiedziļinÄties sistÄmas slodzei uzstÄdÄ«Å”anas specifikÄ.
Bet tas to pilnÄ«bÄ neizslÄdz - vismaz izpratnes lÄ«menÄ«: sistÄmai ir jÄzina par āregulÄÅ”anas pogÄmā un Å”o kloÄ·u pieļaujamajiem grieÅ”anÄs diapazoniem.
PÄc tam Ŕī pieeja var salÄ«dzinoÅ”i Ätri atrast optimÄlo sistÄmas konfigurÄciju.
Un, pamatojoties uz testÄÅ”anas rezultÄtiem, ir iespÄjams iegÅ«t informÄciju par sakarÄ«bu starp sistÄmas veiktspÄjas rÄdÄ«tÄjiem un sistÄmas iestatÄ«jumu parametru vÄrtÄ«bÄm.
Kam, protams, vajadzÄtu veicinÄt Ŕīs ļoti dziļÄs izpratnes raÅ”anos par sistÄmu, tÄs darbÄ«bu, vismaz pie noteiktas slodzes.
PraksÄ tÄ ir pielÄgotÄs sistÄmas izpratnes izmaksu apmaiÅa pret Å”Ädas sistÄmas testÄÅ”anas sagatavoÅ”anas izmaksÄm.
Es vÄlos atseviŔķi atzÄ«mÄt: Å”ajÄ pieejÄ Ä¼oti svarÄ«ga ir sistÄmas testÄÅ”anas atbilstÄ«bas pakÄpe ekspluatÄcijas apstÄkļiem, kas tai bÅ«s komerciÄlÄ darbÄ«bÄ.
Paldies par uzmanību un laiku.
Avots: www.habr.com