Metodeu nyodok ilmiah, atanapi kumaha milih konfigurasi database nganggo tolok ukur sareng algoritma optimasi

halo

Kuring mutuskeun pikeun babagi pamanggih kuring - buah pamikiran, trial and error.
Sacara umum: ieu teu manggihan, tangtosna - kabeh ieu kudu geus dipikawanoh pikeun lila, pikeun maranéhanana anu kalibet dina ngolah data statistik terapan sarta optimasi sistem mana wae, teu merta husus DBMS.
Sareng: enya, aranjeunna terang, aranjeunna nyerat tulisan anu pikaresepeun dina panalungtikanana, conto (UPD.: dina koméntar aranjeunna nunjukkeun proyék anu pikaresepeun pisan: ottertune )
Di sisi séjén: offhand Kuring teu ningali sagala nyebut nyebar atawa sosialisasi pendekatan ieu dina Internet diantara spesialis IT, DBA.

Ku kituna, ka titik.

Hayu urang nganggap yen urang boga tugas: nyetél sistem layanan tangtu pikeun layanan sababaraha jenis karya.

Hal ieu dipikanyaho ngeunaan karya ieu: naon éta, kumaha kualitas karya ieu diukur, sarta naon kriteria keur ngukur kualitas ieu.

Hayu urang ogé nganggap yén éta téh leuwih atawa kirang dipikawanoh tur dipikaharti: persis kumaha karya dipigawé dina (atawa kalawan) sistem layanan ieu.

"Leuwih atawa kurang" - ieu ngandung harti yén kasebut nyaéta dimungkinkeun pikeun nyiapkeun (atawa meunang ti mana) alat nu tangtu, utilitas, jasa nu bisa disintésis tur dilarapkeun ka sistem kalawan beban test anu cukup nyukupan kana naon nu bakal di. produksi, dina kaayaan cukup nyukupan pikeun digawé di produksi.

Nya, hayu urang nganggap yén sakumpulan parameter panyesuaian pikeun sistem jasa ieu dipikanyaho, anu tiasa dianggo pikeun ngonpigurasikeun sistem ieu dina hal produktivitas karyana.

Sareng naon masalahna - teu aya pamahaman anu cukup lengkep ngeunaan sistem jasa ieu, anu ngamungkinkeun anjeun sacara ahli ngonpigurasikeun setélan sistem ieu pikeun beban anu bakal datang dina platform anu dipasihkeun sareng kéngingkeun produktivitas sistem anu diperyogikeun.

Muhun. Ieu ampir salawasna kasus.

Naon anu anjeun tiasa laksanakeun di dieu?

Nya, hal anu mimiti dipikiran nyaéta ningali dokuméntasi pikeun sistem ieu. Ngartos naon rentang anu tiasa ditampi pikeun nilai-nilai parameter adjustment. Sareng, contona, nganggo metode turunan koordinat, pilih nilai pikeun parameter sistem dina tés.

Jelema. masihan sistem sababaraha jinis konfigurasi, dina bentuk set nilai khusus pikeun parameter konfigurasi na.

Larapkeun beban uji ka dinya, ngagunakeun alat-utilitas ieu, generator beban.
Jeung kasampak di nilai - respon, atawa métrik tina kualitas sistem.

Pikiran kadua meureun kacindekan yén ieu téh waktu anu pohara lila.

Nya, nyaéta: upami aya seueur parameter pangaturan, upami kisaran nilai-nilaina dijalankeun ageung, upami unggal tés beban individu peryogi seueur waktos kanggo réngsé, maka: leres, sadayana ieu tiasa nyandak anu henteu katampi. waktos na lami.

Nya, ieu anu anjeun tiasa ngartos sareng émut.

Anjeun tiasa mendakan yén dina set nilai parameter setélan sistem jasa aya vektor, salaku sekuen sababaraha nilai.

Masing-masing vektor sapertos kitu, hal-hal sanés sami (dina yén éta henteu kapangaruhan ku vektor ieu), pakait sareng nilai métrik anu pasti - indikator kualitas operasi sistem dina beban uji.

nyaéta

Hayu urang nunjukkeun vektor konfigurasi sistem salaku Metodeu nyodok ilmiah, atanapi kumaha milih konfigurasi database nganggo tolok ukur sareng algoritma optimasidimana Metodeu nyodok ilmiah, atanapi kumaha milih konfigurasi database nganggo tolok ukur sareng algoritma optimasi; dimana Metodeu nyodok ilmiah, atanapi kumaha milih konfigurasi database nganggo tolok ukur sareng algoritma optimasi - Jumlah parameter konfigurasi sistem, sabaraha tina parameter ieu aya.

Jeung nilai métrik pakait jeung ieu Metodeu nyodok ilmiah, atanapi kumaha milih konfigurasi database nganggo tolok ukur sareng algoritma optimasi hayu urang denote salaku
Metodeu nyodok ilmiah, atanapi kumaha milih konfigurasi database nganggo tolok ukur sareng algoritma optimasi, teras urang kéngingkeun fungsi: Metodeu nyodok ilmiah, atanapi kumaha milih konfigurasi database nganggo tolok ukur sareng algoritma optimasi

Nya, teras: sadayana langsung turun ka, bisi kuring: ampir hilap ti jaman murid kuring, algoritma pikeun milarian ekstrim tina fungsi.

Oke, tapi di dieu timbul patarosan organisasi sareng terapan: algoritma mana anu dianggo.

  1. Dina harti - ku kituna anjeun bisa kode kirang ku leungeun.
  2. Sareng pikeun dianggo, i.e. kapanggih extremum (lamun aya hiji), sumur, sahenteuna leuwih gancang ti koordinat turunan.

Titik munggaran nunjukkeun yén urang kedah ningali sababaraha lingkungan dimana algoritma sapertos kitu parantos dilaksanakeun, sareng, dina sababaraha bentuk, siap dianggo dina kode.
Muhun, abdi terang python и cran-r

Titik kadua ngandung harti yén anjeun kedah maca ngeunaan algoritma sorangan, naon aranjeunna, naon syaratna, sareng fitur karyana.

Sareng naon anu dipasihkeun tiasa janten efek samping anu mangpaat - hasil, atanapi langsung tina algoritma sorangan.

Atanapi aranjeunna tiasa didapet tina hasil algoritma.

Loba gumantung kana kaayaan input.

Salaku conto, upami, pikeun sababaraha alesan, anjeun kedah kéngingkeun hasilna langkung gancang, saé, anjeun kedah milarian algoritma turunan gradién sareng pilih salah sahijina.

Atanapi, upami waktos henteu penting pisan, anjeun tiasa, contona, ngagunakeun metode optimasi stokastik, sapertos algoritma genetik.

Kuring ngajukeun mertimbangkeun karya pendekatan ieu, milih konfigurasi sistem, ngagunakeun algoritma genetik, di hareup, jadi mun nyarita: karya laboratorium.

Aslina:

  1. Hayu aya, salaku sistem layanan: oracle xe 18c
  2. Hayu eta ngawula aktivitas transactional jeung tujuan: pikeun ménta throughput pangluhurna mungkin tina subdatabase, dina transaksi / detik.
  3. Transaksi tiasa bénten pisan dina sifat damel sareng data sareng kontéks padamelan.
    Hayu urang satuju yén ieu téh transaksi nu teu ngolah jumlah badag data tabular.
    Dina harti yén maranéhna teu ngahasilkeun leuwih data bolaykeun ti redo na teu ngolah percentages badag barisan na tabel badag.

Di handap ieu mangrupakeun transaksi nu ngarobah hiji baris dina tabel leuwih atawa kirang badag, kalawan sajumlah leutik indéks dina tabel ieu.

Dina kaayaan ieu: produktivitas subdatabase pikeun ngolah transaksi bakal, kalawan reservasi a, ditangtukeun ku kualitas processing ku database redox.

Bantahan - lamun urang ngobrol husus ngeunaan setélan subdb.

Kusabab, dina kasus umum, meureun aya, contona, konci transactional antara sesi SQL, alatan desain karya pamaké kalawan data tabular jeung / atawa model tabular.

Anu, tangtosna, bakal gaduh pangaruh anu ngadesekkeun dina métrik TPS sareng ieu bakal janten faktor eksogen, relatif ka subdatabase: sumur, ieu kumaha modél tabular dirancang sareng damel sareng data di jerona anu aya sumbatan.

Ku alatan éta, pikeun purity percobaan, urang bakal ngaluarkeun faktor ieu, sarta di handap kuring bakal netelakeun persis kumaha.

  1. Hayu urang nganggap, pikeun definiteness, yén 100% tina paréntah SQL dikintunkeun ka database mangrupakeun paréntah DML.
    Hayu karakteristik karya pamaké kalawan subdatabase nu sarua dina tés.
    Nyaéta: jumlah sesi skl, data tabular, kumaha sesi skl dianggo kalayan aranjeunna.
  2. Subd dianggo di FORCE LOGGING, ARCHIVELOG mods. Modeu flashback-database dipareuman, dina tingkat subd.
  3. Redo log: ayana dina sistem file misah, dina "disk" misah;
    Sésa komponén fisik pangkalan data: dina sistem file anu sanés, dina "disk" anu misah:

Langkung rinci ngeunaan alat fisik. komponén 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

Mimitina, dina kaayaan beban ieu, kuring hoyong nganggo subd transaksi SLOB-utilitas
Éta gaduh fitur anu saé, kuring bakal nyarioskeun panulis:

Dina manah SLOB nyaéta "metode SLOB." Métode SLOB boga tujuan pikeun nguji platform
tanpa contention aplikasi. Hiji teu bisa ngajalankeun kinerja hardware maksimum
ngagunakeun kode aplikasi nu, contona, kabeungkeut ku ngonci aplikasi atawa malah
babagi blok Oracle Database. Éta leres-aya overhead nalika ngabagi data
dina blok data! Tapi SLOB — dina panyebaran standarna — kebal kana pertengkaran sapertos kitu.

deklarasi ieu: pakait, éta.
Éta merenah pikeun ngatur darajat paralelisme sesi cl, ieu konci -t ngajalankeun utiliti runit.sh ti SLOB
Persentase paréntah DML diatur, dina jumlah pesen téks anu dikirim ka subd, unggal sési téks, parameter. UPDATE_PCT
Kapisah sareng merenah pisan: SLOB sorangan, saméméh jeung sanggeus sési beban - prepares statspack a, atanapi awr-snapshots (naon diatur pikeun disiapkeun).

Sanajan kitu, tétéla éta SLOB henteu ngadukung sesi SQL kalayan durasi kirang ti 30 detik.
Ku alatan éta, kuring mimiti kode sorangan, versi worker-tani tina loader, lajeng eta tetep dina operasi.

Hayu atuh netelakeun naon loader teu jeung kumaha eta ngalakukeun eta, pikeun kajelasan.
Intina loader sapertos kieu:

Kode pagawe

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 diluncurkeun ku cara kieu:

Ngajalankeun pagawé

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

Sareng tabel pikeun pagawé disiapkeun sapertos kieu:

Nyieun tabél

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"

Jelema. Pikeun unggal worker (praktis: sési SQL misah di DB) a tabel misah dijieun, kalawan nu worker jalan.

Ieu ensures henteuna konci transactional antara sesi worker.
Masing-masing pagawé: ngalakukeun hal anu sami, sareng méja sorangan, méjana sami.
Sadaya pagawé ngalaksanakeun pagawéan dina waktos anu sami.
Leuwih ti éta, pikeun lila cukup ku kituna, contona, switch log pasti bakal lumangsung, sarta leuwih ti sakali.
Nya, sasuai, biaya sareng épék pakait timbul.
Dina kasus kuring, kuring ngonpigurasikeun durasi pagawéan dina 8 menit.

Sapotong laporan statspack ngajéntrékeun operasi subd handapeun beban

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

Balik deui kana pagawéan laboratorium.
Urang bakal, hal-hal sanés anu sami, ngarobih nilai-nilai parameter di handap ieu tina subdatabase laboratorium:

  1. Ukuran grup log database. rentang nilai: [32, 1024] MB;
  2. Jumlah grup jurnal dina database. rentang nilai: [2,32];
  3. log_archive_max_processes rentang nilai: [1,8];
  4. commit_logging dua nilai diidinan: batch|immediate;
  5. commit_wait dua nilai diidinan: wait|nowait;
  6. log_buffer rentang nilai: [2,128] MB.
  7. log_checkpoint_timeout rentang nilai: [60,1200] detik
  8. db_writer_processes rentang nilai: [1,4]
  9. undo_retention rentang nilai: [30;300] detik
  10. transactions_per_rollback_segment rentang nilai: [1,8]
  11. disk_asynch_io dua nilai diidinan: true|false;
  12. filesystemio_options nilai di handap ieu diwenangkeun: none|setall|directIO|asynch;
  13. db_block_checking nilai di handap ieu diwenangkeun: OFF|LOW|MEDIUM|FULL;
  14. db_block_checksum nilai di handap ieu diwenangkeun: OFF|TYPICAL|FULL;

Jalma anu gaduh pangalaman dina ngajaga database Oracle pasti tiasa nyarios naon sareng naon nilai anu kedah disetél, tina parameter anu ditangtukeun sareng nilai anu ditampi, pikeun kéngingkeun produktivitas database anu langkung ageung pikeun damel sareng data anu dituduhkeun ku kodeu aplikasi, di dieu di luhur.

Tapi.

Inti tina karya laboratorium nyaéta nunjukkeun yén algoritma optimasi sorangan bakal netelakeun ieu pikeun urang rélatif gancang.

Pikeun urang, sadaya anu tetep nyaéta ningali kana dokumén, ngalangkungan sistem anu tiasa disaluyukeun, cekap pikeun terang parameter naon anu kedah dirobih sareng dina rentang naon.
Sareng ogé: kode kode anu bakal dianggo pikeun damel sareng sistem khusus tina algoritma optimasi anu dipilih.

Janten, ayeuna ngeunaan kodeu.
Kuring dikaitkeun luhur ngeunaan cran-r, i.e.: sagala manipulasi jeung sistem ngaropéa nu orchestrated dina wangun Aksara Sunda.

Tugas saleresna, analisa, pilihan ku nilai métrik, vektor kaayaan sistem: ieu mangrupikeun pakét GA (dokuméntasi)
Bungkusan, dina hal ieu, teu cocog pisan, dina harti yén éta nyangka vektor (kromosom, upami dina hal pakét) bakal dieusian dina wangun string angka kalawan bagian fractional.

Sareng vektor kuring, tina nilai parameter setting: ieu 14 kuantitas - integer sareng nilai string.

masalahna, tangtosna, gampang dihindari ku assigning sababaraha angka husus pikeun nilai string.

Ku kituna, dina tungtungna, bagian utama tina aksara Sunda kasampak kawas kieu:

Nelepon 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

Di dieu, kalayan pitulung lower и upper atribut subrutin ga dasarna, wewengkon spasi pilarian dieusian, dimana pilarian bakal dipigawé pikeun vektor misalna (atawa vektor) nu nilai maksimum fungsi kabugaran bakal diala.

The subrutin ga ngalakukeun pilarian maximizing fungsi kabugaran.

Nya, teras, tétéla, dina hal ieu, perlu yén fungsi kabugaran, ngartos véktor salaku sakumpulan nilai pikeun parameter tangtu subd, nampi métrik tina subd.

Nyaéta: sabaraha, kalayan setelan subd anu dipasihkeun sareng beban anu dipasihkeun dina subd: subd ngolah transaksi per detik.

Nyaéta, nalika unfolding, sababaraha léngkah di handap ieu kedah dilakukeun di jero fungsi kabugaran:

  1. Ngolah vektor input angka - ngarobah kana nilai pikeun parameter subdata.
  2. Usaha pikeun nyieun sababaraha grup redo tina ukuran nu tangtu. Leuwih ti éta, usaha bisa jadi gagal.
    Grup majalah anu geus aya dina subd, dina sababaraha kuantitas jeung sababaraha ukuran, pikeun purity percobaan - d.b. dipupus.
  3. Upami titik sateuacana suksés: netepkeun nilai parameter konfigurasi kana pangkalan data (deui: meureun aya kagagalan)
  4. Upami léngkah saacanna suksés: lirén subd, mimitian subd supados nilai parameter anu nembé ditetepkeun pangaruh. (deui: meureun aya glitch)
  5. Upami léngkah saacanna suksés: laksanakeun tés beban. meunang metrics ti subd.
  6. Balikkeun subd ka kaayaan aslina, i.e. mupus grup log tambahan, balik konfigurasi subdatabase aslina mun jalan.

Kodeu fungsi kabugaran

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

Anu. sadaya karya: dipigawé dina fungsi kabugaran.

The ga-subrutin ngolah vektor, atawa, leuwih bener, kromosom.
Di mana, anu paling penting pikeun urang nyaéta pilihan kromosom sareng gen anu fungsi kabugaran ngahasilkeun nilai anu ageung.

Intina, ieu mangrupikeun prosés milarian set kromosom anu optimal nganggo véktor dina rohangan milarian N-dimensi.

Jelas pisan, rinci panjelasan, kalawan conto R-kode, karya hiji algoritma genetik.

Abdi hoyong nyalira catetan dua titik teknis.

Telepon bantu tina fungsina evaluate, Contona, eureun-mimitian, netepkeun nilai parameter subd, dipigawé dumasar kana cran-r fungsi system2

Kalayan bantuan nu: sababaraha Aksara bash atawa paréntah disebut.

Contona:

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 kadua nyaéta garis, evaluate fungsina, kalayan nyimpen nilai métrik khusus sareng vektor tuning anu cocog kana file log:

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

Ieu penting, sabab tina Asép Sunandar Sunarya data ieu bakal mungkin pikeun ménta inpo tambahan ngeunaan nu komponén tina véktor tuning boga pangaruh gede atawa Lesser dina nilai métrik.

Nyaéta: éta bakal tiasa ngalaksanakeun analisa atribut-importamce.

Janten naon anu tiasa kajantenan?

Dina bentuk grafik, upami anjeun mesen tés dina urutan métrik naék, gambarna sapertos kieu:

Metodeu nyodok ilmiah, atanapi kumaha milih konfigurasi database nganggo tolok ukur sareng algoritma optimasi

Sababaraha data anu pakait sareng nilai ekstrim métrik:
Metodeu nyodok ilmiah, atanapi kumaha milih konfigurasi database nganggo tolok ukur sareng algoritma optimasi
Di dieu, dina screenshot kalawan hasil, abdi bakal netelakeun: nilai tina véktor tuning dirumuskeun dina watesan kode fungsi kabugaran, teu dina watesan jumlah daptar parameter / rentang nilai parameter, nu dirumuskeun. luhur dina téks.

Muhun. Naha loba atawa saeutik, ~8 rebu tps: soalna misah.
Dina kerangka kerja laboratorium, inohong ieu henteu penting, anu penting nyaéta dinamika, kumaha nilai ieu robih.

Dinamika di dieu alus.
Ieu écés yén sahanteuna hiji faktor nyata mangaruhan nilai métrik, ga-algoritma, asihan ngaliwatan véktor kromosom: katutupan.
Ditilik ku dinamika anu cukup kuat tina nilai kurva, sahenteuna aya hiji deui faktor anu, sanaos langkung alit, gaduh pangaruh.

Ieu dimana anjeun peryogi eta attribute-importance analisis ngartos naon atribut (ogé, dina hal ieu, komponén tina véktor tuning) jeung sabaraha aranjeunna pangaruh nilai métrik.
Sareng tina inpormasi ieu: ngartos faktor naon anu dipangaruhan ku parobihan atribut anu penting.

Laksanakeun attribute-importance mungkin ku cara anu béda.

Pikeun tujuan ieu, kuring resep algoritma randomForest Paket R anu sami nami (dokuméntasi)
randomForest, sakumaha Abdi ngartos karyana sacara umum sarta pendekatan ka assessing pentingna atribut hususna, ngawangun model tangtu gumantungna variabel respon kana atribut.

Dina kasus urang, variabel réspon nyaéta métrik anu dicandak tina pangkalan data dina tés beban: tps;
Sareng atribut mangrupikeun komponén tina véktor tuning.

Janten di dieu randomForest ngaevaluasi pentingna unggal atribut model mibanda dua angka: %IncMSE - kumaha ayana / henteuna atribut ieu dina model ngarobah kualitas MSE model ieu (Mean Squared Error);

Sareng IncNodePurity mangrupikeun angka anu nunjukkeun kumaha, dumasar kana nilai atribut ieu, set data sareng observasi tiasa dibagi, ku kituna dina hiji bagian aya data kalayan hiji nilai métrik anu dijelaskeun, sareng anu sanésna sareng nilai sejen tina métrik.
Nya, nyaéta: sajauh mana ieu atribut klasifikasi (kuring ningali panjelasan basa Rusia anu paling jelas dina RandomForest di dieu).

Kodeu R-Pagawé-tani pikeun ngolah set data kalayan hasil tés 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

Anjeun tiasa langsung milih hyperparameters tina algoritma jeung leungeun anjeun sarta fokus kana kualitas model, pilih modél nu leuwih akurat minuhan prediksi dina dataset validasi.
Anjeun tiasa nyerat sababaraha jinis fungsi pikeun padamelan ieu (ku jalan kitu, deui, nganggo sababaraha jinis algoritma optimasi).

Anjeun tiasa nganggo pakét R caret, teu titik penting.

Hasilna, dina hal ieu, hasil di handap ieu dicandak pikeun meunteun darajat pentingna atribut:

Metodeu nyodok ilmiah, atanapi kumaha milih konfigurasi database nganggo tolok ukur sareng algoritma optimasi

Muhun. Ku kituna, urang bisa ngamimitian refleksi global:

  1. Tétéla yén anu paling penting, dina kaayaan uji ieu, nyaéta parameter commit_wait
    Téhnisna, éta nangtukeun mode palaksanaan operasi io nulis redo data tina panyangga log subdb ka grup log ayeuna: sinkron atawa asinkron.
    ajen nowait nu ngakibatkeun hiji ampir nangtung, sababaraha kanaékan nilai métrik tps: ieu téh kaasup kana mode io Asynchronous dina grup redo.
    Patarosan anu misah nyaéta naha anjeun kedah ngalakukeun ieu dina database dahareun. Di dieu kuring ngawatesan diri ngan ukur nyarios: ieu mangrupikeun faktor anu penting.
  2. Logis yén ukuran panyangga log tina subd: tétéla janten faktor anu signifikan.
    Beuki leutik ukuran panyangga log, kurang kapasitas panyanggana, beuki sering ngabahekeun sareng/atanapi henteu mampuh ngalokasikeun daérah bébas di dinya pikeun bagian tina data rédoks anyar.
    Ieu ngandung harti: reureuh pakait sareng alokasi spasi dina panyangga log jeung / atawa dumping data redo ti dinya kana grup redo.
    Telat ieu, tangtosna, kedah sareng mangaruhan throughput database pikeun transaksi.
  3. parameter db_block_checksum: sumur, oge, sacara umum éta jelas - processing urus ngabalukarkeun formasi blok darty dina cache panyangga subdatabase urang.
    Anu, nalika mariksa checksums of datablocks diaktipkeun, database kudu ngolah - ngitung checksums ieu tina awak datablock, pariksa aranjeunna kalayan naon anu ditulis dina header datablock: cocog / teu cocog.
    Karya sapertos kitu, deui, teu tiasa tapi reureuh ngolah data, sareng sasuai, parameter sareng mékanisme anu netepkeun parameter ieu janten signifikan.
    Éta sababna vendor nawiskeun, dina dokuméntasi pikeun parameter ieu, nilai anu béda pikeun éta (parameter) sareng catetan yén enya, bakal aya dampak, tapi, anjeun ogé tiasa milih nilai anu béda, dugi ka "pareum" sareng dampak béda.

Nya, kacindekan global.

Pendekatan, sacara umum, tétéla rada jalan.

Anjeunna rada ngidinan dirina, dina tahap awal nguji beban tina sistem layanan tangtu, dina urutan pikeun milih na (sistem) konfigurasi optimal pikeun beban, teu delve teuing kana specifics nyetel sistem pikeun beban.

Tapi éta henteu ngaleungitkeun lengkep - sahenteuna dina tingkat pamahaman: sistem kedah dipikanyaho ngeunaan "tombol penyesuaian" sareng kisaran anu diidinan pikeun rotasi kenop ieu.

Pendekatan ieu tiasa gancang mendakan konfigurasi sistem anu optimal.
Sareng dumasar kana hasil tés, anjeun tiasa nampi inpormasi ngeunaan sifat hubungan antara métrik kinerja sistem sareng nilai parameter setélan sistem.

Nu, tangtosna, kudu nyumbang kana mecenghulna pamahaman pisan jero ieu sistem, operasi na, sahenteuna dina beban dibikeun.

Dina prakna, ieu mangrupa bursa tina waragad pamahaman sistem ngaropéa pikeun biaya Nyiapkeun nguji misalna tina sistem.

Abdi hoyong perhatikeun nyalira: dina pendekatan ieu, darajat kacukupan tés sistem pikeun kaayaan operasi anu bakal aya dina operasi komérsial penting pisan.

Hatur nuhun kana perhatosan sareng waktosna.

sumber: www.habr.com

Tambahkeun komentar