科孊的なポヌク手法、たたはベンチマヌクず最適化アルゎリズムを䜿甚しおデヌタベヌス構成を遞択する方法

もしもし

私は、思考ず詊行錯誀の成果である私の発芋を共有するこずにしたした。
抂しお、もちろんこれは発芋ではありたせん。このこずはすべお、応甚統蚈デヌタ凊理やシステム (必ずしも DBMS に限ったものではない) の最適化に携わる人々には、長い間知られおいたはずです。
そしおはい、圌らは知っおいたす、圌らは自分たちの研究に぀いお興味深い蚘事を曞いおいたす、 䟋 (UPD.: コメントの䞭で、圌らは非垞に興味深いプロゞェクトを指摘したした: オッテルチュヌン )
その䞀方で、率盎に蚀っお、IT スペシャリストである DBA の間で、むンタヌネット䞊でこのアプロヌチが広く蚀及されたり普及したりしおいるのは芋圓たりたせん。

ずいうこずで、本題です。

ある皮の䜜業を凊理するために特定のサヌビス システムをセットアップするずいうタスクがあるず仮定したしょう。

この䜜品に぀いおは、それが䜕であるか、この䜜品の品質がどのように枬定されるか、そしおこの品質を枬定するための基準が䜕であるかがわかっおいたす。

たた、このサヌビス システム内で (たたはこのサヌビス システムで) 䜜業がどのように実行されるかに぀いおは、倚かれ少なかれ理解されおいるず仮定したしょう。

「倚かれ少なかれ」 - これは、運甚環境に十分に適したテスト負荷で合成しおシステムに適甚できる特定のツヌル、ナヌティリティ、サヌビスを準備できる (たたはどこかから入手できる) こずを意味したす。本番環境での䜜業に十分な条件が敎っおいるこず。

さお、このサヌビス システムの䞀連の調敎パラメヌタが既知であり、その䜜業の生産性の芳点からこのシステムを構成するために䜿甚できるず仮定したしょう。

そしお問題は䜕ですか。このサヌビス システムに぀いおは、特定のプラットフォヌムでの将来の負荷に合わせおこのシステムの蚭定を専門的に構成し、システムに必芁な生産性を埗るこずができる、十分に完党な理解がありたせん。

良い。 これはほずんど垞に圓おはたりたす。

ここで䜕ができるでしょうか

たず最初に思い浮かぶのは、このシステムのドキュメントを芋るこずです。 調敎パラメヌタの倀の蚱容範囲を理解したす。 そしお、たずえば、座暙降䞋法を䜿甚しお、テストでシステム パラメヌタヌの倀を遞択したす。

それらの。 構成パラメヌタの特定の倀のセットの圢匏で、システムに䜕らかの構成を䞎えたす。

このツヌルナヌティリティである負荷ゞェネレヌタを䜿甚しお、テスト負荷を適甚したす。
そしお、その倀、぀たり応答、぀たりシステムの品質の指暙に泚目しおください。

次に考えられるのは、これは非垞に長い時間であるずいう結論かもしれたせん。

぀たり、蚭定パラメヌタヌが倚数ある堎合、実行される倀の範囲が倧きい堎合、個々の負荷テストの完了に時間がかかる堎合、はい、これには蚱容できないほど時間がかかる可胜性がありたす。長い間。

さお、ここであなたが理解し、芚えおおくこずができるこずを説明したす。

サヌビスシステム蚭定パラメヌタの倀のセットには、いく぀かの倀のシヌケンスずしおベクトルがあるこずがわかりたす。

このような各ベクトルは、その他の条件が等しい堎合 (このベクトルの圱響を受けないずいう点で)、メトリックの完党に明確な倀、぀たりテスト負荷䞋でのシステムの動䜜品質の指暙に察応したす。

すなわち

システム構成ベクトルを次のように衚すこずにしたす。 科孊的なポヌク手法、たたはベンチマヌクず最適化アルゎリズムを䜿甚しおデヌタベヌス構成を遞択する方法どこ 科孊的なポヌク手法、たたはベンチマヌクず最適化アルゎリズムを䜿甚しおデヌタベヌス構成を遞択する方法; どこ 科孊的なポヌク手法、たたはベンチマヌクず最適化アルゎリズムを䜿甚しおデヌタベヌス構成を遞択する方法 — システム構成パラメヌタの数、これらのパラメヌタがいく぀あるか。

そしお、これに察応するメトリクスの倀 科孊的なポヌク手法、たたはベンチマヌクず最適化アルゎリズムを䜿甚しおデヌタベヌス構成を遞択する方法 それを次のように衚したしょう
科孊的なポヌク手法、たたはベンチマヌクず最適化アルゎリズムを䜿甚しおデヌタベヌス構成を遞択する方法そうするず、次の関数が埗られたす。 科孊的なポヌク手法、たたはベンチマヌクず最適化アルゎリズムを䜿甚しおデヌタベヌス構成を遞択する方法

さお、私の堎合、すべおはすぐに、孊生時代からほずんど忘れられおいた、関数の極倀を怜玢するためのアルゎリズムに垰着したす。

さお、しかしここで、どのアルゎリズムを䜿甚するかずいう、組織的か぀応甚的な問題が生じたす。

  1. ある意味では、手䜜業でコヌディングする手間が枛りたす。
  2. そしおそれが機胜するためには、぀たり(極倀があれば) 少なくずも座暙降䞋よりも速く芋぀かりたした。

最初の点は、そのようなアルゎリズムがすでに実装されおおり、䜕らかの圢でコヌドで䜿甚できる環境に目を向ける必芁があるこずを瀺唆しおいたす。
たあ、知っおいたす python О cran-r

XNUMX 番目のポむントは、アルゎリズム自䜓、アルゎリズムの内容、芁件、動䜜の特城に぀いお読む必芁があるこずを意味したす。

そしお、それらが䞎えるものは、有益な副䜜甚、぀たり結果、たたはアルゎリズム自䜓から盎接埗られる可胜性がありたす。

たたは、アルゎリズムの結果から取埗するこずもできたす。

入力条件に倧きく䟝存したす。

たずえば、䜕らかの理由で結果をより速く取埗する必芁がある堎合は、募配降䞋法アルゎリズムに泚目し、そのいずれかを遞択する必芁がありたす。

たたは、時間がそれほど重芁ではない堎合は、たずえば、遺䌝的アルゎリズムなどの確率的最適化手法を䜿甚できたす。

私は、遺䌝的アルゎリズムを䜿甚しおシステム構成を遞択するこのアプロヌチの䜜業を、いわば実隓宀での䜜業ずしお怜蚎するこずを提案したす。

゜ヌス

  1. サヌビス システムずしお次のようなものがあるずしたす。 oracle xe 18c
  2. これをトランザクション アクティビティに䜿甚し、サブデヌタベヌスの可胜な限り最高のスルヌプット (トランザクション/秒) を取埗するずいう目暙を達成したす。
  3. トランザクションは、デヌタの操䜜の性質や䜜業のコンテキストが倧きく異なる堎合がありたす。
    これらは倧量の衚圢匏デヌタを凊理しないトランザクションであるこずに同意したしょう。
    これは、REDO よりも倚くの UNDO デヌタを生成せず、倧郚分の行や倧きなテヌブルを凊理しないずいう意味です。

これらは、テヌブル䞊の少数のむンデックスを䜿甚しお、倚かれ少なかれ倧きなテヌブル内の XNUMX 行を倉曎するトランザクションです。

この状況では、トランザクションを凊理するためのサブデヌタベヌスの生産性は、予玄があれば、REDOX デヌタベヌスによる凊理の品質によっお決たりたす。

免責事項 - 特に subdb 蚭定に぀いお話す堎合。

䞀般に、衚圢匏デヌタや衚圢匏モデルを䜿甚したナヌザヌ䜜業の蚭蚈により、たずえば SQL セッション間にトランザクション ロックが発生する可胜性があるためです。

もちろん、これは tps メトリクスにマむナスの圱響を及がし、これはサブデヌタベヌスに関連した倖因的芁因になりたす。これが、衚圢匏モデルの蚭蚈方法ず、ブロックが発生するその䞭のデヌタの凊理方法です。

したがっお、実隓の玔床を高めるために、この芁玠を陀倖し、以䞋でその方法を正確に説明したす。

  1. 明確にするために、デヌタベヌスに送信される SQL コマンドの 100% が DML コマンドであるず仮定したす。
    テストでは、サブデヌタベヌスを操䜜するナヌザヌの特性が同じになるようにしたす。
    ぀たり、skl セッションの数、衚圢匏のデヌタ、skl セッションがそれらずどのように連携するか。
  2. サブドはで動䜜したす FORCE LOGGING, ARCHIVELOG 改造品。 フラッシュバック デヌタベヌス モヌドは、subd レベルでオフになりたす。
  3. REDO ログ: 別のファむル システムの別の「ディスク」にありたす。
    デヌタベヌスの物理コンポヌネントの残りの郚分: 別の別のファむル システム、別の「ディスク」䞊:

物理デバむスの詳现。 研究宀デヌタベヌスのコンポヌネント

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

圓初、このような負荷条件䞋では、トランザクション subd を䜿甚したいず考えおいたした。 SLOBナヌティリティ
ずおも玠晎らしい機胜があるので、著者の蚀葉を匕甚したしょう。

SLOBの䞭心ずなるのが「SLOB法」です。 SLOB メ゜ッドはプラットフォヌムをテストするこずを目的ずしおいたす
アプリケヌションの競合なしで。 ハヌドりェアのパフォヌマンスを最倧限に匕き出すこずはできない
たずえば、アプリケヌションのロックやさらにはバむンドされたアプリケヌション コヌドを䜿甚する
Oracle Databaseブロックを共有したす。 そうです、デヌタを共有する際にはオヌバヌヘッドが発生したす。
デヌタブロックで しかし、SLOB は、デフォルトの展開では、そのような競合の圱響を受けたせん。

この宣蚀: に該圓したす。
clセッションの䞊列床を調敎するず䟿利です。これが重芁です -t ナヌティリティを起動する runit.sh SLOBから
DML コマンドの割合は、subd、各テキスト セッション、パラメヌタに送信されるテキスト メッセヌゞの数で芏制されたす。 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"

それらの。 各ワヌカヌ (実際には 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 XNUMX ぀の倀が蚱可されたす。 batch|immediate;
  5. commit_wait XNUMX ぀の倀が蚱可されたす。 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 XNUMX ぀の倀が蚱可されたす。 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 サブルヌチンは、適応床関数を最倧化する怜玢を実行したす。

さお、この堎合、ベクトルを subd の特定のパラメヌタヌの倀のセットずしお理解する適合関数が subd からメトリックを受け取る必芁があるこずがわかりたす。

぀たり、指定された subd セットアップず subd 䞊の指定された負荷で、subd が XNUMX 秒あたりにトランザクションを凊理する数です。

぀たり、展開するずきに、フィットネス関数内で次の耇数のステップを実行する必芁がありたす。

  1. 数倀の入力ベクトルを凊理し、サブデヌタ パラメヌタヌの倀に倉換したす。
  2. 指定されたサむズの指定された数の REDO グルヌプを䜜成しようずしたす。 さらに、その詊みは倱敗する可胜性がありたす。
    実隓の玔粋さのために、ある皋床の量ずある皋床のサむズで、サブッドにすでに存圚しおいた雑誌グルヌプ - d.b. 削陀されたした。
  3. 前のポむントが成功した堎合: 構成パラメヌタの倀をデヌタベヌスに指定したす (繰り返しになりたすが、倱敗する可胜性がありたす)
  4. 前のステップが成功した堎合: subd を停止し、新しく指定したパラメヌタヌ倀が有効になるように subd を開始したす。 (繰り返したすが、䞍具合がある可胜性がありたす)
  5. 前の手順が成功した堎合: 負荷テストを実行したす。 subdからメトリクスを取埗したす。
  6. subd を元の状態に戻したす。぀たり、 远加のログ グルヌプを削陀し、元のサブデヌタベヌス構成を機胜できるように戻したす。

フィットネス機胜コヌド

evaluate=function(p_par) {
v_module="evaluate"
v_metric=0
opn=NULL
opn$rg_size=round(p_par[1],digit=0)
opn$rg_count=round(p_par[2],digit=0)
opn$log_archive_max_processes=round(p_par[3],digit=0)
opn$commit_logging="BATCH"
if ( round(p_par[4],digit=0) > 5 ) {
 opn$commit_logging="IMMEDIATE"
}
opn$commit_logging=paste("'", opn$commit_logging, "'",sep="")

opn$commit_wait="WAIT"
if ( round(p_par[5],digit=0) > 5 ) {
 opn$commit_wait="NOWAIT"
}
opn$commit_wait=paste("'", opn$commit_wait, "'",sep="")

opn$log_buffer=paste(round(p_par[6],digit=0),"m",sep="")
opn$log_checkpoint_timeout=round(p_par[7],digit=0)
opn$db_writer_processes=round(p_par[8],digit=0)
opn$undo_retention=round(p_par[9],digit=0)
opn$transactions_per_rollback_segment=round(p_par[10],digit=0)
opn$disk_asynch_io="true"
if ( round(p_par[11],digit=0) > 5 ) {
 opn$disk_asynch_io="false"
} 

opn$filesystemio_options="none"
if ( round(p_par[12],digit=0) > 10 && round(p_par[12],digit=0) <= 20 ) {
 opn$filesystemio_options="setall"
}
if ( round(p_par[12],digit=0) > 20 && round(p_par[12],digit=0) <= 30 ) {
 opn$filesystemio_options="directIO"
}
if ( round(p_par[12],digit=0) > 30 ) {
 opn$filesystemio_options="asynch"
}

opn$db_block_checking="OFF"
if ( round(p_par[13],digit=0) > 10 && round(p_par[13],digit=0) <= 20 ) {
 opn$db_block_checking="LOW"
}
if ( round(p_par[13],digit=0) > 20 && round(p_par[13],digit=0) <= 30 ) {
 opn$db_block_checking="MEDIUM"
}
if ( round(p_par[13],digit=0) > 30 ) {
 opn$db_block_checking="FULL"
}

opn$db_block_checksum="OFF"
if ( round(p_par[14],digit=0) > 10 && round(p_par[14],digit=0) <= 20 ) {
 opn$db_block_checksum="TYPICAL"
}
if ( round(p_par[14],digit=0) > 20 ) {
 opn$db_block_checksum="FULL"
}

v_vector=paste(round(p_par[1],digit=0),round(p_par[2],digit=0),round(p_par[3],digit=0),round(p_par[4],digit=0),round(p_par[5],digit=0),round(p_par[6],digit=0),round(p_par[7],digit=0),round(p_par[8],digit=0),round(p_par[9],digit=0),round(p_par[10],digit=0),round(p_par[11],digit=0),round(p_par[12],digit=0),round(p_par[13],digit=0),round(p_par[14],digit=0),sep=";")
cat( paste(v_module," try to evaluate vector: ", v_vector,sep="") , file=v_logfile, sep="n", append=T)

rc=make_additional_rgroups(opn)
if ( rc!=0 ) {
 cat( paste(v_module,"make_additional_rgroups failed",sep="") , file=v_logfile, sep="n", append=T)
 return (0)
}

v_rc=0
rc=set_db_parameter("log_archive_max_processes", opn$log_archive_max_processes)
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("commit_logging", opn$commit_logging )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("commit_wait", opn$commit_wait )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("log_buffer", opn$log_buffer )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("log_checkpoint_timeout", opn$log_checkpoint_timeout )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("db_writer_processes", opn$db_writer_processes )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("undo_retention", opn$undo_retention )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("transactions_per_rollback_segment", opn$transactions_per_rollback_segment )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("disk_asynch_io", opn$disk_asynch_io )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("filesystemio_options", opn$filesystemio_options )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("db_block_checking", opn$db_block_checking )
if ( rc != 0 ) {  v_rc=1 }
rc=set_db_parameter("db_block_checksum", opn$db_block_checksum )
if ( rc != 0 ) {  v_rc=1 }

if ( rc!=0 ) {
 cat( paste(v_module," can not startup db with that vector of settings",sep="") , file=v_logfile, sep="n", append=T)
 rc=stop_db("immediate")
 rc=create_spfile()
 rc=start_db("")
 rc=remove_additional_rgroups(opn)
 return (0)
}

rc=stop_db("immediate")
rc=start_db("")
if ( rc!=0 ) {
 cat( paste(v_module," can not startup db with that vector of settings",sep="") , file=v_logfile, sep="n", append=T)
 rc=stop_db("abort")
 rc=create_spfile()
 rc=start_db("")
 rc=remove_additional_rgroups(opn)
 return (0)
}

rc=run_test()
v_metric=getmetric()

rc=stop_db("immediate")
rc=create_spfile()
rc=start_db("")
rc=remove_additional_rgroups(opn)

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

それ。 すべおの䜜業: フィットネス機胜で実行されたす。

ga サブルヌチンはベクトル、より正確には染色䜓を凊理したす。
その䞭で、私たちにずっお最も重芁なこずは、適応床関数が倧きな倀を生み出す遺䌝子を持぀染色䜓を遞択するこずです。

これは本質的に、N 次元の怜玢空間でベクトルを䜿甚しお最適な染色䜓のセットを怜玢するプロセスです。

非垞に明確で詳现な 説明、遺䌝的アルゎリズムの働きである R コヌドの䟋を瀺したす。

技術的な点を XNUMX ぀個別に指摘したいず思いたす。

関数からの補助呌び出し evaluateたずえば、停止/開始、subd パラメヌタの倀の蚭定は、次の条件に基づいお実行されたす。 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)
}
}

XNUMX番目のポむントはラむンです。 evaluate 特定のメトリック倀ずそれに察応する調敎ベクトルをログ ファむルに保存する機胜:

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

これは重芁です。なぜなら、このデヌタ配列から、調敎ベクトルのどの成分がメトリック倀に倚かれ少なかれ圱響を䞎えるかに぀いおの远加情報を取埗できるからです。

぀たり、属性重芁床分析が可胜になりたす。

それで䜕が起こるでしょうか

グラフ圢匏で、テストをメトリックの昇順に䞊べるず、図は次のようになりたす。

科孊的なポヌク手法、たたはベンチマヌクず最適化アルゎリズムを䜿甚しおデヌタベヌス構成を遞択する方法

メトリクスの極倀に察応するいく぀かのデヌタ:
科孊的なポヌク手法、たたはベンチマヌクず最適化アルゎリズムを䜿甚しおデヌタベヌス構成を遞択する方法
ここで、結果を含むスクリヌンショットで明確にしたす。調敎ベクトルの倀は、定匏化されたパラメヌタヌの番号リスト/パラメヌタヌ倀の範囲の芳点ではなく、適応床関数のコヌドの芳点から䞎えられたす。本文䞭の䞊にありたす。

良い。 箄 8 tps は倚いのか少ないのか、別の質問です。
実隓宀での研究の枠組みでは、この数倀は重芁ではありたせん。重芁なのはダむナミクス、぀たりこの倀がどのように倉化するかです。

ここのダむナミクスは良いです。
少なくずも XNUMX ぀の芁玠が、染色䜓ベクトルを䞊べ替えるメトリクス、ga アルゎリズムの倀に倧きく圱響するこずは明らかです。
曲線倀のかなり激しいダむナミクスから刀断するず、かなり小さいずはいえ、圱響を䞎える芁因が少なくずも XNUMX ぀ありたす。

ここが必芁です attribute-importance 分析により、どのような属性 (この堎合は調敎ベクトルのコンポヌネント) がメトリック倀にどの皋床圱響するかを理解できたす。
そしお、この情報から、重芁な属性の倉化によっおどのような芁因が圱響を受けたかを理解したす。

ラン attribute-importance さたざたな方法で可胜です。

これらの目的のために、私はこのアルゎリズムが奜きです randomForest 同名の R パッケヌゞ (ドキュメント)
randomForest私が理解しおいるように、圌の研究党般、特に属性の重芁性を評䟡するアプロヌチは、属性に察する応答倉数の䟝存性に぀いおの特定のモデルを構築しおいたす。

この堎合、応答倉数は負荷テストでデヌタベヌスから取埗されたメトリックです。 tps;
たた、属性は調敎ベクトルのコンポヌネントです。

そしおそう randomForest 各モデル属性の重芁性を XNUMX ぀の数倀で評䟡したす。 %IncMSE — モデル内のこの属性の有無によっお、このモデルの MSE 品質 (平均二乗誀差) がどのように倉化するか。

そしお、IncNodePurity は、この属性の倀に基づいお、芳枬倀を含むデヌタセットをどの皋床うたく分割できるかを反映する数倀です。぀たり、ある郚分には説明されおいるメトリクスの XNUMX ぀の倀を持぀デヌタがあり、もう XNUMX ぀は説明されおいるメトリクスの倀を持぀デヌタが存圚したす。メトリックの別の倀。
぀たり、これはどの皋床分類属性なのかずいうこずです (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
    技術的には、REDO デヌタを subdb ログ バッファから珟圚のログ グルヌプに曞き蟌む io 操䜜の実行モヌド (同期たたは非同期) を指定したす。
    倀 nowait その結果、tps メトリックの倀がほが垂盎に耇数回増加したす。これは、REDO グルヌプに非同期 IO モヌドが含たれおいるこずです。
    別の問題は、これを食品デヌタベヌスで行うべきかどうかです。 ここでは、これは重芁な芁玠であるずだけ述べおおきたす。
  2. subd: のログ バッファヌのサむズが重芁な芁玠であるこずが刀明するのは論理的です。
    ログ バッファのサむズが小さいほど、バッファリング容量が少なくなり、オヌバヌフロヌが発生したり、新しい酞化還元デヌタの䞀郚に空き領域を割り圓おるこずができなくなるこずが倚くなりたす。
    これは、ログ・バッファ内の領域の割り圓おや、ログ・バッファからREDOグルヌプぞのREDOデヌタのダンプに関連する遅延を意味したす。
    これらの遅延は、圓然のこずながら、トランザクションのデヌタベヌスのスルヌプットに圱響を䞎えるはずです。
  3. パラメヌタヌ db_block_checksum: そうですね、䞀般的に、トランザクション凊理によりサブデヌタベヌスのバッファ キャッシュ内にダヌティ ブロックが圢成されるこずは明らかです。
    デヌタブロックのチェックサムのチェックが有効になっおいる堎合、デヌタベヌスはデヌタブロックの本䜓からこれらのチェックサムを蚈算し、デヌタブロックのヘッダヌに曞かれおいるものず照合しお、䞀臎/䞍䞀臎をチェックする必芁がありたす。
    このような䜜業もたた、デヌタ凊理を遅らせるほかなく、したがっお、パラメヌタず、このパラメヌタを蚭定するメカニズムが重芁であるこずが刀明したす。
    そのため、ベンダヌはこのパラメヌタのドキュメントでこのパラメヌタ (パラメヌタ) に異なる倀を提䟛し、確かに圱響はありたすが、「オフ」や「オフ」たでの異なる倀を遞択できるず述べおいたす。さたざたな圱響。

たあ、䞖界的な結論です。

䞀般に、このアプロヌチは非垞にうたく機胜しおいるこずがわかりたす。

圌は、特定のサヌビス システムの負荷テストの初期段階では、負荷に合わせおその (システム) 最適な構成を遞択するため、負荷に合わせおシステムをセットアップする詳现に぀いおはあたり深く掘り䞋げないこずにしおいたす。

しかし、それを完党に排陀するわけではありたせん - 少なくずも理解のレベルでは、システムは「調敎ノブ」ずこれらのノブの回転の蚱容範囲に぀いお知っおおく必芁がありたす。

このアプロヌチにより、最適なシステム構成を比范的迅速に芋぀けるこずができたす。
そしお、テストの結果に基づいお、システムパフォヌマンスメトリックずシステム蚭定パラメヌタヌの倀の間の関係の性質に関する情報を取埗するこずができたす。

もちろん、これは、少なくずも所定の負荷の䞋でのシステムずその動䜜に぀いおの非垞に深い理解の出珟に貢献するはずです。

実際には、これは、カスタマむズされたシステムを理解するためのコストず、そのようなシステムのテストを準備するためのコストずを亀換するこずになりたす。

個別に指摘しおおきたいのは、このアプロヌチでは、商業運甚における運甚条件に察するシステム テストの適切性の皋床が非垞に重芁であるずいうこずです。

ご枅聎いただきありがずうございたした。

出所 habr.com

コメントを远加したす