Metode poke ilmiah, utawa carane milih konfigurasi database nggunakake pathokan lan algoritma optimasi

Hello

Aku mutusaké kanggo nuduhake sandi golek - woh saka pikiran, nyoba lan kesalahan.
Umumé: iki ora golek, mesthi - kabeh iki kudu wis dikenal kanggo dangu, kanggo wong-wong sing melu Applied Processing data statistik lan Optimization saka sistem sembarang, ora kudu khusus DBMS.
Lan: ya, dheweke ngerti, dheweke nulis artikel sing menarik babagan riset, conto (UPD.: ing komentar, dheweke nuduhake proyek sing menarik banget: ottertune )
Ing tangan liyane: offhand aku ora weruh sembarang nyebutake nyebar utawa panyebaran pendekatan iki ing Internet antarane spesialis IT, DBA.

Dadi, menyang titik.

Ayo nganggep yen kita duwe tugas: nyiyapake sistem layanan tartamtu kanggo nglayani sawetara karya.

Dikenal babagan karya iki: apa iku, carane kualitas karya iki diukur, lan apa kritéria kanggo ngukur kualitas iki.

Ayo uga nganggep sing luwih utawa kurang dikenal lan dimangerteni: persis carane karya dileksanakake ing (utawa karo) sistem layanan iki.

"Luwih utawa kurang" - iki tegese bisa nyiyapake (utawa entuk saka endi wae) alat, sarana, layanan tartamtu sing bisa disintesis lan ditrapake ing sistem kanthi beban tes sing cukup kanggo apa sing bakal ditindakake, ing kahanan sing cukup nyukupi kanggo nggarap produksi.

Inggih, ayo nganggep manawa paramèter pangaturan kanggo sistem layanan iki dikenal, sing bisa digunakake kanggo ngatur sistem iki ing babagan produktivitas karyane.

Lan apa masalahe - ora ana pangerten sing cukup lengkap babagan sistem layanan iki, sing ngidini sampeyan kanthi ahli ngatur setelan sistem iki kanggo beban mangsa ing platform tartamtu lan entuk produktivitas sistem sing dibutuhake.

Inggih. Iki meh tansah kasus.

Apa sampeyan bisa nindakake ing kene?

Inggih, bab pisanan sing kudu dipikirake yaiku ndeleng dokumentasi kanggo sistem iki. Ngerti apa kisaran sing bisa ditampa kanggo nilai paramèter pangaturan. Lan, contone, nggunakake metode turunan koordinat, pilih nilai kanggo paramèter sistem ing tes.

Sing. menehi sistem sawetara jinis konfigurasi, ing wangun pesawat tartamtu saka nilai kanggo paramèter konfigurasi sawijining.

Aplikasi beban test menyang, nggunakake alat-utilitas iki, load generator.
Lan katon ing Nilai - respon, utawa metrik saka kualitas sistem.

Pikiran kapindho bisa dadi kesimpulan yen iki wektu sing suwe banget.

Inggih, yaiku: yen ana akeh paramèter tuning, yen kisaran nilai sing ditutupi gedhe, yen saben test beban individu mbutuhake wektu akeh kanggo ngrampungake, banjur: ya, kabeh iki bisa uga njupuk jumlah sing ora bisa ditampa. wektu.

Inggih, punika ingkang saged panjenengan pahami lan eling.

Sampeyan bisa ngerteni manawa ing set nilai parameter setelan sistem layanan ana vektor, minangka urutan sawetara nilai.

Saben vektor kasebut, barang liyane padha (amarga ora kena pengaruh vektor iki), cocog karo nilai metrik sing wis ditemtokake - indikator kualitas operasi sistem ing beban uji.

Ie

Ayo kita nuduhake vektor konfigurasi sistem minangka Metode poke ilmiah, utawa carane milih konfigurasi database nggunakake pathokan lan algoritma optimasingendi Metode poke ilmiah, utawa carane milih konfigurasi database nggunakake pathokan lan algoritma optimasi; ngendi Metode poke ilmiah, utawa carane milih konfigurasi database nggunakake pathokan lan algoritma optimasi - nomer paramèter konfigurasi sistem, carane akeh paramèter iki ana.

Lan nilai metrik sing cocog karo iki Metode poke ilmiah, utawa carane milih konfigurasi database nggunakake pathokan lan algoritma optimasi ayo kang nuduhake minangka
Metode poke ilmiah, utawa carane milih konfigurasi database nggunakake pathokan lan algoritma optimasi, banjur entuk fungsi: Metode poke ilmiah, utawa carane milih konfigurasi database nggunakake pathokan lan algoritma optimasi

Inggih, banjur: kabeh langsung mudhun kanggo, ing kasusku: meh lali saka dina mahasiswa, algoritma kanggo nggoleki extremum saka fungsi.

Oke, nanging ing kene ana pitakonan organisasi lan ditrapake: algoritma sing digunakake.

  1. Ing pangertèn - supaya sampeyan bisa kode kurang dening tangan.
  2. Lan supaya bisa, i.e. ketemu extremum (yen ana siji), uga, ing paling luwih cepet saka koordinat keturunan.

Titik pisanan nuduhake yen kita kudu ndeleng sawetara lingkungan sing algoritma kasebut wis dileksanakake, lan, ing sawetara wujud, siap digunakake ing kode.
Inggih, aku ngerti python и cran-r

Titik kapindho tegese sampeyan kudu maca babagan algoritma dhewe, apa iku, apa syarate, fitur karyane.

Lan apa sing diwenehake bisa dadi efek samping sing migunani - asil, utawa langsung saka algoritma kasebut.

Utawa bisa dipikolehi saka asil algoritma.

Kathah gumantung ing kondisi input.

Contone, yen, sakperangan alesan, sampeyan kudu entuk asil luwih cepet, uga, sampeyan kudu katon menyang algoritma keturunan gradien lan milih salah siji saka wong-wong mau.

Utawa, yen wektu ora penting banget, sampeyan bisa, contone, nggunakake metode optimasi stokastik, kayata algoritma genetika.

Aku ngusulake kanggo nimbang karya pendekatan iki, milih konfigurasi sistem, nggunakake algoritma genetika, ing sabanjure, supaya bisa ngomong: karya laboratorium.

wiwitan:

  1. Ayo ana, minangka sistem layanan: oracle xe 18c
  2. Ayo dadi ngladeni kegiatan transaksional lan tujuane: entuk throughput paling dhuwur saka subdatabase, ing transaksi / detik.
  3. Transaksi bisa beda banget ing sifat nggarap data lan konteks kerja.
    Ayo padha setuju yen iki minangka transaksi sing ora ngolah data tabular sing akeh.
    Ing pangertèn sing padha ora generate data batalaken luwih saka redo lan ora proses persentasi gedhe saka larik lan tabel gedhe.

Iki minangka transaksi sing ngganti siji baris ing tabel sing luwih gedhe utawa kurang, kanthi indeks cilik ing meja iki.

Ing kahanan iki: produktivitas subdatabase kanggo ngolah transaksi bakal, kanthi reservasi, ditemtokake dening kualitas pangolahan dening basis data redoks.

Penafian - yen kita ngomong khusus babagan setelan subdb.

Amarga, ing kasus umum, bisa uga ana, umpamane, kunci transaksional antarane sesi SQL, amarga desain karya pangguna karo data tabular lan / utawa model tabular.

Sing, mesthi, bakal duwe efek depresi ing metrik TPS lan iki bakal dadi faktor eksogen, relatif marang subdatabase: uga, iki carane model tabular dirancang lan karya karo data ing blockages dumadi.

Mulane, kanggo kemurnian eksperimen, kita bakal ngilangi faktor iki, lan ing ngisor iki aku bakal njlentrehake kanthi tepat.

  1. Ayo kita nganggep, kanggo definiteness, sing 100% saka printah SQL diajukake kanggo database printah DML.
    Supaya karakteristik karya pangguna karo subdatabase padha ing tes.
    Yaiku: jumlah sesi skl, data tabular, carane sesi skl bisa digunakake.
  2. Subd dianggo ing FORCE LOGGING, ARCHIVELOG mods. Mode flashback-database dipateni, ing tingkat subd.
  3. Baleni log: dumunung ing sistem file sing kapisah, ing "disk" sing kapisah;
    Komponen fisik database liyane: ing sistem file liyane, ing "disk" sing kapisah:

Rincian liyane babagan piranti fisik. komponen database laboratorium

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

Kaping pisanan, ing kondisi mbukak iki, aku pengin nggunakake subd transaksi SLOB-utilitas
Nduwe fitur sing apik banget, aku bakal ngutip penulis:

Ing jantung SLOB yaiku "metode SLOB." Metode SLOB tujuane kanggo nguji platform
tanpa pratelan aplikasi. Siji ora bisa drive kinerja hardware maksimum
nggunakake kode aplikasi sing, contone, kaiket dening ngunci aplikasi utawa malah
nuduhake Oracle Database pamblokiran. Bener - ana overhead nalika nuduhake data
ing pamblokiran data! Nanging SLOB-ing panyebaran standar sawijining-ora kebal saka pratelan kuwi.

Pranyatan iki: cocog, iku.
Iku trep kanggo ngatur tingkat paralelisme sesi cl, iki tombol -t miwiti sarana runit.sh saka SLOB
Persentase printah DML diatur, ing jumlah pesen teks sing dikirim menyang subd, saben sesi teks, parameter UPDATE_PCT
Kapisah lan trep banget: SLOB dhewe, sadurunge lan sawise sesi mbukak - nyiapake statspack, utawa awr-snapshots (apa sing disetel kanggo disiapake).

Nanging, ternyata SLOB ora ndhukung sesi SQL kanthi durasi kurang saka 30 detik.
Mulane, aku pisanan kode dhewe, versi buruh-petani saka loader, lan banjur tetep ing operasi.

Ayo kula njlentrehake apa loader apa lan carane iku, kanggo gamblang.
Ateges loader katon kaya iki:

Kode buruh

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

Buruh diluncurake kanthi cara iki:

Buruh mlaku

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

Lan meja kanggo buruh disiapake kaya mangkene:

Nggawe tabel

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"

Sing. Kanggo saben buruh (praktis: sesi SQL kapisah ing DB) tabel kapisah digawe, karo kang buruh bisa.

Iki njamin ora ana kunci transaksi ing antarane sesi pekerja.
Saben buruh: padha nglakoni, karo mejane dhewe-dhewe, mejane padha.
Kabeh buruh nindakake pakaryan ing wektu sing padha.
Kajaba iku, kanggo wektu sing cukup suwe, umpamane, switch log mesthi bakal kedadeyan, lan luwih saka sepisan.
Mulane, biaya lan efek sing ana gandhengane muncul.
Ing kasusku, aku ngatur durasi kerja buruh ing 8 menit.

A Piece saka laporan statspack njlentrehke operasi subd ing mbukak

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

Bali menyang karya laboratorium.
Kita bakal, prekara liyane sing padha, beda-beda nilai parameter ing ngisor iki saka subdatabase laboratorium:

  1. Ukuran klompok log database. sawetara nilai: [32, 1024] MB;
  2. Jumlah klompok jurnal ing basis data. sawetara nilai: [2,32];
  3. log_archive_max_processes sawetara nilai: [1,8];
  4. commit_logging rong nilai sing diidini: batch|immediate;
  5. commit_wait rong nilai sing diidini: wait|nowait;
  6. log_buffer sawetara Nilai: [2,128] MB.
  7. log_checkpoint_timeout sawetara nilai: [60,1200] detik
  8. db_writer_processes rentang nilai: [1,4]
  9. undo_retention sawetara nilai: [30;300] detik
  10. transactions_per_rollback_segment rentang nilai: [1,8]
  11. disk_asynch_io rong nilai sing diidini: true|false;
  12. filesystemio_options nilai ing ngisor iki diijini: none|setall|directIO|asynch;
  13. db_block_checking nilai ing ngisor iki diijini: OFF|LOW|MEDIUM|FULL;
  14. db_block_checksum nilai ing ngisor iki diijini: OFF|TYPICAL|FULL;

Wong sing duwe pengalaman njaga database Oracle mesthi wis bisa ngomong apa lan apa nilai sing kudu disetel, saka paramèter sing ditemtokake lan nilai sing bisa ditampa, supaya bisa entuk produktivitas database sing luwih gedhe kanggo karya karo data sing dituduhake dening kode aplikasi, ing ndhuwur.

Nanging.

Titik karya laboratorium kanggo nuduhake yen algoritma optimasi dhewe bakal njlentrehake iki kanggo kita relatif cepet.

Kanggo kita, sing isih ana yaiku mriksa dokumen kasebut, liwat sistem sing bisa disesuaikan, cukup kanggo ngerteni paramèter apa sing kudu diganti lan ing kisaran apa.
Lan uga: kode kode sing bakal digunakake kanggo nggarap sistem khusus saka algoritma optimasi sing dipilih.

Dadi, saiki babagan kode.
Aku ngomong ing ndhuwur cran-r, yaiku: kabeh manipulasi kanthi sistem sing disesuaikan diatur ing wangun skrip R.

Tugas nyata, analisis, pilihan kanthi nilai metrik, vektor negara sistem: iki minangka paket GA (dokumentasi)
Paket, ing kasus iki, ora cocok banget, ing pangertèn sing ngarepake vektor (kromosom, yen ing syarat-syarat paket) bakal ditemtokake ing wangun strings nomer karo bagean pecahan.

Lan vektorku, saka nilai parameter setelan: iki 14 jumlah - integer lan nilai senar.

Masalah, mesthi, gampang nyingkiri dening nemtokake sawetara nomer tartamtu kanggo nilai senar.

Dadi, ing pungkasan, potongan utama skrip R katon kaya iki:

Telpon 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

Kene, karo bantuan lower и upper atribut subrutin ga Intine, area ruang telusuran ditemtokake, ing ngendi telusuran bakal ditindakake kanggo vektor kasebut (utawa vektor) sing bakal entuk nilai maksimal saka fungsi fitness.

Subrutin ga nindakake telusuran ngoptimalake fungsi fitness.

Dadi, ternyata, ing kasus iki, perlu fungsi fitness, ngerteni vektor minangka sakumpulan nilai kanggo paramèter tartamtu saka subd, nampa metrik saka subd.

Yaiku: pira, kanthi persiyapan subd sing diwenehake lan beban sing diwenehake ing subd: subd ngolah transaksi per detik.

Yaiku, nalika mbukak, multi-langkah ing ngisor iki kudu ditindakake ing fungsi fitness:

  1. Ngolah vektor input angka - ngowahi dadi nilai kanggo paramèter subdata.
  2. Nyoba kanggo nggawe sawetara klompok redo tartamtu saka ukuran tartamtu. Kajaba iku, upaya kasebut bisa uga ora kasil.
    Kelompok majalah sing wis ana ing subd, ing sawetara jumlah lan sawetara ukuran, kanggo kemurnian eksperimen - d.b. dibusak.
  3. Yen titik sadurunge sukses: nemtokake nilai parameter konfigurasi menyang database (maneh: bisa uga ana kegagalan)
  4. Yen langkah sadurunge sukses: mungkasi subd, miwiti subd supaya nilai parameter sing mentas ditemtokake ditrapake. (maneh: bisa uga ana kesalahan)
  5. Yen langkah sadurunge kasil: nindakake test mbukak. entuk metrik saka subd.
  6. Bali subd menyang negara asline, i.e. mbusak grup log tambahan, bali konfigurasi subdatabase asli kanggo bisa.

Kode fungsi 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 ) {
 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)
}

Iku. kabeh karya: dileksanakake ing fungsi fitness.

Ga-subrutin ngolah vektor, utawa, luwih bener, kromosom.
Ing ngendi, sing paling penting kanggo kita yaiku pilihan kromosom kanthi gen sing fungsi fitness ngasilake nilai gedhe.

Iki, intine, yaiku proses nggoleki set kromosom sing optimal nggunakake vektor ing ruang telusuran N-dimensi.

Cetha banget, rinci panjelasan, karo conto R-kode, karya saka algoritma genetik.

Aku kaya kanggo kapisah Wigati loro TCTerms technical.

Panggilan tambahan saka fungsi kasebut evaluate, contone, mandeg-wiwitan, nyetel Nilai saka parameter subd, dileksanakake adhedhasar cran-r fungsi system2

Kanthi bantuan kang: sawetara script bash utawa printah diarani.

Contone:

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

Titik kapindho yaiku garis, evaluate fungsi, kanthi nyimpen nilai metrik tartamtu lan vektor tuning sing cocog menyang file log:

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

Iki penting, amarga saka larik data iki, sampeyan bisa entuk informasi tambahan babagan komponen vektor tuning sing duwe efek sing luwih gedhe utawa kurang ing nilai metrik.

Yaiku: bakal bisa nganakake analisis atribut-importamce.

Dadi apa sing bisa kedadeyan?

Ing wangun grafik, yen sampeyan ngurutake tes kanthi urutan metrik munggah, gambar kasebut kaya ing ngisor iki:

Metode poke ilmiah, utawa carane milih konfigurasi database nggunakake pathokan lan algoritma optimasi

Sawetara data sing cocog karo nilai ekstrim saka metrik:
Metode poke ilmiah, utawa carane milih konfigurasi database nggunakake pathokan lan algoritma optimasi
Ing kene, ing gambar kanthi asil, aku bakal njlentrehake: nilai-nilai vektor tuning diwenehake ing syarat-syarat kode fungsi fitness, ora saka dhaptar nomer paramèter / kisaran nilai parameter, sing dirumusake. ndhuwur ing teks.

Inggih. Apa akèh utawa sathithik, ~ 8 ewu tps: pitakonan sing kapisah.
Ing kerangka kerja laboratorium, tokoh iki ora penting, sing penting yaiku dinamika, kepiye owah-owahan nilai kasebut.

Dinamika ing kene apik.
Cetha manawa paling ora ana siji faktor sing mengaruhi nilai metrik, algoritma ga, ngurutake vektor kromosom: dijamin.
Dideleng saka dinamika nilai kurva sing cukup kuat, paling ora ana siji faktor liyane sing, sanajan luwih cilik, nduweni pengaruh.

Iki ngendi sampeyan perlu iku attribute-importance analisis kanggo mangerteni apa kawicaksanan (uga, ing kasus iki, komponen saka vektor tuning) lan carane akeh pengaruhe Nilai metrik.
Lan saka informasi iki: ngerti faktor apa sing kena pengaruh owah-owahan ing atribut sing signifikan.

Nglakokke attribute-importance bisa kanthi cara sing beda-beda.

Kanggo tujuan kasebut, aku seneng karo algoritma kasebut randomForest Paket R kanthi jeneng sing padha (dokumentasi)
randomForest, nalika aku ngerti karyane ing umum lan pendekatan kanggo netepake pentinge atribut ing tartamtu, mbangun model tartamtu saka katergantungan saka variabel respon ing atribut.

Ing kasus kita, variabel respon minangka metrik sing dipikolehi saka database ing tes beban: tps;
Lan atribut minangka komponen saka vektor tuning.

Dadi ing kene randomForest ngevaluasi pentinge saben atribut model kanthi rong nomer: %IncMSE - kepiye anane / ora ana atribut iki ing model ngganti kualitas MSE model iki (Kesalahan Mean Squared);

Lan IncNodePurity minangka nomer sing nggambarake kepiye, adhedhasar nilai atribut iki, dataset kanthi pengamatan bisa dipérang, saéngga ing siji bagéan ana data kanthi siji nilai metrik sing diterangake, lan ing sisih liya karo Nilai liyane saka metrik.
Yaiku: nganti sepira iki minangka atribut klasifikasi (aku ndeleng panjelasan basa Rusia sing paling jelas ing RandomForest kene).

Kode R buruh-tani kanggo ngolah set data kanthi asil tes beban:

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

Sampeyan bisa langsung milih hyperparameters algoritma nganggo tangan lan, fokus ing kualitas model, pilih model sing luwih akurat nepaki prediksi ing dataset validasi.
Sampeyan bisa nulis sawetara jinis fungsi kanggo karya iki (kanthi cara, maneh, nggunakake sawetara algoritma optimasi).

Sampeyan bisa nggunakake paket R caret, sing penting ora titik.

Akibaté, ing kasus iki, asil ing ngisor iki dipikolehi kanggo netepake tingkat wigati saka atribut:

Metode poke ilmiah, utawa carane milih konfigurasi database nggunakake pathokan lan algoritma optimasi

Inggih. Dadi, kita bisa miwiti refleksi global:

  1. Pranyata sing paling penting, ing kahanan tes kasebut, yaiku parameter commit_wait
    Secara teknis, iki nemtokake mode eksekusi operasi io nulis data redo saka buffer log subdb menyang grup log saiki: sinkron utawa asinkron.
    Nilai nowait kang asil ing meh vertikal, kaping Tambah ing Nilai saka metrik tps: iki Gawan saka mode io bedo ing kelompok redo.
    Pitakonan sing kapisah yaiku apa sampeyan kudu nindakake iki ing database panganan. Ing kene aku mbatesi aku mung nyatakake: iki minangka faktor sing penting.
  2. Iku logis yen ukuran buffer log saka subd: dadi faktor penting.
    Sing luwih cilik ukuran buffer log, kurang kapasitas buffering, sing liyane asring overflows lan / utawa ora bisa kanggo nyedhiakke wilayah free ing bagean saka data redoks anyar.
    Iki tegese: telat sing digandhengake karo alokasi spasi ing buffer log lan / utawa mbuwang data redo saka iku menyang grup redo.
    Keterlambatan kasebut, mesthine kudu lan mengaruhi throughput database kanggo transaksi.
  3. Parameter db_block_checksum: uga, uga, ing umum iku cetha - Processing transaksi ndadékaké kanggo tatanan saka pamblokiran darty ing cache buffer subdatabase.
    Kang, nalika mriksa checksums datablocks diaktifake, database kudu proses - ngetung checksums iki saka awak saka blok data, mriksa karo apa sing ditulis ing header datablock: cocog / ora cocog.
    Pakaryan kasebut, maneh, ora bisa nundha pangolahan data, lan kanthi mangkono, parameter lan mekanisme sing nyetel parameter iki dadi penting.
    Pramila vendor nawakake, ing dokumentasi kanggo parameter iki, nilai sing beda-beda (parameter) lan nyathet yen ya, bakal ana pengaruh, nanging, sampeyan bisa milih nilai sing beda-beda, nganti "mati" lan impact beda.

Inggih, kesimpulan global.

Pendekatan, ing umum, dadi cukup makarya.

Panjenenganipun cukup ngidini piyambak, ing orane tumrap sekolah awal saka testing mbukak saka sistem layanan tartamtu, kanggo milih sawijining (sistem) konfigurasi optimal kanggo mbukak, ora kanggo delve kakehan menyang tartamtu saka nyetel sistem kanggo mbukak.

Nanging ora ngilangi kabeh - paling ora ing tingkat pangerten: sistem kasebut kudu dingerteni babagan "tombol penyesuaian" lan kisaran rotasi tombol kasebut.

Pendekatan kasebut bisa kanthi cepet nemokake konfigurasi sistem sing optimal.
Lan adhedhasar asil tes, sampeyan bisa entuk informasi babagan sifat hubungan antarane metrik kinerja sistem lan nilai parameter setelan sistem.

Sing, mesthine, kudu nyumbang kanggo munculé pangerten sing jero banget babagan sistem kasebut, operasi, paling ora miturut beban sing diwenehake.

Ing praktik, iki minangka ijol-ijolan biaya kanggo ngerteni sistem sing disesuaikan kanggo biaya nyiapake tes sistem kasebut.

Aku pengin nyathet kanthi kapisah: ing pendekatan iki, tingkat kecukupan tes sistem kanggo kondisi operasi sing bakal ditindakake ing operasi komersial penting banget.

Matur nuwun kanggo perhatian lan wektu.

Source: www.habr.com

Add a comment