Metode poke ilmiah, atau cara memilih konfigurasi subdivisi menggunakan tolok ukur dan algoritme pengoptimalan

Halo.



Saya memutuskan untuk membagikan temuan saya - buah pemikiran, coba-coba.

Secara umum: ini bukan penemuan, tentu saja - semua ini harus diketahui sejak lama, mereka yang terlibat dalam pemrosesan data statistik terapan dan pengoptimalan sistem apa pun, belum tentu DBMS.

Dan: ya, mereka tahu, mereka menulis artikel lucu tentang penelitian mereka, sebuah contoh (UPD.: Di komentar mereka menunjuk ke proyek yang sangat menarik: ottertune )

Di sisi lain: Saya tidak melihat penyebutan yang meluas, penyebaran pendekatan ini, di Internet, di antara spesialis TI, DBA ...



Jadi langsung ke intinya.



Misalkan kita memiliki tugas: menyiapkan sistem layanan tertentu untuk melayani beberapa jenis pekerjaan.



Diketahui tentang pekerjaan ini: apa itu, bagaimana kualitas pekerjaan ini diukur dan apa kriteria untuk mengukur kualitas ini.



Mari kita asumsikan juga bahwa itu kurang lebih diketahui, jelas: bagaimana tepatnya pekerjaan dilakukan dalam (atau dengan) sistem layanan ini.



"Lebih atau kurang" berarti bahwa ada peluang untuk menyiapkan (atau membawa ke suatu tempat) alat, utilitas yang dengannya Anda dapat mensintesis dan mengirimkan beban uji ke sistem yang cukup memadai untuk apa yang akan diproduksi, dalam kondisi yang memadai untuk bekerja dalam produksi. ...



Nah, katakanlah kita mengetahui seperangkat parameter penyesuaian dari sistem layanan ini, yang dapat digunakan untuk mengkonfigurasi sistem ini, dalam hal produktivitas kerjanya.



, β€” , , , .



. , .



.



, : . β€” . , , , , .



.. , -.



, -, -.

β€” , .



β€” .



..: β€” , β€” , β€” , : , .



.



, β€” , .



, ( ) β€” , .



..



, X=xsaya, saya=1,N; N β€” - , , .



, X

M, , : M=f(X)



, : , : , .



, - : .



  1. β€” .
  2. , .. ( ), , β€” .


, β€” , , , .

, python cran-r



, , , .



, -, , .



.



.



, , , , , .



, , , .



, , , , : .



:



  1. , : oracle xe 18c
  2. β€” : , /.
  3. β€” , .

    - .

    - , .


- , - .



: , , -.



β€” .



, , , , , -, -, / .



, , tps- , , : .



, , , .



  1. , , 100% sql-: dml-.

    : , .

    : - -, , -.
  2. FORCE LOGGING, ARCHIVELOG . - , .
  3. -: , "";

    : , , "":


, .
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


SLOB-

, :



At the heart of SLOB is the β€œSLOB method.” The SLOB Method aims to test platforms

without application contention. One cannot drive maximum hardware performance

using application code that is, for example, bound by application locking or even

sharing Oracle Database blocks. That’s rightβ€”there is overhead when sharing data

in data blocks! But SLOBβ€”in its default deploymentβ€”is immune to such contention.

: , .

-, -t runit.sh SLOB-

-, - - , -, UPDATE_PCT

: SLOB , β€” , awr- ( ).



SLOB - 30 .

, , - , .



β€” , .

:



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


:



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


:



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"


.. (: - ) , .



, - .

: , , .

β€” - .

β€” , , , , -.

, , .

β€” 8 .



-,
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


.

, , :



  1. . : [32, 1024] ;
  2. - . : [2,32];
  3. log_archive_max_processes : [1,8];
  4. commit_logging : batch|immediate;
  5. commit_wait : wait|nowait;
  6. log_buffer : [2,128] .
  7. log_checkpoint_timeout : [60,1200]
  8. db_writer_processes : [1,4]
  9. undo_retention : [30;300]
  10. transactions_per_rollback_segment : [1,8]
  11. disk_asynch_io : true|false;
  12. filesystemio_options : none|setall|directIO|asynch;
  13. db_block_checking : OFF|LOW|MEDIUM|FULL;
  14. db_block_checksum : OFF|TYPICAL|FULL;


, oracle- , , β€” , , , , , , , .



.



, .



: , , , : .

: , .



.., .

cran-r, ..: , β€” R-.



, , , : GA ()

, , , (, ) - .



, : 14- β€” .



, , β€” .



.., , R- :



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


, lower upper ga , , , ( ) -.



ga- -.



, .., , , -, , , .



..: , : .



.., , - :



  1. β€” .
  2. - -, . : .

    , - , β€” .. .
  3. : ( : )
  4. : , β€” . ( : )
  5. : . .
  6. , .. , .


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


.. : -.



ga-, , , β€” .

, : , - .



, , N- .



, , R-, .



.



, - evaluate, -, , cran-r - system2



: -, .



:



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


β€” , evaluate -, , -:



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


, .., , , .



..: attribute-importamce .



, .



, , :



gambar



, :

gambar

, , : β€” -, - / , .



. , , ~8 tps: .

β€” , , .



.

, , , , ga-, -: .

β€” , , , .



attribute-importance , : (, β€” ) .

: β€” .



attribute-importance .



, , randomForest R- ()

randomForest, , -, .



β€” , : tps;

β€” .



randomForest : %IncMSE β€” / , , MSE- (Mean Squared Error);



IncNodePurity β€” , , , , , , .

..: ( , - - ).



- R-, :



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


, , .

( β€” , ).



R- caret, .



, , , :



gambar



. .., :



  1. , , commit_wait

    , io- -, - , current- : , .

    nowait , tps-: - io -.

    β€” , . : .
  2. - : .

    -, , / -.

    : - / - -.

    , .
  3. db_block_checksum: , , β€” - .

    , , β€” , : / .

    , , , , β€” .

    , , () β€” , , , , , "" , .


.



, : .



, , () .



β€” : " " .



.

, , , .



, , , , β€” .



Dalam praktiknya, ini adalah: pertukaran biaya pemahaman sistem kustom, untuk biaya persiapan pengujian operasi sistem tersebut.



Secara terpisah, saya mencatat: dalam pendekatan ini, tingkat kecukupan pengujian sistem terhadap kondisi operasinya yang akan dimilikinya dalam produksi sangat penting.



Terima kasih atas perhatiannya, waktunya.




All Articles