Ilmiy poke usuli yoki benchmarklar va optimallashtirish algoritmidan foydalangan holda ma'lumotlar bazasi konfiguratsiyasini qanday tanlash kerak

Salom.

Men o'z topilmalarimni baham ko'rishga qaror qildim - fikrlash, sinov va xatolik samarasi.
Umuman olganda: bu topilma emas, albatta - bularning barchasi statistik ma'lumotlarni amaliy qayta ishlash va har qanday tizimni optimallashtirish bilan shug'ullanadiganlarga uzoq vaqtdan beri ma'lum bo'lishi kerak edi, ayniqsa ma'lumotlar bazasi ma'lumotlar bazasi.
Va: ha, ular bilishadi, ular o'zlarining tadqiqotlari bo'yicha qiziqarli maqolalar yozadilar, misol (UPD: sharhlarda ular juda qiziqarli loyihani ta'kidlashdi: ottertune )
Boshqa tomondan: o'z-o'zidan men IT-mutaxassislari, DBA o'rtasida Internetda ushbu yondashuv haqida keng tarqalgan eslatma yoki tarqatishni ko'rmayapman.

Shunday qilib, nuqtaga.

Faraz qilaylik, bizda vazifa bor: qandaydir ishlarga xizmat ko'rsatish uchun ma'lum bir xizmat tizimini o'rnatish.

Bu ish haqida ma'lum: bu nima, bu ishning sifati qanday o'lchanadi va bu sifatni o'lchash mezoni qanday.

Keling, ko'p yoki kamroq ma'lum va tushunilgan deb faraz qilaylik: ushbu xizmat tizimida (yoki u bilan) ish qanday amalga oshirilganligi aniq.

"Ko'proq yoki kamroq" - bu ishlab chiqarishda bo'ladigan narsaga etarlicha mos keladigan sinov yuki bilan sintez qilinishi va tizimga qo'llanilishi mumkin bo'lgan ma'lum bir vositani, yordamchi dasturni, xizmatni tayyorlash (yoki uni biron bir joydan olish) mumkinligini anglatadi. ishlab chiqarishda ishlash uchun etarli sharoitlarda.

Keling, ushbu xizmat ko'rsatish tizimi uchun sozlash parametrlari to'plami ma'lum deb faraz qilaylik, bu tizimni ish samaradorligi nuqtai nazaridan sozlash uchun ishlatilishi mumkin.

Va muammo nimada - ushbu xizmat tizimi haqida etarlicha to'liq tushuncha yo'q, bu sizga ushbu platformada kelajakda yuklash uchun ushbu tizim sozlamalarini malakali tarzda sozlash va tizimning kerakli unumdorligini olish imkonini beradi.

Xo'sh. Bu deyarli har doim shunday bo'ladi.

Bu yerda nima qila olasiz?

Xo'sh, aqlga kelgan birinchi narsa - bu tizim uchun hujjatlarni ko'rib chiqish. Sozlash parametrlarining qiymatlari uchun maqbul diapazonlar nima ekanligini tushunib oling. Va, masalan, koordinatalarni tushirish usulidan foydalanib, testlarda tizim parametrlari uchun qiymatlarni tanlang.

Bular. tizimga konfiguratsiya parametrlari uchun ma'lum qiymatlar to'plami shaklida qandaydir konfiguratsiyani bering.

Ushbu asbob-uskunalar, yuk generatoridan foydalanib, unga sinov yukini qo'llang.
Va qiymatga qarang - javob yoki tizim sifati ko'rsatkichi.

Ikkinchi fikr, bu juda uzoq vaqt degan xulosa bo'lishi mumkin.

Xo'sh, ya'ni: agar sozlash parametrlari juda ko'p bo'lsa, ularning qiymatlari diapazonlari katta bo'lsa, har bir alohida yuk testini bajarish uchun ko'p vaqt kerak bo'lsa, unda: ha, bularning barchasi qabul qilinishi mumkin bo'lmagan vaqt talab qilishi mumkin. uzoq vaqt.

Xo'sh, bu erda nimani tushunishingiz va eslashingiz mumkin.

Xizmat tizimi sozlamalari parametrlari qiymatlari to'plamida ba'zi qiymatlar ketma-ketligi sifatida vektor mavjudligini bilib olishingiz mumkin.

Har bir bunday vektor, boshqa narsalar teng bo'lsa (bu vektor unga ta'sir qilmaydi) metrikaning to'liq aniq qiymatiga mos keladi - sinov yuki ostida tizimning ishlash sifati ko'rsatkichi.

ya'ni

Tizim konfiguratsiya vektorini quyidagicha belgilaymiz Ilmiy poke usuli yoki benchmarklar va optimallashtirish algoritmidan foydalangan holda ma'lumotlar bazasi konfiguratsiyasini qanday tanlash kerakqayerda Ilmiy poke usuli yoki benchmarklar va optimallashtirish algoritmidan foydalangan holda ma'lumotlar bazasi konfiguratsiyasini qanday tanlash kerak; Qayerda Ilmiy poke usuli yoki benchmarklar va optimallashtirish algoritmidan foydalangan holda ma'lumotlar bazasi konfiguratsiyasini qanday tanlash kerak β€” tizim konfiguratsiyasi parametrlari soni, bu parametrlarning qanchasi borligi.

Va bunga mos keladigan metrikaning qiymati Ilmiy poke usuli yoki benchmarklar va optimallashtirish algoritmidan foydalangan holda ma'lumotlar bazasi konfiguratsiyasini qanday tanlash kerak deb belgilaymiz
Ilmiy poke usuli yoki benchmarklar va optimallashtirish algoritmidan foydalangan holda ma'lumotlar bazasi konfiguratsiyasini qanday tanlash kerak, keyin biz funktsiyani olamiz: Ilmiy poke usuli yoki benchmarklar va optimallashtirish algoritmidan foydalangan holda ma'lumotlar bazasi konfiguratsiyasini qanday tanlash kerak

Xo'sh, unda hamma narsa darhol tushadi, mening holimda: talabalik davrimdan deyarli unutilgan, funktsiyaning ekstremumini qidirish algoritmlari.

Yaxshi, lekin bu erda tashkiliy va amaliy savol tug'iladi: qaysi algoritmdan foydalanish kerak.

  1. Bu ma'noda - qo'lda kamroq kodlash uchun.
  2. Va ishlashi uchun, ya'ni. ekstremumni topdi (agar mavjud bo'lsa), yaxshi, hech bo'lmaganda koordinatali tushishdan tezroq.

Birinchi nuqta, biz bunday algoritmlar allaqachon amalga oshirilgan va qaysidir shaklda kodda foydalanishga tayyor bo'lgan ba'zi muhitlarga qarashimiz kerakligini ko'rsatadi.
Xo'sh, bilaman python ΠΈ cran-r

Ikkinchi nuqta, algoritmlarning o'zlari, ular nima, ularning talablari va ishlarining xususiyatlari haqida o'qishingiz kerakligini anglatadi.

Va ular beradigan narsa foydali yon ta'sirlar bo'lishi mumkin - natijalar yoki to'g'ridan-to'g'ri algoritmning o'zidan.

Yoki ularni algoritm natijalaridan olish mumkin.

Ko'p narsa kirish shartlariga bog'liq.

Misol uchun, agar biron sababga ko'ra natijani tezroq olishingiz kerak bo'lsa, unda siz gradient tushish algoritmlariga qarashingiz va ulardan birini tanlashingiz kerak.

Yoki, agar vaqt unchalik muhim bo'lmasa, siz, masalan, genetik algoritm kabi stokastik optimallashtirish usullaridan foydalanishingiz mumkin.

Men ushbu yondashuvning ishini, tizim konfiguratsiyasini tanlashni, genetik algoritmdan foydalangan holda, keyingi, aytganda: laboratoriya ishini ko'rib chiqishni taklif qilaman.

Asl:

  1. Xizmat tizimi sifatida bo'lsin: oracle xe 18c
  2. U tranzaktsion faoliyatga xizmat qilsin va maqsad: tranzaksiyalar/sekundlarda quyi ma'lumotlar bazasining mumkin bo'lgan eng yuqori o'tkazuvchanligini olish.
  3. Tranzaksiyalar ma'lumotlar bilan ishlash tabiati va ish kontekstida juda farq qilishi mumkin.
    Keling, bu katta hajmdagi jadval ma'lumotlarini qayta ishlamaydigan operatsiyalar ekanligiga rozi bo'laylik.
    Ular takrorlashdan ko'ra ko'proq bekor qilish ma'lumotlarini yaratmaydilar va qatorlar va katta jadvallarning katta foizini qayta ishlamaydilar.

Bular ko'p yoki kamroq katta jadvaldagi bir qatorni o'zgartiradigan operatsiyalar bo'lib, bu jadvalda oz sonli indekslar mavjud.

Bunday vaziyatda: tranzaktsiyalarni qayta ishlash uchun subma'lumotlar bazasining unumdorligi, rezerv bilan, redoks ma'lumotlar bazasi tomonidan qayta ishlash sifati bilan belgilanadi.

Rad etish - agar biz subdb sozlamalari haqida gapiradigan bo'lsak.

Chunki, umumiy holatda, masalan, SQL seanslari o'rtasida, foydalanuvchining jadval ma'lumotlari va/yoki jadval modeli bilan ishlash dizayni tufayli tranzaksiya blokirovkalari bo'lishi mumkin.

Bu, albatta, TPS metrikasiga tushkunlikka tushadigan ta'sir qiladi va bu subma'lumotlar bazasiga nisbatan ekzogen omil bo'ladi: jadvalli model shunday yaratilgan va undagi ma'lumotlar bilan ishlash blokirovkalar sodir bo'ladi.

Shuning uchun, eksperimentning tozaligi uchun biz ushbu omilni istisno qilamiz va quyida men qanday qilib aniq tushuntiraman.

  1. Aniqlik uchun ma'lumotlar bazasiga yuborilgan SQL buyruqlarining 100% DML buyruqlari ekanligini faraz qilaylik.
    Testlarda foydalanuvchining subma'lumotlar bazasi bilan ishlash xususiyatlari bir xil bo'lsin.
    Ya'ni: skl seanslari soni, jadval ma'lumotlari, skl seanslari ular bilan qanday ishlaydi.
  2. Subd ishlaydi FORCE LOGGING, ARCHIVELOG mods. Flashback-ma'lumotlar bazasi rejimi subd darajasida o'chirilgan.
  3. Jurnallarni qayta tiklash: alohida fayl tizimida, alohida "diskda" joylashgan;
    Ma'lumotlar bazasining jismoniy komponentining qolgan qismi: boshqa, alohida fayl tizimida, alohida "diskda":

Jismoniy qurilma haqida batafsil ma'lumot. laboratoriya ma'lumotlar bazasi komponentlari

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

Dastlab, ushbu yuklash sharoitida men tranzaksiya subd dan foydalanmoqchi edim SLOB yordam dasturi
Uning shunday ajoyib xususiyati borki, men muallifdan iqtibos keltiraman:

SLOBning markazida "SLOB usuli" mavjud. SLOB usuli platformalarni sinab ko'rishga qaratilgan
ariza bahsisiz. Uskunaning maksimal ishlashini boshqarish mumkin emas
ilova kodini ishlatish, masalan, ilovani blokirovka qilish yoki hatto bog'lash
Oracle ma'lumotlar bazasi bloklarini almashish. To'g'ri - ma'lumotlarni almashishda ortiqcha yuk bor
ma'lumotlar bloklarida! Ammo SLOB - sukut bo'yicha - bunday tortishuvlarga qarshi immunitetga ega.

Bu deklaratsiya: mos keladi, shunday.
Kl seanslarining parallellik darajasini tartibga solish qulay, bu kalit -t yordamchi dasturni ishga tushiring runit.sh SLOB dan
DML buyruqlarining ulushi subd-ga yuboriladigan matnli xabarlar sonida, har bir matn seansida, parametrda tartibga solinadi. UPDATE_PCT
Alohida va juda qulay: SLOB o'zi, yuklash seansidan oldin va keyin - statspack yoki awr-snapshotlarni (tayyorlash uchun o'rnatilgan) tayyorlaydi.

Biroq, bu ma'lum bo'ldi SLOB davomiyligi 30 soniyadan kam bo'lgan SQL seanslarini qo'llab-quvvatlamaydi.
Shuning uchun men birinchi navbatda yuk ko'taruvchining o'zimning ishchi-dehqon versiyasini kodladim, keyin esa u ishlay boshladi.

Aniqlik uchun yuklovchi nima qilishini va buni qanday qilishini aniqlab beraman.
Asosan loader quyidagicha ko'rinadi:

Ishchi kodi

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

Ishchilar quyidagi tarzda ishga tushiriladi:

Ishlayotgan ishchilar

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

Va ishchilar uchun jadvallar quyidagicha tayyorlanadi:

Jadvallar yaratish

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"

Bular. Har bir ishchi uchun (amalda: JBda alohida SQL seansi) alohida jadval tuziladi, u bilan ishchi ishlaydi.

Bu ishchi seanslar o'rtasida tranzaksiya blokirovkalari yo'qligini ta'minlaydi.
Har bir ishchi: xuddi shu narsani qiladi, o'z stoli bilan, jadvallar hammasi bir xil.
Barcha ishchilar bir xil vaqt davomida ishni bajaradilar.
Bundan tashqari, etarlicha uzoq vaqt davomida, masalan, log kaliti albatta sodir bo'ladi va bir necha marta.
Shunga ko'ra, tegishli xarajatlar va ta'sirlar paydo bo'ldi.
Mening holimda men ishchilar ishining davomiyligini 8 daqiqaga sozladim.

Subdning yuk ostida ishlashini tavsiflovchi statspack hisobotining bir qismi

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 ishiga qaytish.
Boshqa narsalar teng bo'lsa, biz laboratoriya subma'lumotlar bazasining quyidagi parametrlarining qiymatlarini o'zgartiramiz:

  1. Ma'lumotlar bazasi jurnali guruhlari hajmi. qiymat diapazoni: [32, 1024] MB;
  2. Ma'lumotlar bazasidagi jurnal guruhlari soni. qiymat diapazoni: [2,32];
  3. log_archive_max_processes qiymat diapazoni: [1,8];
  4. commit_logging ikkita qiymatga ruxsat beriladi: batch|immediate;
  5. commit_wait ikkita qiymatga ruxsat beriladi: wait|nowait;
  6. log_buffer qiymat diapazoni: [2,128] MB.
  7. log_checkpoint_timeout qiymat diapazoni: [60,1200] soniya
  8. db_writer_processes qiymat diapazoni: [1,4]
  9. undo_retention qiymat diapazoni: [30;300] soniya
  10. transactions_per_rollback_segment qiymat diapazoni: [1,8]
  11. disk_asynch_io ikkita qiymatga ruxsat beriladi: true|false;
  12. filesystemio_options quyidagi qiymatlarga ruxsat beriladi: none|setall|directIO|asynch;
  13. db_block_checking quyidagi qiymatlarga ruxsat beriladi: OFF|LOW|MEDIUM|FULL;
  14. db_block_checksum quyidagi qiymatlarga ruxsat beriladi: OFF|TYPICAL|FULL;

Oracle ma'lumotlar bazalarini yuritishda tajribaga ega bo'lgan shaxs, ma'lumotlar bazasida ko'rsatilgan ma'lumotlar bilan ishlash uchun ma'lumotlar bazasining ko'proq unumdorligini olish uchun ko'rsatilgan parametrlar va ularning maqbul qiymatlaridan nimani va qanday qiymatlarni belgilash kerakligini aniq aytishi mumkin. ilova kodi, bu erda yuqorida.

Lekin.

Laboratoriya ishining maqsadi optimallashtirish algoritmining o'zi buni biz uchun nisbatan tez aniqlab berishini ko'rsatishdir.

Biz uchun faqat sozlanishi mumkin bo'lgan tizim orqali hujjatni ko'rib chiqish qoladi, faqat qaysi parametrlarni va qaysi diapazonlarda o'zgartirish kerakligini bilish kifoya.
Va shuningdek: tanlangan optimallashtirish algoritmining maxsus tizimi bilan ishlash uchun ishlatiladigan kodni kodlang.

Shunday qilib, endi kod haqida.
Men yuqorida haqida gapirdim cran-r, ya'ni: moslashtirilgan tizim bilan barcha manipulyatsiyalar R skripti shaklida tartibga solinadi.

Haqiqiy vazifa, tahlil, metrik qiymat bo'yicha tanlash, tizim holati vektorlari: bu paket GA (hujjatlar)
Paket, bu holda, juda mos emas, chunki u vektorlarni (xromosomalar, agar paket bo'lsa) kasr qismi bilan raqamlar qatorlari shaklida ko'rsatilishini kutadi.

Va mening vektorim, sozlash parametrlarining qiymatlaridan: bu 14 ta miqdor - butun sonlar va satr qiymatlari.

Muammo, albatta, satr qiymatlariga ba'zi bir aniq raqamlarni belgilash orqali osonlikcha oldini olish mumkin.

Shunday qilib, oxir-oqibat, R skriptining asosiy qismi quyidagicha ko'rinadi:

GA::ga ga qo'ng'iroq qiling

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

Mana, yordam bilan lower ΠΈ upper pastki dastur atributlari ga Mohiyatan, qidiruv maydonining maydoni belgilanadi, uning ichida fitnes funktsiyasining maksimal qiymati olinadigan bunday vektor (yoki vektorlar) uchun qidiruv amalga oshiriladi.

Ga subprogrammasi fitnes funksiyasini maksimal darajada oshiruvchi qidiruvni amalga oshiradi.

Xo'sh, ma'lum bo'lishicha, bu holda, vektorni subdning ma'lum parametrlari uchun qiymatlar to'plami sifatida tushunadigan fitnes funktsiyasi subddan metrikani olishi kerak.

Ya'ni: ma'lum subd sozlamalari va subdda berilgan yuk bilan qancha: subd soniyada tranzaktsiyalarni qayta ishlaydi.

Ya'ni, ochilganda, fitnes funktsiyasi ichida quyidagi ko'p bosqichlarni bajarish kerak:

  1. Raqamlarning kirish vektorini qayta ishlash - uni subma'lumotlar parametrlari uchun qiymatlarga aylantirish.
  2. Berilgan o'lchamdagi ma'lum miqdordagi takroriy guruhlarni yaratishga urinish. Bundan tashqari, urinish muvaffaqiyatsiz bo'lishi mumkin.
    Tajribaning tozaligi uchun subdda allaqachon mavjud bo'lgan jurnal guruhlari, ba'zi miqdorda va ba'zi o'lchamlarda - d.b. o'chirildi.
  3. Agar oldingi nuqta muvaffaqiyatli bo'lsa: ma'lumotlar bazasiga konfiguratsiya parametrlarining qiymatlarini ko'rsatish (yana: xato bo'lishi mumkin)
  4. Agar oldingi qadam muvaffaqiyatli bo'lsa: yangi belgilangan parametr qiymatlari kuchga kirishi uchun subdni to'xtatib, subdni ishga tushiring. (yana: xatolik bo'lishi mumkin)
  5. Agar oldingi qadam muvaffaqiyatli bo'lsa: yuk sinovini o'tkazing. subd dan ko'rsatkichlarni oling.
  6. Subdni asl holatiga qaytaring, ya'ni. qo'shimcha jurnal guruhlarini o'chirish, asl subma'lumotlar bazasi konfiguratsiyasini ishlashga qaytarish.

Fitness funktsiyasi kodi

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. barcha ish: fitnes funktsiyasida bajarilgan.

Ga-subroutin vektorlarni, to'g'rirog'i, xromosomalarni qayta ishlaydi.
Bunda biz uchun eng muhimi, fitnes funktsiyasi katta qiymatlarni keltirib chiqaradigan genlarga ega xromosomalarni tanlashdir.

Bu, mohiyatiga ko'ra, N o'lchovli qidiruv maydonida vektor yordamida xromosomalarning optimal to'plamini izlash jarayonidir.

Juda aniq, batafsil tushuntirish, R-kod misollari bilan, genetik algoritmning ishi.

Men ikkita texnik jihatni alohida ta'kidlamoqchiman.

Funktsiyadan yordamchi chaqiruvlar evaluate, masalan, to'xtatish-start, subd parametrining qiymatini belgilash, asosida amalga oshiriladi cran-r funktsiyalari system2

Buning yordamida: bash skripti yoki buyrug'i chaqiriladi.

Masalan:

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

Ikkinchi nuqta - chiziq, evaluate Muayyan metrik qiymatni va uning mos sozlash vektorini jurnal fayliga saqlash bilan funksiyalar:

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

Bu juda muhim, chunki ushbu ma'lumotlar massividan sozlash vektorining tarkibiy qismlaridan qaysi biri metrik qiymatga ko'proq yoki kamroq ta'sir ko'rsatishi haqida qo'shimcha ma'lumot olish mumkin bo'ladi.

Ya'ni: atribut-muhimlik tahlilini o'tkazish mumkin bo'ladi.

Xo'sh, nima bo'lishi mumkin?

Grafik shaklida, agar siz testlarni o'sib boruvchi metrik tartibda buyurtma qilsangiz, rasm quyidagicha bo'ladi:

Ilmiy poke usuli yoki benchmarklar va optimallashtirish algoritmidan foydalangan holda ma'lumotlar bazasi konfiguratsiyasini qanday tanlash kerak

Ko'rsatkichning ekstremal qiymatlariga mos keladigan ba'zi ma'lumotlar:
Ilmiy poke usuli yoki benchmarklar va optimallashtirish algoritmidan foydalangan holda ma'lumotlar bazasi konfiguratsiyasini qanday tanlash kerak
Bu erda, natijalar bilan skrinshotda men aniqlab beraman: sozlash vektorining qiymatlari tuzilgan parametrlar / parametr qiymatlari diapazonlarining raqamlar ro'yxati bo'yicha emas, balki fitnes funktsiyasi kodi bo'yicha berilgan. matnda yuqorida.

Xo'sh. Ko'pmi yoki ozmi, ~8 ming tsp: alohida savol.
Laboratoriya ishi doirasida bu ko'rsatkich muhim emas, eng muhimi, dinamika, bu qiymat qanday o'zgarishi.

Bu erda dinamika yaxshi.
Ko'rinib turibdiki, hech bo'lmaganda bitta omil metrikaning qiymatiga, ga-algoritmning xromosoma vektorlari orqali saralanishiga sezilarli ta'sir qiladi: qoplangan.
Egri chiziq qiymatlarining etarlicha kuchli dinamikasiga qaraganda, sezilarli darajada kichikroq bo'lsa-da, ta'sir ko'rsatadigan kamida yana bitta omil mavjud.

Bu sizga kerak bo'lgan joy attribute-importance qanday atributlarni (yaxshi, bu holda sozlash vektorining tarkibiy qismlari) va ular metrik qiymatga qanchalik ta'sir qilishini tushunish uchun tahlil qilish.
Va bu ma'lumotlardan: muhim atributlarning o'zgarishi qanday omillarga ta'sir qilganini tushuning.

yugurish attribute-importance turli yo'llar bilan mumkin.

Ushbu maqsadlar uchun menga algoritm yoqadi randomForest Xuddi shu nomdagi R paketi (hujjatlar)
randomForest, men uning umumiy ishini va xususan atributlarning ahamiyatini baholashga yondashuvini tushunganimdek, javob o'zgaruvchisining atributlarga bog'liqligining ma'lum bir modelini quradi.

Bizning holatda, javob o'zgaruvchisi yuk testlarida ma'lumotlar bazasidan olingan ko'rsatkichdir: tps;
Va atributlar sozlash vektorining tarkibiy qismlaridir.

Va shunday randomForest Har bir model atributining ahamiyatini ikkita raqam bilan baholaydi: %IncMSE β€” modelda ushbu atributning mavjudligi/yoβ€˜qligi ushbu modelning MSE sifatini qanday oβ€˜zgartiradi (Mean Squared Error);

Va IncNodePurity - bu ushbu atributning qiymatlariga asoslanib, kuzatuvlar bilan ma'lumotlar to'plamini qanchalik to'g'ri bo'lish mumkinligini aks ettiruvchi raqam, shunda bir qismida metrikaning bir qiymati tushuntirilgan, ikkinchisida esa ma'lumotlar mavjud. metrikaning boshqa qiymati.
Xo'sh, ya'ni: bu qanchalik tasniflovchi atribut (men RandomForest-da eng aniq, rus tilidagi tushuntirishni ko'rdim. shu yerda).

Yuk sinovlari natijalari bilan ma'lumotlar to'plamini qayta ishlash uchun ishchi-dehqon R-kodi:

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 o'zingizning qo'lingiz bilan algoritmning giperparametrlarini to'g'ridan-to'g'ri tanlashingiz va model sifatiga e'tibor qaratib, tekshirish ma'lumotlar to'plamidagi bashoratlarni aniqroq bajaradigan modelni tanlashingiz mumkin.
Siz ushbu ish uchun qandaydir funktsiyani yozishingiz mumkin (aytmoqchi, yana qandaydir optimallashtirish algoritmidan foydalangan holda).

R paketidan foydalanishingiz mumkin caret, nuqta muhim emas.

Natijada, bu holda, atributlarning muhimlik darajasini baholash uchun quyidagi natija olinadi:

Ilmiy poke usuli yoki benchmarklar va optimallashtirish algoritmidan foydalangan holda ma'lumotlar bazasi konfiguratsiyasini qanday tanlash kerak

Xo'sh. Shunday qilib, biz global fikrlashni boshlashimiz mumkin:

  1. Ma'lum bo'lishicha, ushbu sinov sharoitida eng muhimi parametr bo'lgan commit_wait
    Texnik jihatdan u subdb jurnali buferidan joriy jurnallar guruhiga takrorlash ma'lumotlarini yozish uchun io operatsiyasining bajarish rejimini belgilaydi: sinxron yoki asinxron.
    ma'no nowait bu tps metrikasi qiymatining deyarli vertikal, bir necha marta oshishiga olib keladi: bu asinxron io rejimini takrorlash guruhlariga kiritish.
    Alohida savol - oziq-ovqat ma'lumotlar bazasida buni qilish kerakmi yoki yo'qmi. Bu erda men faqat aytish bilan cheklanaman: bu muhim omil.
  2. Subd: log buferining o'lchami muhim omil bo'lib chiqishi mantiqan.
    Jurnal buferining o'lchami qanchalik kichik bo'lsa, uning buferlash qobiliyati shunchalik kam bo'lsa, u tez-tez toshib ketadi va/yoki yangi redoks ma'lumotlarining bir qismi uchun undagi bo'sh maydonni ajrata olmaydi.
    Buning ma'nosi: jurnal buferida bo'sh joy ajratish va/yoki undan qayta ishlash ma'lumotlarini takrorlash guruhlariga tushirish bilan bog'liq kechikishlar.
    Ushbu kechikishlar, albatta, tranzaktsiyalar uchun ma'lumotlar bazasini o'tkazish qobiliyatiga ta'sir qilishi kerak va ta'sir qiladi.
  3. Parametr db_block_checksum: shuningdek, umuman olganda, bu aniq - tranzaktsiyalarni qayta ishlash subma'lumotlar bazasi bufer keshida darty bloklari shakllanishiga olib keladi.
    Ma'lumotlar bloklarining nazorat summalarini tekshirish yoqilgan bo'lsa, ma'lumotlar bazasi qayta ishlashi kerak - ma'lumotlar blokining asosiy qismidan ushbu nazorat summalarini hisoblang, ularni ma'lumotlar bloki sarlavhasida yozilgan narsalar bilan tekshiring: mos keladi / mos kelmaydi.
    Bunday ish, yana, ma'lumotlarni qayta ishlashni kechiktirishi mumkin emas va shunga ko'ra, ushbu parametrni o'rnatadigan parametr va mexanizm muhim bo'lib chiqadi.
    Shuning uchun sotuvchi ushbu parametr uchun hujjatlarda uning (parametr) turli qiymatlarini taklif qiladi va ha, ta'sir bo'lishini ta'kidlaydi, lekin siz "o'chirilgan" va "o'chirilgan" ga qadar turli xil qiymatlarni tanlashingiz mumkin. turli ta'sirlar.

Xo'sh, global xulosa.

Yondashuv, umuman olganda, juda samarali bo'lib chiqadi.

U ma'lum bir xizmat ko'rsatish tizimini yukni sinovdan o'tkazishning dastlabki bosqichlarida uning (tizimning) yuk uchun optimal konfiguratsiyasini tanlash uchun, yuk uchun tizimni o'rnatishning o'ziga xos xususiyatlarini juda ko'p o'rganmaslikka imkon beradi.

Ammo bu buni butunlay inkor etmaydi - hech bo'lmaganda tushunish darajasida: tizim "sozlash tugmalari" va ushbu tugmalarning ruxsat etilgan aylanish diapazonlari haqida ma'lum bo'lishi kerak.

Keyin yondashuv nisbatan tez optimal tizim konfiguratsiyasini topishi mumkin.
Va sinov natijalariga ko'ra, tizimning ishlash ko'rsatkichlari va tizim sozlamalari parametrlarining qiymatlari o'rtasidagi munosabatlarning tabiati haqida ma'lumot olish mumkin.

Bu, albatta, tizimni, hech bo'lmaganda ma'lum bir yuk ostida ishlashini juda chuqur tushunishning paydo bo'lishiga hissa qo'shishi kerak.

Amalda, bu moslashtirilgan tizimni tushunish xarajatlarini tizimning bunday sinovini tayyorlash xarajatlari bilan almashishdir.

Alohida ta'kidlashni istardim: ushbu yondashuvda tizimni sinovdan o'tkazishning tijorat maqsadlarida foydalanish shartlariga muvofiqligi juda muhimdir.

E'tibor va vaqtingiz uchun rahmat.

Manba: www.habr.com

a Izoh qo'shish