Elmi poke metodu və ya etalonlardan və optimallaşdırma alqoritmindən istifadə edərək verilənlər bazası konfiqurasiyasını necə seçmək olar

Salam

Tapıntımı bölüşmək qərarına gəldim - düşüncənin, sınaq və səhvin bəhrəsi.
Ümumiyyətlə: bu, əlbəttə ki, tapıntı deyil - bütün bunlar uzun müddətdir tətbiq olunan statistik məlumatların emalı və hər hansı bir sistemin optimallaşdırılması ilə məşğul olanlara məlum olmalı idi, xüsusən də DBMS deyil.
Və: bəli, bilirlər, araşdırmaları ilə bağlı maraqlı məqalələr yazırlar, misal (UPD.: şərhlərdə çox maraqlı bir layihəyə diqqət çəkdilər: ottertune )
Digər tərəfdən: mən bu yanaşmanın İnternetdə İT mütəxəssisləri, DBA arasında geniş yayılmış qeydini və ya yayılmasını görmürəm.

Beləliklə, nöqtəyə.

Fərz edək ki, bir vəzifəmiz var: bir növ işə xidmət etmək üçün müəyyən bir xidmət sistemi qurmaq.

Bu iş haqqında məlumdur: bu nədir, bu işin keyfiyyəti necə ölçülür və bu keyfiyyətin ölçülməsi üçün meyar nədir.

Gəlin, onun az və ya çox bilindiyini və başa düşüldüyünü fərz edək: bu xidmət sistemində (və ya onunla) iş tam olaraq necə həyata keçirilir.

"Daha çox və ya daha az" - bu o deməkdir ki, istehsalda olacaqlara kifayət qədər adekvat sınaq yükü ilə sintez edilə bilən və sistemə tətbiq oluna bilən müəyyən bir alət, yardım proqramı, xidmət hazırlamaq (və ya onu haradan almaq) mümkündür; istehsalatda işləmək üçün kifayət qədər münasib şəraitdə.

Tutaq ki, bu xidmət sistemi üçün bir sıra tənzimləmə parametrləri məlumdur, bu sistemin işinin məhsuldarlığı baxımından bu sistemi konfiqurasiya etmək üçün istifadə edilə bilər.

Və problem nədir - bu xidmət sistemi haqqında kifayət qədər tam bir anlayış yoxdur, bu sistemin parametrlərini müəyyən bir platformada gələcək yükləmə üçün mütəxəssis şəkildə konfiqurasiya etməyə və sistemin tələb olunan məhsuldarlığını əldə etməyə imkan verir.

Yaxşı. Bu, demək olar ki, həmişə belədir.

Burada nə edə bilərsən?

Yaxşı, ağla gələn ilk şey bu sistemin sənədlərinə baxmaqdır. Tənzimləmə parametrlərinin dəyərləri üçün məqbul diapazonların nə olduğunu anlayın. Və, məsələn, koordinat eniş metodundan istifadə edərək, testlərdə sistem parametrləri üçün dəyərlər seçin.

Bunlar. sistemə konfiqurasiya parametrləri üçün müəyyən bir dəyər dəsti şəklində bir növ konfiqurasiya verin.

Bu çox alət-kommunal, yük generatorundan istifadə edərək, ona sınaq yükü tətbiq edin.
Və dəyərə baxın - cavab və ya sistemin keyfiyyətinin metrikası.

İkinci fikir, bunun çox uzun müddət olduğu qənaəti ola bilər.

Yaxşı, yəni: bir çox parametr parametrləri varsa, onların icra edilən dəyərlərinin diapazonları böyükdürsə, hər bir fərdi yük testini tamamlamaq üçün çox vaxt lazımdırsa, onda: bəli, bütün bunlar qəbuledilməz ola bilər. uzun müddət.

Yaxşı, başa düşə və xatırlaya biləcəyiniz şey budur.

Xidmət sisteminin parametrləri parametrlərinin dəyərlər dəstində bəzi dəyərlərin ardıcıllığı kimi bir vektor olduğunu öyrənə bilərsiniz.

Hər bir belə vektor, digər şeylər bərabərdir (bu vektorun təsirinə məruz qalmamaq şərti ilə) tamamilə müəyyən bir metrik dəyərə uyğun gəlir - sınaq yükü altında sistemin iş keyfiyyətinin göstəricisi.

Yəni

Sistem konfiqurasiya vektorunu kimi işarə edək Elmi poke metodu və ya etalonlardan və optimallaşdırma alqoritmindən istifadə edərək verilənlər bazası konfiqurasiyasını necə seçmək olarHara Elmi poke metodu və ya etalonlardan və optimallaşdırma alqoritmindən istifadə edərək verilənlər bazası konfiqurasiyasını necə seçmək olar; Harada Elmi poke metodu və ya etalonlardan və optimallaşdırma alqoritmindən istifadə edərək verilənlər bazası konfiqurasiyasını necə seçmək olar — sistem konfiqurasiya parametrlərinin sayı, bu parametrlərin neçəsi var.

Və buna uyğun metrikanın dəyəri Elmi poke metodu və ya etalonlardan və optimallaşdırma alqoritmindən istifadə edərək verilənlər bazası konfiqurasiyasını necə seçmək olar kimi işarə edək
Elmi poke metodu və ya etalonlardan və optimallaşdırma alqoritmindən istifadə edərək verilənlər bazası konfiqurasiyasını necə seçmək olar, onda bir funksiya alırıq: Elmi poke metodu və ya etalonlardan və optimallaşdırma alqoritmindən istifadə edərək verilənlər bazası konfiqurasiyasını necə seçmək olar

Yaxşı, onda: mənim vəziyyətimdə hər şey dərhal aşağı düşür: tələbə günlərimdən demək olar ki, unudulmuşam, funksiyanın ekstremumunu axtarmaq üçün alqoritmlər.

Yaxşı, amma burada təşkilati və tətbiqi sual yaranır: hansı alqoritmdən istifadə etmək.

  1. Mənasında - əl ilə daha az kodlaya biləsiniz.
  2. Və işləməsi üçün, yəni. ekstremumu (əgər varsa), yaxşı, ən azı koordinat enişindən daha sürətli tapdı.

Birinci nöqtə, bu cür alqoritmlərin artıq tətbiq olunduğu və müəyyən formada kodda istifadəyə hazır olduğu bəzi mühitlərə baxmaq lazım olduğuna işarə edir.
Yaxşı, bilirəm python и cran-r

İkinci məqam o deməkdir ki, alqoritmlərin özləri, onların nə olduğu, tələblərinin nədən ibarət olduğu və işinin xüsusiyyətləri haqqında oxumaq lazımdır.

Verdikləri faydalı yan təsirlər ola bilər - nəticələr və ya birbaşa alqoritmin özündən.

Yaxud onlar alqoritmin nəticələrindən əldə edilə bilər.

Çox şey giriş şərtlərindən asılıdır.

Məsələn, əgər nədənsə daha tez nəticə əldə etmək lazımdırsa, onda siz gradient eniş alqoritmlərinə baxmaq və onlardan birini seçmək lazımdır.

Və ya vaxt o qədər də vacib deyilsə, məsələn, genetik alqoritm kimi stoxastik optimallaşdırma üsullarından istifadə edə bilərsiniz.

Bu yanaşmanın işini, sistem konfiqurasiyasını seçərək, genetik alqoritmdən istifadə edərək, növbəti, belə deyək: laboratoriya işində nəzərdən keçirməyi təklif edirəm.

Orijinal:

  1. Bir xidmət sistemi olaraq olsun: oracle xe 18c
  2. O, əməliyyat fəaliyyətinə və məqsədə xidmət etsin: alt verilənlər bazasının ən yüksək ötürücülük qabiliyyətini tranzaksiyalar/san ilə əldə etmək.
  3. Əməliyyatlar verilənlərlə işləmək xarakterinə və iş kontekstinə görə çox fərqli ola bilər.
    Razılaşaq ki, bunlar böyük miqdarda cədvəl məlumatlarını emal etməyən əməliyyatlardır.
    O mənada ki, onlar təkrar etməkdən daha çox geri qaytarma məlumatı yaratmırlar və sətirlərin və böyük cədvəllərin böyük faizini emal etmirlər.

Bunlar az və ya çox böyük cədvəldə bir sıra dəyişən, bu cədvəldə az sayda indekslə işləyən əməliyyatlardır.

Bu vəziyyətdə: əməliyyatların işlənməsi üçün alt verilənlər bazasının məhsuldarlığı, qeyd-şərtlə redoks verilənlər bazası tərəfindən emal keyfiyyəti ilə müəyyən ediləcəkdir.

İmtina - subdb parametrləri haqqında xüsusi olaraq danışsaq.

Çünki, ümumi halda, məsələn, cədvəl verilənləri və/və ya cədvəl modeli ilə istifadəçi işinin dizaynına görə SQL seansları arasında əməliyyat kilidləri ola bilər.

Hansı ki, bu, əlbəttə ki, TPS metrikasına depressiv təsir göstərəcək və bu, alt verilənlər bazasına nisbətən ekzogen amil olacaq: yaxşı, cədvəl modeli belə tərtib edilib və oradakı məlumatlarla işləmək tıxanmaların baş verməsidir.

Buna görə də, eksperimentin təmizliyi üçün bu amili istisna edəcəyik və aşağıda dəqiq necə olduğunu aydınlaşdıracağam.

  1. Dəqiqlik üçün fərz edək ki, verilənlər bazasına təqdim edilən SQL əmrlərinin 100%-i DML əmrləridir.
    Testlərdə istifadəçinin alt verilənlər bazası ilə işləməsinin xüsusiyyətləri eyni olsun.
    Məhz: skl seanslarının sayı, cədvəl məlumatları, skl seanslarının onlarla necə işlədiyi.
  2. Subd işləyir FORCE LOGGING, ARCHIVELOG mods. Flashback-verilənlər bazası rejimi subd səviyyəsində söndürülür.
  3. Qeydləri təkrarlayın: ayrıca fayl sistemində, ayrıca "diskdə" yerləşir;
    Verilənlər bazasının fiziki komponentinin qalan hissəsi: başqa, ayrıca fayl sistemində, ayrıca "diskdə":

Fiziki cihaz haqqında ətraflı məlumat. laboratoriya verilənlər bazası komponentləri

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

Başlanğıcda, bu yükləmə şərtləri altında, əməliyyat subd istifadə etmək istədim SLOB yardım proqramı
Onun elə gözəl xüsusiyyəti var ki, müəllifdən sitat gətirirəm:

SLOB-un mərkəzində “SLOB metodu” dayanır. SLOB Metodunun məqsədi platformaları sınaqdan keçirməkdir
ərizə mübahisəsi olmadan. Maksimum hardware performansını idarə edə bilməzsiniz
məsələn, proqramın kilidlənməsi və ya hətta bağlanması ilə bağlı olan proqram kodundan istifadə etməklə
Oracle Database bloklarının paylaşılması. Düzdür, məlumat mübadiləsi zamanı əlavə yük var
məlumat bloklarında! Ancaq SLOB - standart yerləşdirmədə - bu cür mübahisələrə qarşı immunitetlidir.

Bu bəyannamə: uyğun gəlir, belədir.
Cl seanslarının paralellik dərəcəsini tənzimləmək rahatdır, əsas budur -t yardım proqramını işə salın runit.sh SLOB-dan
DML əmrlərinin faizi subd-yə göndərilən mətn mesajlarının sayında, hər mətn sessiyasında, parametrdə tənzimlənir. UPDATE_PCT
Ayrı-ayrılıqda və çox rahat: SLOB özü, yükləmə seansından əvvəl və sonra - statspack və ya awr-snapshots (hazırlanmaq üçün təyin olunan) hazırlayır.

Lakin məlum oldu ki SLOB 30 saniyədən az davam edən SQL seanslarını dəstəkləmir.
Ona görə də mən əvvəlcə yükləyicinin öz fəhlə-kəndli variantını kodladım, sonra isə işlək vəziyyətdə qaldı.

Yükləyicinin nə etdiyini və bunu necə etdiyini aydınlaşdırmaq üçün icazə verin.
Əsasən yükləyici belə görünür:

İşçi kodu

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

İşçilər bu şəkildə işə salınır:

Çalışan işçilər

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

Və işçilər üçün masalar belə hazırlanır:

Cədvəllərin yaradılması

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"

Bunlar. Hər bir işçi üçün (praktiki olaraq: DB-də ayrıca SQL sessiyası) işçinin işlədiyi ayrıca cədvəl yaradılır.

Bu, işçi seansları arasında əməliyyat kilidlərinin olmamasını təmin edir.
Hər bir işçi: eyni şeyi edir, öz masası ilə, masalar hamısı eynidir.
Bütün işçilər eyni vaxtda işi yerinə yetirirlər.
Üstəlik, kifayət qədər uzun müddətdir ki, məsələn, bir günlük keçid mütləq baş versin və bir dəfədən çox.
Yaxşı, müvafiq olaraq, əlaqəli xərclər və təsirlər yarandı.
Mənim vəziyyətimdə işçilərin iş müddətini 8 dəqiqəyə konfiqurasiya etdim.

Yük altında alt bölmənin işini təsvir edən statspack hesabatının bir hissəsi

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

Laboratoriya işinə qayıdırıq.
Digər şeylər bərabər olduqda, laboratoriya alt verilənlər bazasının aşağıdakı parametrlərinin dəyərlərini dəyişdirəcəyik:

  1. Verilənlər bazası jurnalının qruplarının ölçüsü. dəyər diapazonu: [32, 1024] MB;
  2. Verilənlər bazasındakı jurnal qruplarının sayı. qiymət diapazonu: [2,32];
  3. log_archive_max_processes qiymət diapazonu: [1,8];
  4. commit_logging iki dəyərə icazə verilir: batch|immediate;
  5. commit_wait iki dəyərə icazə verilir: wait|nowait;
  6. log_buffer dəyər diapazonu: [2,128] MB.
  7. log_checkpoint_timeout dəyər diapazonu: [60,1200] saniyə
  8. db_writer_processes dəyər diapazonu: [1,4]
  9. undo_retention dəyər diapazonu: [30;300] saniyə
  10. transactions_per_rollback_segment dəyər diapazonu: [1,8]
  11. disk_asynch_io iki dəyərə icazə verilir: true|false;
  12. filesystemio_options aşağıdakı dəyərlərə icazə verilir: none|setall|directIO|asynch;
  13. db_block_checking aşağıdakı dəyərlərə icazə verilir: OFF|LOW|MEDIUM|FULL;
  14. db_block_checksum aşağıdakı dəyərlərə icazə verilir: OFF|TYPICAL|FULL;

Oracle verilənlər bazalarının saxlanmasında təcrübəsi olan bir şəxs, göstərilən məlumatlarla işləmək üçün verilənlər bazasının daha çox məhsuldarlığını əldə etmək üçün göstərilən parametrlərdən və onların məqbul dəyərlərindən nə və hansı dəyərlərin təyin edilməli olduğunu, şübhəsiz ki, artıq deyə bilər. tətbiq kodu, yuxarıda.

Amma.

Laboratoriya işinin məqsədi, optimallaşdırma alqoritminin özünün bizim üçün nisbətən tez bir zamanda aydınlaşdıracağını göstərməkdir.

Bizim üçün geriyə sadəcə olaraq, hansı parametrləri və hansı diapazonlarda dəyişdiriləcəyini öyrənmək kifayətdir ki, sənədə fərdiləşdirilə bilən sistem vasitəsilə baxmaq kifayətdir.
Həm də: seçilmiş optimallaşdırma alqoritminin xüsusi sistemi ilə işləmək üçün istifadə ediləcək kodu kodlayın.

Beləliklə, indi kod haqqında.
haqqında yuxarıda danışdım cran-r, yəni: fərdiləşdirilmiş sistemlə bütün manipulyasiyalar R skripti şəklində təşkil edilir.

Faktiki tapşırıq, təhlil, metrik dəyərlə seçim, sistem vəziyyəti vektorları: bu paketdir GA (sənədlər)
Paket, bu halda, vektorların (paket baxımından xromosomların) kəsr hissəsi olan nömrələr sətirləri şəklində göstərilməsini gözlədiyi mənada çox uyğun deyil.

Və mənim vektorum, parametr parametrlərinin dəyərlərindən: bunlar 14 kəmiyyətdir - tam ədədlər və sətir dəyərləri.

Əlbəttə ki, sətir dəyərlərinə bəzi xüsusi nömrələr təyin etməklə problemin qarşısını almaq olar.

Beləliklə, sonda R skriptinin əsas hissəsi belə görünür:

GA::ga-ya zəng edin

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

Budur, köməyi ilə lower и upper alt proqram atributları ga mahiyyətcə, axtarış sahəsinin sahəsi müəyyən edilir, onun daxilində uyğunluq funksiyasının maksimum dəyərinin alınacağı belə bir vektor (və ya vektorlar) üçün axtarış aparılacaqdır.

ga alt proqramı fitness funksiyasını maksimuma çatdıran axtarışı həyata keçirir.

Yaxşı, onda belə çıxır ki, bu vəziyyətdə vektoru subd-nin müəyyən parametrləri üçün dəyərlər dəsti kimi başa düşən fitnes funksiyası subd-dən bir metrik almalıdır.

Yəni: verilmiş subd quraşdırması və subd-də verilən yüklə nə qədər: subd saniyədə əməliyyatları emal edir.

Yəni, açılarkən fitnes funksiyası daxilində aşağıdakı çox addımlar yerinə yetirilməlidir:

  1. Rəqəmlərin giriş vektorunun işlənməsi - onu subdata parametrləri üçün dəyərlərə çevirmək.
  2. Verilmiş ölçüdə verilmiş sayda təkrar qruplar yaratmaq cəhdi. Üstəlik, cəhd uğursuz ola bilər.
    Təcrübənin saflığı üçün subd-də artıq mövcud olan jurnal qrupları, müəyyən miqdarda və müəyyən ölçüdə - d.b. silindi.
  3. Əvvəlki nöqtə uğurlu olarsa: verilənlər bazasına konfiqurasiya parametrlərinin dəyərlərinin təyin edilməsi (yenidən: uğursuzluq ola bilər)
  4. Əvvəlki addım uğurlu olarsa: yeni təyin olunmuş parametr dəyərlərinin qüvvəyə minməsi üçün subd-nin dayandırılması, subd-nin işə salınması. (yenə: xəta ola bilər)
  5. Əvvəlki addım uğurlu olarsa: yükləmə testini həyata keçirin. subd-dən ölçüləri əldə edin.
  6. Subd-ni orijinal vəziyyətinə qaytarın, yəni. əlavə log qruplarını silin, orijinal alt verilənlər bazası konfiqurasiyasını işə qaytarın.

Fitness funksiyası kodu

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

Bu. bütün işlər: fitnes funksiyasında yerinə yetirilir.

Ga-alt proqram vektorları, daha doğrusu, xromosomları emal edir.
Hansı ki, bizim üçün ən vacib olan, fitnes funksiyasının böyük dəyər verdiyi genlərə malik xromosomların seçilməsidir.

Bu, mahiyyət etibarilə, N ölçülü axtarış fəzasında vektordan istifadə edərək optimal xromosom dəstinin axtarışı prosesidir.

Çox aydın, ətraflı izahat, R-kod nümunələri ilə, bir genetik alqoritmin işi.

İki texniki məqamı ayrıca qeyd etmək istərdim.

Funksiyadan köməkçi çağırışlar evaluate, məsələn, stop-start, subd parametrinin dəyərinin təyin edilməsi əsasında həyata keçirilir cran-r funksiyaları system2

Onun köməyi ilə: bəzi bash skripti və ya əmri çağırılır.

Misal üçün:

set_db_parametri

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

İkinci nöqtə xəttdir, evaluate xüsusi metrik dəyəri və onun müvafiq tənzimləmə vektorunu log faylına saxlamaqla funksiyalar:

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

Bu vacibdir, çünki bu verilənlər massivindən tənzimləmə vektorunun komponentlərindən hansının metrik qiymətə daha çox və ya az təsir göstərdiyi barədə əlavə məlumat əldə etmək mümkün olacaq.

Yəni: atribut-əhəmiyyət təhlili aparmaq mümkün olacaq.

Bəs nə baş verə bilər?

Qrafik şəklində, testləri artan metrik qaydada sifariş etsəniz, şəkil aşağıdakı kimidir:

Elmi poke metodu və ya etalonlardan və optimallaşdırma alqoritmindən istifadə edərək verilənlər bazası konfiqurasiyasını necə seçmək olar

Metrikin həddindən artıq dəyərlərinə uyğun gələn bəzi məlumatlar:
Elmi poke metodu və ya etalonlardan və optimallaşdırma alqoritmindən istifadə edərək verilənlər bazası konfiqurasiyasını necə seçmək olar
Burada, nəticələrlə ekran görüntüsündə aydınlaşdıracağam: tənzimləmə vektorunun dəyərləri tərtib edilmiş parametrlərin/parametr dəyərlərinin diapazonlarının nömrə siyahısı baxımından deyil, fitnes funksiyası kodu baxımından verilir. mətndə yuxarıda.

Yaxşı. Çox yoxsa az, ~8 min tps: ayrıca sual.
Laboratoriya işləri çərçivəsində bu rəqəm önəmli deyil, vacib olan dinamikadır, bu qiymətin necə dəyişməsidir.

Burada dinamika yaxşıdır.
Aydındır ki, ən azı bir amil metrikanın, ga-alqoritmin dəyərinə əhəmiyyətli dərəcədə təsir göstərir, xromosom vektorları ilə çeşidlənir: əhatə olunur.
Əyri dəyərlərinin kifayət qədər güclü dinamikasına əsasən, əhəmiyyətli dərəcədə kiçik olsa da, təsir göstərən ən azı bir başqa amil var.

Bu sizə lazım olan yerdir attribute-importance hansı atributları (yaxşı, bu halda tənzimləmə vektorunun komponentləri) və metrik dəyərə nə dərəcədə təsir etdiyini başa düşmək üçün təhlil.
Və bu məlumatdan: əhəmiyyətli atributlardakı dəyişikliklərin hansı amillərə təsir etdiyini anlayın.

İcra etmək attribute-importance bir çox yolla ola bilər.

Bu məqsədlər üçün alqoritmi bəyənirəm randomForest Eyni adlı R paketi (sənədlər)
randomForest, mən onun ümumi işini və xüsusilə atributların əhəmiyyətini qiymətləndirməyə yanaşmasını başa düşdüyümə görə, cavab dəyişəninin atributlardan asılılığının müəyyən modelini qurur.

Bizim vəziyyətimizdə cavab dəyişəni yük testlərində verilənlər bazasından əldə edilən bir metrikdir: tps;
Və atributlar tənzimləmə vektorunun komponentləridir.

Və belədir randomForest hər bir model atributunun əhəmiyyətini iki rəqəmlə qiymətləndirir: %IncMSE — modeldə bu atributun olması/yoxluğu bu modelin MSE keyfiyyətini necə dəyişir (Orta kvadrat xəta);

Və IncNodePurity, bu atributun dəyərlərinə əsaslanaraq, müşahidələri olan bir məlumat dəstinin nə qədər yaxşı bölünə biləcəyini əks etdirən bir rəqəmdir ki, bir hissədə metrikanın bir dəyəri ilə, digərində isə izah edilən məlumat var. metrikanın başqa bir dəyəri.
Yaxşı, yəni: bu nə dərəcədə təsnifat atributudur (RandomForest-də ən aydın, rus dilində izahat gördüm burada).

Yük testlərinin nəticələri ilə məlumat dəstinin işlənməsi üçün işçi-kəndli R kodu:

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

Siz alqoritmin hiperparametrlərini birbaşa əllərinizlə seçə və modelin keyfiyyətinə diqqət yetirərək, doğrulama verilənlər bazası üzrə proqnozları daha dəqiq yerinə yetirən modeli seçə bilərsiniz.
Bu iş üçün bir növ funksiya yaza bilərsiniz (yeri gəlmişkən, bir növ optimallaşdırma alqoritmindən istifadə etməklə).

R paketindən istifadə edə bilərsiniz caret, məqam önəmli deyil.

Nəticədə, bu halda, atributların əhəmiyyət dərəcəsini qiymətləndirmək üçün aşağıdakı nəticə əldə edilir:

Elmi poke metodu və ya etalonlardan və optimallaşdırma alqoritmindən istifadə edərək verilənlər bazası konfiqurasiyasını necə seçmək olar

Yaxşı. Beləliklə, qlobal düşüncəyə başlaya bilərik:

  1. Belə çıxır ki, bu sınaq şəraitində ən əhəmiyyətlisi parametrdir commit_wait
    Texniki cəhətdən o, subdb log buferindən cari jurnal qrupuna redo məlumatlarının yazılması io əməliyyatının icra rejimini təyin edir: sinxron və ya asinxron.
    Dəyər nowait Bu, tps metrikasının dəyərinin demək olar ki, şaquli, dəfələrlə artması ilə nəticələnir: bu, asinxron io rejiminin təkrarlama qruplarına daxil edilməsidir.
    Ayrı bir sual, bunu qida bazasında etməli olub-olmamağınızdır. Burada yalnız qeyd etməklə kifayətlənirəm: bu mühüm amildir.
  2. Subd: log buferinin ölçüsünün əhəmiyyətli bir amil olması məntiqlidir.
    Jurnal buferinin ölçüsü nə qədər kiçik olarsa, onun tamponlama qabiliyyəti bir o qədər az olarsa, bir o qədər tez-tez daşır və/və ya yeni redoks məlumatlarının bir hissəsi üçün orada boş sahəni ayıra bilmir.
    Bu o deməkdir: log buferində yerin ayrılması və/yaxud ondan redo məlumatlarının təkrar qruplara atılması ilə bağlı gecikmələr.
    Bu gecikmələr, əlbəttə ki, əməliyyatlar üçün verilənlər bazasının ötürmə qabiliyyətinə təsir etməlidir və təsir göstərir.
  3. Parametr db_block_checksum: yaxşı, həmçinin, ümumiyyətlə, aydındır - əməliyyatın işlənməsi alt verilənlər bazasının bufer keşində darty bloklarının meydana gəlməsinə səbəb olur.
    Hansı ki, verilənlər bloklarının yoxlama məbləğlərinin yoxlanılması aktiv olduqda, verilənlər bazası emal etməlidir - verilənlər blokunun gövdəsindən bu yoxlama məbləğlərini hesablayın, verilənlər blokunun başlığında yazılanlarla yoxlayın: uyğun gəlir/uyğun gəlmir.
    Bu cür iş, yenə də məlumatların işlənməsini gecikdirə bilməz və buna görə də bu parametri təyin edən parametr və mexanizm əhəmiyyətli olur.
    Buna görə də satıcı bu parametr üçün sənədlərdə onun (parametr) fərqli dəyərləri təklif edir və qeyd edir ki, bəli, təsir olacaq, amma yaxşı, siz “söndürülmüş” və müxtəlif təsirlər.

Yaxşı, qlobal bir nəticə.

Ümumiyyətlə, yanaşma olduqca işlək görünür.

O, müəyyən bir xidmət sisteminin yük sınağının ilkin mərhələlərində onun (sistemin) yük üçün optimal konfiqurasiyasını seçmək, sistemin yük üçün qurulmasının xüsusiyyətlərini çox araşdırmamaq üçün özünə tamamilə imkan verir.

Ancaq bu, bunu tamamilə istisna etmir - ən azı anlayış səviyyəsində: sistem "tənzimləmə düymələri" və bu düymələrin icazə verilən fırlanma diapazonları haqqında bilinməlidir.

Bundan sonra yanaşma nisbətən tez optimal sistem konfiqurasiyasını tapa bilər.
Və sınaq nəticələrinə əsasən, sistemin keyfiyyət göstəriciləri ilə sistemin konfiqurasiya parametrlərinin dəyərləri arasındakı əlaqənin xarakteri haqqında məlumat əldə etmək mümkündür.

Hansı ki, əlbəttə ki, sistemin bu çox dərin anlayışının yaranmasına, onun ən azı müəyyən bir yük altında işləməsinə kömək etməlidir.

Praktikada bu, sistemin belə sınaqdan keçirilməsinin hazırlanması xərcləri üçün fərdiləşdirilmiş sistemin başa düşülməsi xərclərinin mübadiləsidir.

Ayrı-ayrılıqda qeyd etmək istərdim: bu yanaşmada sistem testinin kommersiya istismarında olacağı iş şəraitinə adekvatlıq dərəcəsi çox vacibdir.

Diqqətinizə və vaxtınıza görə təşəkkür edirik.

Mənbə: www.habr.com

Добавить комментарий