Шинжлэх ухааны нудрах арга буюу жишиг болон оновчлолын алгоритмыг ашиглан мэдээллийн сангийн тохиргоог хэрхэн сонгох вэ

Сайн байна уу.

Бодлын үр дүн, сорилт, алдааны үр дүнг би олж хуваалцахаар шийдлээ.
Товчхондоо: энэ нь мэдээжийн хэрэг олдвор биш юм - энэ бүхэн нь DBMS биш, харин статистикийн өгөгдөл боловсруулах, аливаа системийг оновчтой болгоход оролцдог хүмүүст удаан хугацааны туршид мэдэгдэж байх ёстой.
Тэгээд: тийм ээ, тэд мэднэ, тэд судалгааныхаа талаар сонирхолтой нийтлэл бичдэг, жишээ нь (UPD .: тайлбар дээр тэд маш сонирхолтой төслийг онцолсон: ottertune )
Нөгөө талаар: Би мэдээллийн технологийн мэргэжилтнүүд болох DBA-ийн дунд энэ хандлагыг интернетэд өргөнөөр дурдаж, түгээсэн байхыг би олж харахгүй байна.

Тиймээс, цэг рүү.

Бидэнд ямар нэг төрлийн ажилд үйлчлэхийн тулд тодорхой үйлчилгээний системийг бий болгох даалгавар байна гэж бодъё.

Энэ ажлын талаар мэддэг: энэ нь юу вэ, энэ ажлын чанарыг хэрхэн хэмждэг, энэ чанарыг хэмжих шалгуур нь юу вэ.

Энэ үйлчилгээний системд (эсвэл үүнтэй хамт) ажил яг хэрхэн хийгдэж байгаа талаар илүү их эсвэл бага мэддэг, ойлгогддог гэж бодъё.

"Их эсвэл бага" - энэ нь үйлдвэрлэлд байгаатай тэнцэх хэмжээний туршилтын ачаалал бүхий системд нэгтгэж, хэрэглэх боломжтой тодорхой хэрэгсэл, хэрэгсэл, үйлчилгээг бэлтгэх (эсвэл хаанаас ч авах) боломжтой гэсэн үг юм. үйлдвэрлэлд ажиллахад хангалттай нөхцөлд .

За, энэ үйлчилгээний системийн тохируулгын параметрүүдийн багц нь мэдэгдэж байгаа бөгөөд энэ системийг ажлын бүтээмжийн хувьд тохируулахад ашиглаж болно гэж бодъё.

Асуудал нь юу вэ - энэ үйлчилгээний системийн талаар хангалттай бүрэн ойлголт байхгүй бөгөөд энэ нь тухайн платформ дээр ирээдүйд ачаалах системийн тохиргоог чадварлаг тохируулах, системийн шаардлагатай бүтээмжийг авах боломжийг олгодог.

За. Энэ нь бараг үргэлж тохиолддог.

Та энд юу хийж чадах вэ?

За, хамгийн түрүүнд энэ системийн баримт бичгийг харах хэрэгтэй. Тохируулах параметрийн утгуудын хувьд хүлээн зөвшөөрөгдөх хязгаар гэж юу болохыг ойлгох. Жишээлбэл, координатыг бууруулах аргыг ашиглан туршилтын системийн параметрүүдийн утгыг сонгоно уу.

Тэдгээр. системд тохиргооны параметрүүдийн тодорхой багц утгын хэлбэрээр зарим төрлийн тохиргоог өгөх.

Ачаалал үүсгэгч энэ хэрэгсэл-хэрэгслийг ашиглан түүнд туршилтын ачааллыг ашиглана уу.
Мөн үнэ цэнийг харна уу - хариу үйлдэл эсвэл системийн чанарын хэмжүүр.

Хоёр дахь бодол нь энэ бол маш урт хугацаа гэсэн дүгнэлт байж болох юм.

За, өөрөөр хэлбэл: хэрэв олон тохиргоотой параметрүүд байгаа бол тэдгээрийн утгын хэмжээ их байвал, ачааллын туршилт бүрийг дуусгахад маш их цаг зарцуулдаг бол: тийм ээ, энэ бүхэн хүлээн зөвшөөрөгдөхгүй хугацаа шаардагдана. урт хугацаа.

Эндээс та ойлгож, санаж чадах зүйл байна.

Үйлчилгээний системийн тохиргооны параметрүүдийн утгуудын багцад зарим утгын дараалал хэлбэрээр вектор байгааг олж мэдэх боломжтой.

Ийм вектор бүр, бусад зүйлс нь тэнцүү (энэ векторын нөлөөнд автдаггүй) хэмжүүрийн бүрэн тодорхой утгатай тохирч байгаа нь туршилтын ачааллын дор системийн ажиллагааны чанарын үзүүлэлт юм.

Ий

Системийн тохиргооны векторыг гэж тэмдэглэе Шинжлэх ухааны нудрах арга буюу жишиг болон оновчлолын алгоритмыг ашиглан мэдээллийн сангийн тохиргоог хэрхэн сонгох вэхаана Шинжлэх ухааны нудрах арга буюу жишиг болон оновчлолын алгоритмыг ашиглан мэдээллийн сангийн тохиргоог хэрхэн сонгох вэ; Хаана Шинжлэх ухааны нудрах арга буюу жишиг болон оновчлолын алгоритмыг ашиглан мэдээллийн сангийн тохиргоог хэрхэн сонгох вэ — системийн тохиргооны параметрүүдийн тоо, эдгээр параметрүүдийн хэд нь байна.

Үүнд харгалзах хэмжүүрийн утга Шинжлэх ухааны нудрах арга буюу жишиг болон оновчлолын алгоритмыг ашиглан мэдээллийн сангийн тохиргоог хэрхэн сонгох вэ гэж тэмдэглэе
Шинжлэх ухааны нудрах арга буюу жишиг болон оновчлолын алгоритмыг ашиглан мэдээллийн сангийн тохиргоог хэрхэн сонгох вэ, дараа нь бид функцийг авна: Шинжлэх ухааны нудрах арга буюу жишиг болон оновчлолын алгоритмыг ашиглан мэдээллийн сангийн тохиргоог хэрхэн сонгох вэ

За, тэгвэл: бүх зүйл тэр дороо бууж ирдэг, миний хувьд: оюутан ахуй үеэсээ бараг мартагдсан, функцийн экстремумыг хайх алгоритмууд.

За, гэхдээ энд зохион байгуулалтын болон хэрэглээний асуулт гарч ирнэ: аль алгоритмыг ашиглах вэ.

  1. Энэ утгаараа - ингэснээр та гараар бага кодлох боломжтой.
  2. Мөн энэ нь ажиллахын тулд, өөрөөр хэлбэл. экстремумыг (хэрэв байгаа бол), ядаж координатаас хурдан олсон.

Эхний цэг нь бид ийм алгоритмуудыг аль хэдийн хэрэгжүүлсэн, ямар нэг хэлбэрээр кодонд ашиглахад бэлэн байгаа зарим орчныг хайх хэрэгтэйг сануулж байна.
За, би мэднэ python и cran-r

Хоёрдахь зүйл бол алгоритмууд өөрсдөө, тэдгээр нь юу вэ, ямар шаардлага тавьдаг, ажлын онцлог шинж чанаруудын талаар унших хэрэгтэй гэсэн үг юм.

Мөн тэдний өгч байгаа зүйл нь үр дүн, эсвэл алгоритм өөрөө шууд хамааралтай гаж нөлөө байж болно.

Эсвэл тэдгээрийг алгоритмын үр дүнгээс олж авч болно.

Оролтын нөхцлөөс их зүйл шалтгаална.

Жишээлбэл, хэрэв та ямар нэг шалтгааны улмаас үр дүнг хурдан авах шаардлагатай бол градиент буурах алгоритмуудыг хайж, тэдгээрийн аль нэгийг нь сонгох хэрэгтэй.

Эсвэл, хэрэв цаг хугацаа тийм ч чухал биш бол та жишээлбэл, генетикийн алгоритм гэх мэт стохастик оновчлолын аргыг ашиглаж болно.

Би энэ аргын ажлыг, системийн тохиргоог сонгох, генетикийн алгоритмыг ашиглан дараагийн, өөрөөр хэлбэл лабораторийн ажлыг авч үзэхийг санал болгож байна.

Жинхэнэ:

  1. Үйлчилгээний системийн хувьд дараах байдалтай байг. oracle xe 18c
  2. Энэ нь гүйлгээний үйл ажиллагаанд үйлчлэх ба зорилго нь: гүйлгээ/сек-ээр дэд мэдээллийн сангаас хамгийн их дамжуулах чадварыг олж авах.
  3. Гүйлгээ нь өгөгдөлтэй ажиллах шинж чанар, ажлын нөхцөл байдлаас ихээхэн ялгаатай байж болно.
    Эдгээр нь их хэмжээний хүснэгтийн өгөгдлийг боловсруулдаггүй гүйлгээнүүд гэдгийг хүлээн зөвшөөрье.
    Тэд дахин хийхээс илүү буцаах өгөгдлийг үүсгэдэггүй, мөр болон том хүснэгтүүдийн их хувийг боловсруулдаггүй гэсэн утгаараа.

Эдгээр нь том эсвэл бага хэмжээний хүснэгтийн нэг мөрийг өөрчилдөг гүйлгээнүүд бөгөөд энэ хүснэгтэд цөөн тооны индексүүд байдаг.

Энэ нөхцөлд: гүйлгээг боловсруулах дэд мэдээллийн сангийн бүтээмжийг урьдчилан сэргийлэх зорилгоор редокс мэдээллийн баазын боловсруулалтын чанараар тодорхойлно.

Disclaimer - хэрэв бид subdb тохиргооны талаар тусгайлан ярих юм бол.

Учир нь ерөнхий тохиолдолд, жишээлбэл, SQL сешнүүдийн хооронд гүйлгээний түгжээ, хэрэглэгчийн хүснэгтийн өгөгдөл болон/эсвэл хүснэгтэн загвартай ажиллах загвараас шалтгаалж болно.

Энэ нь мэдээжийн хэрэг TPS хэмжигдэхүүнд дарангуйлах нөлөө үзүүлэх бөгөөд энэ нь дэд мэдээллийн сантай харьцуулахад экзоген хүчин зүйл байх болно: хүснэгтэн загварыг ингэж зохион бүтээсэн бөгөөд түүн дэх өгөгдөлтэй ажиллахад бөглөрөл үүсдэг.

Тиймээс, туршилтын цэвэр байдлын үүднээс бид энэ хүчин зүйлийг хасч, доор нь би яг яаж хийхийг тодруулах болно.

  1. Өгөгдлийн санд илгээсэн SQL командуудын 100% нь DML командууд байна гэж тодорхой бодъё.
    Туршилтын хувьд хэрэглэгчийн дэд мэдээллийн сантай ажиллах шинж чанарууд ижил байна.
    Тухайлбал: skl сессийн тоо, хүснэгтэн өгөгдөл, skl сессүүд тэдэнтэй хэрхэн ажилладаг талаар.
  2. Subd ажилладаг FORCE LOGGING, ARCHIVELOG мод. Flashback-өгөгдлийн сангийн горимыг дэд түвшинд унтраасан.
  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 хэрэгсэл
Энэ нь гайхалтай шинж чанартай тул би зохиогчоос иш татъя:

SLOB-ийн гол цөм нь "SLOB арга" юм. SLOB арга нь платформуудыг турших зорилготой
өргөдлийн маргаангүйгээр. Хүн хамгийн их техник хангамжийн гүйцэтгэлийг жолоодож чадахгүй
програмын кодыг ашиглан, жишээлбэл, аппликешн түгжих эсвэл бүр хүртэл
Oracle мэдээллийн сангийн блокуудыг хуваалцах. Энэ нь зөв - өгөгдөл хуваалцахад нэмэлт зардал гардаг
өгөгдлийн блокуудад! Гэхдээ SLOB нь анхдагч байдлаараа ийм маргаанаас хамгаалагдсан байдаг.

Энэ тунхаглал: тохирч байна, энэ нь.
Энэ нь cl сессийн параллелизмын түвшинг зохицуулахад тохиромжтой, энэ бол түлхүүр юм -t хэрэгслийг ажиллуул runit.sh SLOB-аас
DML командын хувь хэмжээг дэд хэсэгт илгээсэн текст мессежийн тоо, текст сесс бүр, параметрээр зохицуулдаг. UPDATE_PCT
Тусдаа бөгөөд маш тохиромжтой: SLOB өөрөө, ачааллын сессийн өмнө болон дараа - статпак, эсвэл awr-хормын хувилбаруудыг бэлтгэдэг (бэлтгэхээр тохируулсан зүйл).

Гэсэн хэдий ч энэ нь тодорхой болсон SLOB 30 секундээс бага хугацаатай SQL сессийг дэмждэггүй.
Тиймээс би эхлээд өөрийн ажилчин тариачин ачигчийг кодлосон бөгөөд дараа нь энэ нь ажиллаж байсан.

Ачаалагч юу хийдэг, яаж хийдэгийг тодорхой болгох үүднээс тодруулъя.
Үндсэндээ ачигч дараах байдалтай байна.

Ажилчдын код

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"

Тэдгээр. Ажилчин бүрийн хувьд (бараг нь: subdb-д тусдаа skl сесс) тусдаа хүснэгт үүсгэсэн бөгөөд үүнтэй ажилтан ажилладаг.

Энэ нь ажилчдын сесс хооронд гүйлгээний түгжээ байхгүйг баталгаажуулдаг.
Ажилчин бүр: ижил зүйлийг хийдэг, өөрийн гэсэн ширээтэй, хүснэгтүүд бүгд адилхан.
Бүх ажилчид ижил хугацаанд ажлаа гүйцэтгэдэг.
Түүгээр ч зогсохгүй хангалттай удаан хугацаанд, жишээлбэл, бүртгэлийн шилжүүлэгч нь нэгээс олон удаа тохиолдох болно.
Үүний дагуу холбогдох зардал, үр дагавар бий болсон.
Миний хувьд ажилчдын ажлын үргэлжлэх хугацааг 8 минут гэж тохируулсан.

Ачаалал дор байгаа дэд хэсгийн ажиллагааг тодорхойлсон statspack тайлангийн хэсэг

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] MB.
  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. Өгөгдсөн хэмжээтэй өгөгдсөн тооны дахин хийх бүлгүүдийг үүсгэх оролдлого. Түүнээс гадна оролдлого амжилтгүй болж магадгүй юм.
    Туршилтын цэвэр байдлын хувьд дэд хэсэгт аль хэдийн байсан сэтгүүлийн бүлгүүд, зарим тоо хэмжээ, хэмжээгээрээ - d.b. устгасан.
  3. Хэрэв өмнөх цэг амжилттай бол: мэдээллийн санд тохиргооны параметрүүдийн утгыг зааж өгөх (дахин: алдаа гарсан байж магадгүй)
  4. Хэрэв өмнөх алхам амжилттай бол: дэд хэсгийг зогсоож, дэд хэсгийг эхлүүлснээр шинээр заасан параметрийн утгууд хүчин төгөлдөр болно. (дахин: алдаа гарсан байж магадгүй)
  5. Хэрэв өмнөх алхам амжилттай бол: ачааллын туршилтыг хийнэ. subd-ээс хэмжүүр авах.
  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)
}

Тэр. бүх ажил: фитнессийн функцэд гүйцэтгэдэг.

Га-дэд програм нь векторууд, эсвэл илүү зөв бол хромосомыг боловсруулдаг.
Энэ нь бидний хувьд хамгийн чухал зүйл бол фитнессийн функц нь их утгыг үүсгэдэг гентэй хромосомуудыг сонгох явдал юм.

Энэ нь үндсэндээ N хэмжээст хайлтын орон зайд вектор ашиглан хромосомын оновчтой багцыг хайх үйл явц юм.

Маш тодорхой, нарийвчилсан тайлбар, R-кодын жишээнүүдийн хамт, генетикийн алгоритмын ажил.

Би техникийн хоёр зүйлийг тусад нь тэмдэглэхийг хүсч байна.

Функцээс туслах дуудлагууд evaluate, жишээ нь, stop-start, subd параметрийн утгыг тохируулах, дээр үндэслэн гүйцэтгэнэ cran-r функцууд system2

Үүний тусламжтайгаар: зарим bash скрипт эсвэл командыг дууддаг.

Жишээ нь:

set_db_параметр

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)

Энэ нь чухал, учир нь энэхүү өгөгдлийн массиваас тааруулах векторын аль бүрэлдэхүүн хэсэг нь хэмжүүрийн утгад их эсвэл бага нөлөө үзүүлж байгаа талаар нэмэлт мэдээлэл авах боломжтой болно.

Энэ нь: шинж чанар, ач холбогдлын шинжилгээ хийх боломжтой болно.

Тэгэхээр юу тохиолдож болох вэ?

График хэлбэрээр, хэрэв та тестүүдийг өсөх дарааллаар захиалбал зураг дараах байдалтай байна.

Шинжлэх ухааны нудрах арга буюу жишиг болон оновчлолын алгоритмыг ашиглан мэдээллийн сангийн тохиргоог хэрхэн сонгох вэ

Хэмжилтийн хэт утгуудад тохирох зарим өгөгдөл:
Шинжлэх ухааны нудрах арга буюу жишиг болон оновчлолын алгоритмыг ашиглан мэдээллийн сангийн тохиргоог хэрхэн сонгох вэ
Энд, үр дүнгийн дэлгэцийн агшинд би тодруулах болно: тааруулах векторын утгыг томъёолсон параметрийн тоон жагсаалт/параметрийн утгын мужид биш харин фитнессийн функцийн кодоор өгсөн болно. текст дээрх дээр.

За. Энэ их үү, бага уу, ~8 мянган халбага уу: тусдаа асуулт.
Лабораторийн ажлын хүрээнд энэ үзүүлэлт чухал биш, чухал зүйл бол динамик, энэ үнэ цэнэ хэрхэн өөрчлөгдөх явдал юм.

Энд динамик сайн байна.
Хромосомын векторуудыг ялгах га-алгоритм хэмжигдэхүүнд дор хаяж нэг хүчин зүйл ихээхэн нөлөөлдөг нь ойлгомжтой.
Муруй утгуудын нэлээн эрчимтэй динамикаас харахад хамаагүй бага ч гэсэн өөр нэг хүчин зүйл нөлөөлж байна.

Энэ нь танд хэрэгтэй газар юм attribute-importance ямар шинж чанарууд (энэ тохиолдолд тааруулах векторын бүрэлдэхүүн хэсгүүд) болон хэмжигдэхүүнд хэр зэрэг нөлөөлдөг болохыг ойлгохын тулд дүн шинжилгээ хийх.
Мөн энэ мэдээллээс: чухал шинж чанаруудын өөрчлөлтөд ямар хүчин зүйл нөлөөлсөнийг ойлгох.

Run attribute-importance янз бүрийн аргаар боломжтой.

Эдгээр зорилгын үүднээс би алгоритмд дуртай randomForest Ижил нэртэй R багц (баримт бичиг)
randomForest, би түүний ажлыг ерөнхийд нь ойлгож байгаа бөгөөд ялангуяа шинж чанаруудын ач холбогдлыг үнэлэх арга барил нь шинж чанаруудаас хариу үйлдэл үзүүлэх хувьсагчийн хамаарлын тодорхой загварыг бий болгодог.

Манай тохиолдолд хариултын хувьсагч нь ачааллын тестийн мэдээллийн сангаас олж авсан хэмжигдэхүүн юм. tps;
Мөн шинж чанарууд нь тааруулах векторын бүрэлдэхүүн хэсэг юм.

Тиймээс энд randomForest Загварын шинж чанар бүрийн ач холбогдлыг хоёр тоогоор үнэлдэг: %IncMSE - загварт энэ шинж чанар байгаа/байгаа эсэх нь энэ загварын MSE чанарыг хэрхэн өөрчилдөг (Дунд дөрвөлжин алдаа);

IncNodePurity нь энэхүү шинж чанарын утгуудад үндэслэн ажиглалт бүхий өгөгдлийн багцыг хэр сайн хувааж болохыг тусгасан тоо бөгөөд ингэснээр нэг хэсэгт хэмжигдэхүүний нэг утгыг тайлбарлаж, нөгөө хэсэгт нь тайлбарлаж байна. хэмжүүрийн өөр нэг утга.
За, энэ нь: энэ нь хэр зэрэг ангилах шинж чанартай вэ (Би RandomForest дээр хамгийн ойлгомжтой, орос хэл дээрх тайлбарыг харсан. энд).

Ачааллын туршилтын үр дүн бүхий өгөгдлийн багцыг боловсруулах ажилчин тариачин 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, гол нь чухал биш.

Үүний үр дүнд, энэ тохиолдолд шинж чанаруудын ач холбогдлын зэргийг үнэлэхийн тулд дараах үр дүнг олж авна.

Шинжлэх ухааны нудрах арга буюу жишиг болон оновчлолын алгоритмыг ашиглан мэдээллийн сангийн тохиргоог хэрхэн сонгох вэ

За. Тиймээс бид дэлхий даяар эргэцүүлэн бодож эхэлж болно:

  1. Эдгээр туршилтын нөхцөлд хамгийн чухал нь параметр байсан нь харагдаж байна commit_wait
    Техникийн хувьд энэ нь subdb бүртгэлийн буферээс одоогийн бүртгэлийн бүлэгт синхрон эсвэл асинхрон гэсэн дахин хийх өгөгдлийг бичих io үйлдлийн гүйцэтгэх горимыг зааж өгдөг.
    үнэ цэнэ nowait Энэ нь tps хэмжигдэхүүний утгыг бараг босоо, олон дахин өсгөхөд хүргэдэг: энэ нь дахин хийх бүлгүүдэд асинхрон io горимыг оруулах явдал юм.
    Хүнсний мэдээллийн санд үүнийг хийх ёстой эсэх нь тусдаа асуулт юм. Энд би зөвхөн хэлэхээр хязгаарлагдаж байна: энэ бол чухал хүчин зүйл юм.
  2. Дэд хэсгийн бүртгэлийн буферийн хэмжээ нь чухал хүчин зүйл болж хувирах нь логик юм.
    Бүртгэлийн буферийн хэмжээ бага байх тусам буферийн багтаамж бага байх тусам халих нь элбэг ба/эсвэл шинэ исэлдэлтийн өгөгдлийн хэсэгт чөлөөт талбайг хуваарилах боломжгүй болно.
    Энэ нь: бүртгэлийн буферт зай хуваарилах болон түүнээс дахин хийх өгөгдлийг дахин хийх бүлгүүдэд шилжүүлэхтэй холбоотой саатал гэсэн үг.
    Эдгээр саатал нь мэдээжийн хэрэг гүйлгээний мэдээллийн баазын нэвтрүүлэх чадварт нөлөөлөх ёстой бөгөөд нөлөөлнө.
  3. Үзүүлэлт db_block_checksum: сайн, бас ерөнхийдөө ойлгомжтой - гүйлгээний боловсруулалт нь дэд мэдээллийн сангийн буфер кэшэд дарти блокууд үүсэхэд хүргэдэг.
    Өгөгдлийн блокуудын хяналтын нийлбэрийг шалгах үед өгөгдлийн сан боловсруулах ёстой - өгөгдлийн блокийн үндсэн хэсгээс эдгээр хяналтын нийлбэрийг тооцоолж, мэдээллийн блокийн толгой хэсэгт бичсэн зүйлээс шалгана уу: таарч байна / таарахгүй байна.
    Ийм ажил нь дахин өгөгдөл боловсруулалтыг удаашруулж чадахгүй бөгөөд үүний дагуу энэ параметрийг тохируулах параметр ба механизм нь чухал ач холбогдолтой болж хувирдаг.
    Тийм ч учраас худалдагч нь энэ параметрийн баримт бичигт өөр өөр утгыг (параметр) санал болгодог бөгөөд тийм ээ, нөлөөлөл байх болно, гэхдээ та "унтраах" хүртэл өөр утгыг сонгох боломжтой. янз бүрийн нөлөө.

За, дэлхийн хэмжээний дүгнэлт.

Ерөнхийдөө арга нь нэлээд үр дүнтэй болж хувирдаг.

Тэрээр тодорхой үйлчилгээний системийн ачааллын туршилтын эхний үе шатанд ачааллын хувьд түүний (системийн) оновчтой тохиргоог сонгохын тулд ачааллын системийг тохируулах онцлогийг хэт их судлахгүй байх боломжийг олгодог.

Гэхдээ энэ нь үүнийг бүрэн үгүйсгэхгүй - наад зах нь ойлголтын түвшинд: систем нь "тохируулгын бариулууд" болон эдгээр бариулыг эргүүлэх зөвшөөрөгдөх хүрээний талаар мэддэг байх ёстой.

Энэ арга нь системийн оновчтой тохиргоог харьцангуй хурдан олох боломжтой.
Туршилтын үр дүнд үндэслэн системийн гүйцэтгэлийн хэмжигдэхүүн ба системийн тохиргооны параметрүүдийн утгуудын хоорондын хамаарлын шинж чанарын талаар мэдээлэл авах боломжтой.

Мэдээжийн хэрэг, энэ нь систем, түүний үйл ажиллагааны талаар маш гүн гүнзгий ойлголттой болоход хувь нэмэр оруулах ёстой.

Практикт энэ нь системийн ийм туршилтыг бэлтгэх зардалд тохируулсан системийг ойлгох зардлыг солилцох явдал юм.

Би тусад нь тэмдэглэхийг хүсч байна: энэ аргын хувьд системийн туршилтыг арилжааны нөхцөлд ашиглах нөхцөл байдалд нийцүүлэх зэрэг нь маш чухал юм.

Анхаарал, цаг гаргасанд баярлалаа.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх