د ساینسي پوک میتود ، یا د بنچمارکونو او اصلاح کولو الګوریتم په کارولو سره د ډیټابیس ترتیب غوره کولو څرنګوالی

سلام.

ما پریکړه وکړه چې زما موندنه شریکه کړم - د فکر، آزموینې او تېروتنې میوه.
په لویه کچه: دا یوه موندنه نه ده، البته - دا ټول باید د اوږدې مودې لپاره پیژندل شوي وي، هغه چا ته چې د احصایوي معلوماتو پروسس کولو او د کوم سیسټمونو اصلاح کولو کې ښکیل دي، په ځانګړې توګه د DBMS اړتیا نلري.
او: هو، دوی پوهیږي، دوی په خپلو څیړنو کې په زړه پورې مقالې لیکي، مثال (UPD.: په تبصرو کې دوی یوه خورا زړه پورې پروژه په ګوته کړه: ottertune )
له بلې خوا: زه په انټرنیټ کې د معلوماتي ټکنالوجۍ متخصصینو، DBA ترمنځ د دې طریقې پراخه ذکر یا خپرول نه وینم.

نو، ټکي ته.

راځئ فرض کړو چې موږ دنده لرو: د یو ډول کار خدمت کولو لپاره د ځانګړي خدماتو سیسټم رامینځته کول.

د دې کار په اړه معلومه شوه: دا څه دي، د دې کار کیفیت څنګه اندازه کیږي، او د دې کیفیت اندازه کولو معیار څه دی.

راځئ چې دا هم فرض کړو چې دا ډیر یا لږ پیژندل شوی او پوهیږي: په ریښتیا څنګه کار په دې خدماتو سیسټم کې (یا سره) ترسره کیږي.

"ډیر یا لږ" - دا پدې مانا ده چې دا ممکنه ده چې چمتو کړئ (یا له کوم ځای څخه یې ترلاسه کړئ) یو ټاکلی وسیله، افادیت، خدمت چې کولی شي ترکیب شي او په سیسټم کې د ازموینې بار سره تطبیق شي چې په کافي اندازه په تولید کې وي، په داسې شرایطو کې چې په تولید کې د کار کولو لپاره کافي وي.

ښه ، راځئ فرض کړو چې د دې خدماتو سیسټم لپاره د تنظیم کولو پیرامیټرو سیټ پیژندل شوی ، کوم چې د دې سیسټم د کار محصولاتو شرایطو کې تنظیم کولو لپاره کارول کیدی شي.

او ستونزه څه ده - د دې خدماتو سیسټم په اړه کافي بشپړ پوهه شتون نلري، یو چې تاسو ته اجازه درکوي په ځانګړي ډول د دې سیسټم تنظیمات په ټاکل شوي پلیټ فارم کې د راتلونکي بار لپاره تنظیم کړئ او د سیسټم اړین محصول ترلاسه کړئ.

ښه. دا تقریبا تل قضیه ده.

تاسو دلته څه کولی شئ؟

ښه، لومړی شی چې ذهن ته راځي د دې سیسټم لپاره اسنادو ته کتنه ده. پوهیږئ چې د منلو وړ حدونه د سمون پیرامیټونو ارزښتونو لپاره څه دي. او، د مثال په توګه، د همغږۍ نزول میتود په کارولو سره، په ازموینو کې د سیسټم پیرامیټونو لپاره ارزښتونه غوره کړئ.

هغوی. سیسټم ته یو ډول ترتیب ورکړئ، د دې ترتیب کولو پیرامیټونو لپاره د ارزښتونو ځانګړي سیټ په بڼه.

دې ته د ازموینې بار پلي کړئ ، د دې خورا وسیلې په کارولو سره ، د بار جنریټر.
او ارزښت ته وګورئ - ځواب، یا د سیسټم کیفیت میټریک.

دوهم فکر ممکن پایله وي چې دا خورا اوږد وخت دی.

ښه، دا دی: که چیرې د تنظیم کولو ډیری پیرامیټونه شتون ولري، که د دوی د ارزښتونو لړۍ لوی وي، که د هر انفرادي بار ازموینه بشپړولو لپاره ډیر وخت ونیسي، نو: هو، دا ټول ممکن د منلو وړ نه وي. اوږده موده.

ښه، دلته هغه څه دي چې تاسو یې درک کولی شئ او په یاد ولرئ.

تاسو کولی شئ ومومئ چې د خدماتو سیسټم تنظیماتو پیرامیټونو ارزښتونو سیټ کې یو ویکتور شتون لري ، د ځینې ارزښتونو ترتیب په توګه.

هر دا ډول ویکتور، نور شیان مساوي وي (په دې کې چې دا د دې ویکتور لخوا اغیزمن شوی نه وي)، د میټریک په بشپړ ډول ټاکل شوي ارزښت سره مطابقت لري - د ازموینې بار لاندې د سیسټم د عملیاتو کیفیت شاخص.

يعنې

راځئ چې د سیسټم ترتیب ویکتور په توګه په ګوته کړو د ساینسي پوک میتود ، یا د بنچمارکونو او اصلاح کولو الګوریتم په کارولو سره د ډیټابیس ترتیب غوره کولو څرنګوالیچیرته د ساینسي پوک میتود ، یا د بنچمارکونو او اصلاح کولو الګوریتم په کارولو سره د ډیټابیس ترتیب غوره کولو څرنګوالی; چیرته د ساینسي پوک میتود ، یا د بنچمارکونو او اصلاح کولو الګوریتم په کارولو سره د ډیټابیس ترتیب غوره کولو څرنګوالی - د سیسټم ترتیب کولو پیرامیټونو شمیر، د دې پیرامیټونو څخه څومره شتون لري.

او د دې سره مطابقت لرونکي میټریک ارزښت د ساینسي پوک میتود ، یا د بنچمارکونو او اصلاح کولو الګوریتم په کارولو سره د ډیټابیس ترتیب غوره کولو څرنګوالی راځئ چې دا په توګه وپیژنو
د ساینسي پوک میتود ، یا د بنچمارکونو او اصلاح کولو الګوریتم په کارولو سره د ډیټابیس ترتیب غوره کولو څرنګوالی، بیا موږ یو فنکشن ترلاسه کوو: د ساینسي پوک میتود ، یا د بنچمارکونو او اصلاح کولو الګوریتم په کارولو سره د ډیټابیس ترتیب غوره کولو څرنګوالی

ښه، بیا: هر څه سمدلاسه راښکته کیږي، زما په قضیه کې: تقریبا زما د زده کونکي له ورځو څخه هیر شوی، د فعالیت د حد د لټون لپاره الګوریتم.

سمه ده، مګر دلته یو سازماني او پلي شوي پوښتنه راپورته کیږي: کوم الګوریتم کارول کیږي.

  1. په معنی - نو تاسو کولی شئ د لاس په واسطه لږ کوډ وکړئ.
  2. او د دې لپاره چې کار وکړي، i.e. افراطیت وموندل شو (که چیرې یو وي)، ښه، لږترلږه د همغږۍ نزول څخه ګړندی.

لومړی ټکی اشاره کوي چې موږ اړتیا لرو ځینې چاپیریالونو ته وګورو چیرې چې دا ډول الګوریتمونه لا دمخه پلي شوي ، او په یو شکل کې د کوډ کارولو لپاره چمتو دي.
ښه، زه پوهیږم python и cran-r

دوهم ټکی دا دی چې تاسو اړتیا لرئ پخپله د الګوریتمونو په اړه ولولئ، دوی څه دي، د دوی اړتیاوې څه دي، د دوی د کار ځانګړتیاوې.

او هغه څه چې دوی ورکوي ګټور اړخیزې اغیزې کیدی شي - پایلې، یا په مستقیم ډول د الګوریتم څخه.

یا دوی د الګوریتم پایلو څخه ترلاسه کیدی شي.

ډیری د ننوتلو شرایطو پورې اړه لري.

د مثال په توګه، که د کوم دلیل لپاره، تاسو اړتیا لرئ چې نتیجه ګړندۍ ترلاسه کړئ، ښه، تاسو اړتیا لرئ چې د تدریجي نزول الګوریتمونو په لور وګورئ او یو یې غوره کړئ.

یا، که وخت دومره مهم نه وي، تاسو کولی شئ، د بیلګې په توګه، د سټوچیسټیک اصلاح کولو میتودونه وکاروئ، لکه د جنیتیک الګوریتم.

زه وړاندیز کوم چې د دې طریقې کار په پام کې ونیسو، د سیسټم ترتیب غوره کول، د جینیکیک الګوریتم په کارولو سره، په راتلونکی کې، نو د لابراتوار کار.

اصلي:

  1. اجازه راکړئ چې د خدماتو سیسټم په توګه وي: oracle xe 18c
  2. اجازه راکړئ چې د راکړې ورکړې فعالیت او هدف ته خدمت وکړي: د فرعي ډیټابیس ترټولو ممکنه انډول ترلاسه کول، په لیږد / ثانیه کې.
  3. راکړه ورکړه د ډیټا سره د کار کولو طبیعت او د کار شرایطو کې خورا توپیر لري.
    راځئ چې موافقه وکړو چې دا هغه لیږدونه دي چې د جدول ډیټا لوی مقدار پروسس نه کوي.
    په دې معنی چې دوی د ریډو په پرتله ډیر ناغوښتل شوي ډیټا نه تولیدوي او د قطارونو او لوی میزونو لوی سلنه پروسس نه کوي.

دا هغه راکړې ورکړې دي چې یو قطار په ډیر یا لږ لوی میز کې بدلوي، په دې میز کې د لږ شمیر شاخصونو سره.

پدې حالت کې: د لیږد پروسس کولو لپاره د فرعي ډیټابیس محصول به د ریزرویشن سره د ریډکس ډیټابیس لخوا د پروسس کیفیت لخوا ټاکل کیږي.

اعلان - که موږ په ځانګړې توګه د فرعي ډی بی ترتیباتو په اړه خبرې وکړو.

ځکه چې، په عمومي حالت کې، د مثال په توګه، د SQL سیشنونو ترمنځ د لیږد قلفونه شتون لري، د جدول ډیټا او/یا جدول ماډل سره د کاروونکي کار ډیزاین له امله.

کوم چې، البته، به د TPS میټریک باندې خپګان اغیزه ولري او دا به یو خارجي فاکتور وي، د فرعي ډیټابیس په پرتله: ښه، دا څنګه د جدول ماډل ډیزاین شوی او په دې کې د ډیټا سره کار چې خنډونه واقع کیږي.

له همدې امله، د تجربې د پاکوالي لپاره، موږ به دا فاکتور خارج کړو، او لاندې به زه روښانه کړم چې څنګه.

  1. راځئ چې فرض کړو، د دقیقیت لپاره، چې ډیټابیس ته سپارل شوي د SQL کمانډونو 100٪ د DML کمانډونه دي.
    اجازه راکړئ چې د فرعي ډیټابیس سره د کارونکي کار ځانګړتیاوې په ازموینو کې ورته وي.
    د مثال په توګه: د skl غونډو شمیر، جدول ډاټا، د skl ناستې څنګه ورسره کار کوي.
  2. Subd په کې کار کوي FORCE LOGGING, ARCHIVELOG موډونه د فلش بیک ډیټابیس حالت په فرعي کچه کې بند شوی دی.
  3. Redo logs: په جلا فایل سیسټم کې موقعیت لري، په جلا "ډیسک" کې؛
    د ډیټابیس پاتې فزیکي برخه: په بل کې، جلا فایل سیسټم، په جلا "ډیسک" کې:

د فزیکي وسایلو په اړه نور معلومات. د لابراتوار ډیټابیس برخې

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 میتود موخه د پلیټ فارمونو ازموینه ده
د غوښتنلیک د شخړې پرته. یو څوک نشي کولی د هارډویر اعظمي فعالیت چل کړي
د اپلیکیشن کوډ کارول چې د مثال په توګه د غوښتنلیک لاک کولو یا حتی لخوا پابند وي
د اوریکل ډیټابیس بلاکونو شریکول. دا سمه ده - د معلوماتو شریکولو په وخت کې سر شتون لري
په ډیټا بلاکونو کې! مګر SLOB - په خپل ډیفالټ ګمارنه کې - د دې ډول جنجال څخه معاف دی.

دا اعالمیه: ورته ده، دا ده.
دا د cl سیشنونو د موازيتوب درجې تنظیم کول اسانه دي، دا کلیدي ده -t افادیت پیل کړئ runit.sh له SLOB څخه
د DML کمانډونو سلنه تنظیم شوې ، د متن پیغامونو په شمیر کې چې فرعي ته لیږل کیږي ، هر متن ناسته ، پیرامیټر UPDATE_PCT
په جلا توګه او خورا اسانه: SLOB پخپله، د بار کولو سیشن څخه مخکې او وروسته - یو سټیټسپیک چمتو کوي، یا awr-snapshots (هغه څه چې چمتو شوي وي).

په هرصورت، دا معلومه شوه 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"

هغوی. د هر کارګر لپاره (په عملي ډول: په DB کې جلا SQL سیشن) یو جلا جدول رامینځته شوی چې ورسره کارګر کار کوي.

دا د کارګرانو غونډو ترمنځ د لیږد د بندونو نشتوالی تضمینوي.
هر کارکونکی: هماغه کار کوي، د خپل میز سره، میزونه ټول یو شان دي.
ټول کارګران د ورته وخت لپاره کار کوي.
سربیره پردې ، د اوږدې مودې لپاره نو د مثال په توګه ، د لاګ سویچ به یقینا واقع شي ، او له یو ځل څخه ډیر.
ښه، په دې اساس، اړونده لګښتونه او اغیزې رامنځته شوې.
زما په قضیه کې، ما د کارګرانو د کار موده په 8 دقیقو کې تنظیم کړه.

د سټیټسپیک راپور یوه برخه چې د بار لاندې د فرعي عملیات تشریح کوي

Database    DB Id    Instance     Inst Num  Startup Time   Release     RAC
~~~~~~~~ ----------- ------------ -------- --------------- ----------- ---
          2929910313 XE                  1 07-Sep-20 23:12 18.0.0.0.0  NO

Host Name             Platform                CPUs Cores Sockets   Memory (G)
~~~~ ---------------- ---------------------- ----- ----- ------- ------------
     billing.izhevsk1 Linux x86 64-bit           2     2       1         15.6

Snapshot       Snap Id     Snap Time      Sessions Curs/Sess Comment
~~~~~~~~    ---------- ------------------ -------- --------- ------------------
Begin Snap:       1630 07-Sep-20 23:12:27       55        .7
  End Snap:       1631 07-Sep-20 23:20:29       62        .6
   Elapsed:       8.03 (mins) Av Act Sess:       8.4
   DB time:      67.31 (mins)      DB CPU:      15.01 (mins)

Cache Sizes            Begin        End
~~~~~~~~~~~       ---------- ----------
    Buffer Cache:     1,392M              Std Block Size:         8K
     Shared Pool:       288M                  Log Buffer:   103,424K

Load Profile              Per Second    Per Transaction    Per Exec    Per Call
~~~~~~~~~~~~      ------------------  ----------------- ----------- -----------
      DB time(s):                8.4                0.0        0.00        0.20
       DB CPU(s):                1.9                0.0        0.00        0.04
       Redo size:        7,685,765.6              978.4
   Logical reads:           60,447.0                7.7
   Block changes:           47,167.3                6.0
  Physical reads:                8.3                0.0
 Physical writes:              253.4                0.0
      User calls:               42.6                0.0
          Parses:               23.2                0.0
     Hard parses:                1.2                0.0
W/A MB processed:                1.0                0.0
          Logons:                0.5                0.0
        Executes:           15,756.5                2.0
       Rollbacks:                0.0                0.0
    Transactions:            7,855.1

د لابراتوار کار ته راستنیدل.
موږ به، نور شیان مساوي وي، د لابراتوار فرعي ډیټابیس د لاندې پیرامیټونو ارزښتونو سره توپیر وکړو:

  1. د ډیټابیس لاګ ګروپونو اندازه. د ارزښت حد: [32, 1024] MB؛
  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;

یو څوک چې د اوریکل ډیټابیسونو ساتلو کې تجربه لري یقینا کولی شي دمخه ووایی چې څه او کوم ارزښتونه باید د ټاکل شوي پیرامیټونو او د دوی د منلو وړ ارزښتونو څخه تنظیم شي ، ترڅو د ډیټا سره د کار لپاره د ډیټابیس ډیر تولید ترلاسه کړي چې لخوا ورته اشاره شوې. د غوښتنلیک کوډ، دلته پورته.

خو.

د لابراتوار کار ټکی دا دی چې وښیې چې د اصلاح کولو الګوریتم پخپله به دا زموږ لپاره په نسبتا چټکۍ سره روښانه کړي.

زموږ لپاره، ټول هغه څه چې پاتې دي د دودیز سیسټم له لارې د سند په لټه کې دي، یوازې د دې لپاره کافي دي چې معلومه کړي چې کوم پیرامیټونه باید بدل شي او په کوم حد کې.
او همدارنګه: کوډ کوډ کړئ چې د ټاکل شوي اصلاح کولو الګوریتم دودیز سیسټم سره کار کولو لپاره به کارول کیږي.

نو، اوس د کوډ په اړه.
ما پورته خبرې وکړې 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 subroutine صفات ga په اصل کې، د لټون ځای یوه ساحه مشخصه شوې، په کوم کې چې لټون به د داسې ویکتور (یا ویکتورونو) لپاره ترسره شي چې د فټنس فعالیت اعظمي ارزښت به ترلاسه شي.

ga subroutine د فټنس فعالیت اعظمي کولو لټون ترسره کوي.

ښه، بیا، دا معلومه شوه چې، پدې حالت کې، دا اړینه ده چې د فټنس فعالیت، د فرعي پیرامیټونو لپاره د ارزښتونو سیټ په توګه د ویکتور پوهه، د فرعي څخه میټریک ترلاسه کوي.

دا دی: څو، د ورکړل شوي فرعي سیټ اپ سره او په subd کې ورکړل شوي بار سره: subd په هره ثانیه کې لیږد پروسس کوي.

دا، کله چې ښکاره شي، لاندې څو مرحلې باید د فټنس فعالیت دننه ترسره شي:

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

هغه. ټول کار: د فټنس فعالیت کې ترسره شوی.

ga-subroutine ویکتورونه پروسس کوي، یا په سمه توګه، کروموزومونه.
په کوم کې، هغه څه چې زموږ لپاره خورا مهم دي د جینونو سره د کروموزومونو انتخاب دی چې د فټنس فعالیت لوی ارزښتونه تولیدوي.

دا، په اصل کې، د N-dimensional لټون ځای کې د ویکتور په کارولو سره د کروموزومونو غوره سیټ لټون کولو پروسه ده.

ډیر روښانه ، مفصل تشریحد R-code د مثالونو سره، د جینیاتي الګوریتم کار.

زه غواړم په جلا توګه دوه تخنیکي ټکي یاد کړم.

د فنکشن څخه معاون زنګونه evaluate، د مثال په توګه ، سټاپ پیل ، د فرعي پیرامیټر ارزښت تنظیم کول ، په اساس ترسره کیږي cran-r دندې system2

د کوم په مرسته: ځینې bash سکریپټ یا کمانډ ویل کیږي.

د مثال په توګه:

set_db_parameter

set_db_parameter=function(p1, p2) {
v_module="set_db_parameter"
v_cmd="/home/oracle/testingredotracе/set_db_parameter.sh"
v_args=paste(p1," ",p2,sep="")

x=system2(v_cmd, args=v_args, stdout=T, stderr=T, wait=T)
if ( length(attributes(x)) > 0 ) {
 cat(paste(v_module," failed with: ",attributes(x)$status," ",v_cmd," ",v_args,sep=""), file=v_logfile, sep="n", append=T)
 return (attributes(x)$status)
}
else {
 cat(paste(v_module," ok: ",v_cmd," ",v_args,sep=""), file=v_logfile, sep="n", append=T)
 return (0)
}
}

دوهم ټکی کرښه ده، evaluate افعال، د یو ځانګړي میټریک ارزښت خوندي کولو سره او د لاګ فایل ته د دې اړوند ټونینګ ویکتور:

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

دا مهمه ده، ځکه چې د دې ډیټا سرې څخه، دا به ممکنه وي چې اضافي معلومات ترلاسه کړئ چې د ټونینګ ویکتور کومې برخې د میټریک ارزښت باندې لوی یا لږ اغیزه لري.

دا دی: دا به ممکنه وي چې د ځانګړتیاو - وارداتو تحلیل ترسره شي.

نو څه پیښ کیدی شي؟

د ګراف په شکل کې، که تاسو ازموینو ته د لوړ میټریک ترتیب امر وکړئ، انځور په لاندې ډول دی:

د ساینسي پوک میتود ، یا د بنچمارکونو او اصلاح کولو الګوریتم په کارولو سره د ډیټابیس ترتیب غوره کولو څرنګوالی

ځینې ​​​​معلومات چې د میټریک خورا ارزښتونو سره مطابقت لري:
د ساینسي پوک میتود ، یا د بنچمارکونو او اصلاح کولو الګوریتم په کارولو سره د ډیټابیس ترتیب غوره کولو څرنګوالی
دلته ، د پایلو سره په سکرین شاټ کې ، زه به روښانه کړم: د ټونینګ ویکتور ارزښتونه د فټنس فنکشن کوډ شرایطو کې ورکړل شوي ، نه د پیرامیټرو ارزښتونو پیرامیټرو / رینجونو شمیر لیست شرایطو کې ، کوم چې جوړ شوی و. پورته په متن کې.

ښه. ایا دا ډیر دی یا لږ، ~ 8 زره tps: یوه جلا پوښتنه.
د لابراتوار د کار په چوکاټ کې، دا ارقام مهم نه دي، څه مهم دي متحرکات دي، دا ارزښت څنګه بدلیږي.

دلته متحرکات ښه دي.
دا څرګنده ده چې لږترلږه یو فکتور د پام وړ د میټریک ارزښت اغیزه کوي، ga-algorithm، د کروموزوم ویکتورونو له لارې ترتیب کول: پوښل شوي.
د منحني ارزښتونو د منصفانه قوي متحرکاتو له مخې قضاوت کول، لږترلږه یو بل فکتور شتون لري چې که څه هم د پام وړ کوچنی دی، اغیزه لري.

دا هغه ځای دی چې تاسو ورته اړتیا لرئ attribute-importance تحلیل د پوهیدو لپاره چې کوم ځانګړتیاوې (ښه، پدې حالت کې، د ټونینګ ویکتور اجزا) او څومره دوی د میټریک ارزښت اغیزه کوي.
او د دې معلوماتو څخه: پوه شئ چې کوم عوامل د پام وړ ځانګړتیاو کې د بدلونونو لخوا اغیزمن شوي.

د دويم attribute-importance په مختلفو لارو ممکن.

د دې موخو لپاره، زه د الګوریتم خوښوم randomForest د ورته نوم آر پیکج (اسناد)
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
    په تخنیکي ډول، دا د فرعي لاګ بفر څخه اوسني لاګ ګروپ ته د ریډو ډیټا لیکلو د io عملیاتو اجرا کولو حالت مشخص کوي: همغږي یا غیر متناسب.
    ارزښت nowait کوم چې د Tps میټریک ارزښت کې نږدې عمودی، څو زیاتوالي پایله کوي: دا په ریډو ګروپونو کې د اسینکرونوس io حالت شاملول دي.
    یو جلا پوښتنه دا ده چې ایا تاسو باید دا د خواړو ډیټابیس کې ترسره کړئ یا نه. دلته زه خپل ځان یوازې بیانولو ته محدودوم: دا یو مهم فاکتور دی.
  2. دا منطقي ده چې د فرعي لوګ بفر اندازه: د پام وړ فکتور وګرځي.
    هرڅومره چې د لاګ بفر اندازه کوچنۍ وي ، هومره یې د بفر کولو ظرفیت کم وي ، په ورته وخت کې دا ډیریږي او / یا د نوي ریډکس ډیټا یوې برخې لپاره په دې کې د وړیا ساحې تخصیص کولو وړتیا نلري.
    دا پدې مانا ده: په لاګ بفر کې د ځای تخصیص کولو او/یا له هغې څخه د ریډو ګروپونو ته د ریډو ډیټا ډمپ کولو سره ځنډونه.
    دا ځنډونه، البته، باید د معاملو لپاره د ډیټابیس په وسیله اغیزه وکړي.
  3. پارسيم db_block_checksum: ښه، هم، په عموم کې دا روښانه ده - د لیږد پروسس کول د فرعي ډیټابیس بفر کیچ کې د ډارټي بلاکونو رامینځته کیدو لامل کیږي.
    کوم چې ، کله چې د ډیټا بلاکونو چیکسم چیک کول فعال شوي وي ، ډیټابیس باید پروسس کړي - دا چکسمونه د ډیټا بلاک له بدن څخه محاسبه کړئ ، دوی د ډیټا بلاک سرلیک کې لیکل شوي څه سره چیک کړئ: میچونه / سره سمون نه خوري.
    دا ډول کار، بیا، نشي کولی د معلوماتو پروسس کولو کې ځنډ وکړي، او په دې اساس، پیرامیټر او میکانیزم چې دا پیرامیټر ټاکي د پام وړ وي.
    له همدې امله پلورونکی وړاندیز کوي ، د دې پیرامیټر لپاره په اسنادو کې ، د دې لپاره مختلف ارزښتونه (پیرامیټ) او یادونه کوي چې هو ، دلته به اغیزه وي ، مګر ، ښه ، تاسو کولی شئ مختلف ارزښتونه غوره کړئ ، تر "بند" پورې او مختلف اغیزې.

ښه، یوه نړیواله پایله.

طریقه، په عموم کې، په بشپړه توګه کار کوي.

هغه ځان ته اجازه ورکوي چې د یو ځانګړي خدمت سیسټم بار ازموینې په لومړیو مرحلو کې د بار لپاره د دې (سیسټم) غوره ترتیب غوره کولو لپاره ، نه د بار لپاره د سیسټم تنظیم کولو ځانګړتیاو ته ډیر پام کول.

مګر دا په بشپړ ډول خارج نه کوي - لږترلږه د پوهاوي په کچه: سیسټم باید د "تعدیل نوبس" او د دې غوټۍ د څرخولو اجازه لرونکي حدونو په اړه پوه شي.

بیا طریقه کولی شي په نسبي توګه د غوره سیسټم ترتیب ومومي.
او د ازموینې پایلو پراساس ، دا ممکنه ده چې د سیسټم فعالیت میټریکونو او د سیسټم تنظیماتو پیرامیټونو ارزښتونو ترمینځ د اړیکو طبیعت په اړه معلومات ترلاسه کړئ.

کوم چې، البته، باید د سیسټم په اړه د دې خورا ژورې پوهاوي رامینځته کولو کې مرسته وکړي، د هغې عملیات، لږترلږه د ورکړل شوي بار لاندې.

په عمل کې، دا د سیسټم د دې ډول ازموینې چمتو کولو لګښتونو لپاره د دودیز سیسټم درک کولو لګښتونو تبادله ده.

زه غواړم په جلا توګه یادونه وکړم: پدې طریقه کې، عملیاتي شرایطو ته د سیسټم ازموینې کافي اندازه چې دا به په سوداګریزو عملیاتو کې ولري خورا مهم دی.

ستاسو د پاملرنې او وخت څخه مننه.

سرچینه: www.habr.com

Add a comment