From: Andrei Elkin Date: April 2 2011 11:32am Subject: bzr commit into mysql-next-mr-wl5569 branch (andrei.elkin:3272) WL#5569 List-Archive: http://lists.mysql.com/commits/134536 Message-Id: <201104021132.p32BWCtr028081@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============0492829709==" --===============0492829709== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/andrei/MySQL/BZR/2a-23May/WL/mysql-next-mr-wl5569/ based on revid:andrei.elkin@stripped 3272 Andrei Elkin 2011-04-02 wl#5569 MTS a test file for benchmarking is added. Benchmarking results can be gained by extracting the master side generating and the slave side applying times like in the following loop: workers=6; for n in `seq 1 3`; do echo; echo loop: $n; echo; my_mtr.sh --mysqld=--mts-slave-parallel-workers=$workers \ rpl_parallel_benchmark --mysqld=--binlog-format=statement \ && cat /dev/shm/var/mysqld.2/data/test/delta.out >> p${workers}_stmt.out 2>&1; done @ mysql-test/extra/rpl_tests/rpl_parallel_benchmark_load.test the load generator for a test file for benchmarking is added. @ mysql-test/suite/rpl/r/rpl_parallel_benchmark.result a new results file is added. @ mysql-test/suite/rpl/t/rpl_parallel_benchmark-slave.opt slave does to log into binary log. The number of workers is supposed to set via --mysqld at mtr invocation. @ mysql-test/suite/rpl/t/rpl_parallel_benchmark.test a test file for benchmarking is added. added: mysql-test/extra/rpl_tests/rpl_parallel_benchmark_load.test mysql-test/suite/rpl/r/rpl_parallel_benchmark.result mysql-test/suite/rpl/t/rpl_parallel_benchmark-master.opt mysql-test/suite/rpl/t/rpl_parallel_benchmark-slave.opt mysql-test/suite/rpl/t/rpl_parallel_benchmark.test === added file 'mysql-test/extra/rpl_tests/rpl_parallel_benchmark_load.test' --- a/mysql-test/extra/rpl_tests/rpl_parallel_benchmark_load.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_parallel_benchmark_load.test 2011-04-02 11:32:02 +0000 @@ -0,0 +1,274 @@ +# +# This is a load generator to call from rpl_parallel and rpl_sequential tests +# + +# +# load volume parameter +# + +let $iter= 128; +let $tables= 4; +let $wk_queries= 16; +let $nk_queries= 0; +let $pre_inserted_rows= 400; + +connection slave; + +call mtr.add_suppression('Slave: Error dropping database'); ## todo: fix + +source include/stop_slave.inc; +start slave; + +connection master; + +--disable_query_log +--disable_result_log + +use test; +delimiter |; +create procedure one_session(k int) +begin + while k > 0 do + insert into tm_nk values(k, 0); + insert into tm_wk values(null, 0); + insert into ti_nk values(k, 0); + insert into ti_wk values(null, 0); + set k = k - 1; + end while; +end| +delimiter ;| + +## let $i = $workers + 1; +##eval +# delimiter |; +# create procedure p1(i int) +# begin +# while i > 0 +# ##while ($i) +# ##{ +# ## let $i1=$i; +# ## dec $i1; +# ## use test$i1; +# ## call on_session(); +# ## dec $i; +# ##} +# use test0; +# call one_session(); +# use test1; +# call one_session(); +# use test2; +# call one_session(); +# use test3; +# call one_session(); +# i= i-1; +# end while; +# end| +# delimiter ;| + + +let $i = $databases; +while($i) +{ + eval create database test$i; + + let $m= $tables; + while ($m) + { + eval create table test$i.tm_nk_$m (a int, b int, c text) engine=myisam; + eval create table test$i.tm_wk_$m (a int auto_increment primary key, b int, c text) engine=myisam; + eval create table test$i.ti_nk_$m (a int, b int, c text) engine=innodb; + eval create table test$i.ti_wk_$m (a int auto_increment primary key, b int, c text) engine=innodb; + let $k= $pre_inserted_rows; + while ($k) + { + eval insert into test$i.ti_wk_$m values(null, $i, uuid()); + eval insert into test$i.ti_nk_$m values(null, $i, uuid()); + + dec $k; + } + dec $m; + } + + + # this table is special - just for timing. It's more special on test1 db + # where it contains master timing of the load as well. + eval create table test$i.benchmark (state text) engine=myisam; # timestamp keep on the slave side + + dec $i; +} + +--enable_result_log +--enable_query_log + + +sync_slave_with_master; +#connection slave; + +--disable_query_log +--disable_result_log + +let $i = $databases; +while($i) +{ + eval alter table test$i.benchmark add ts timestamp not null default current_timestamp; + + dec $i; +} +--enable_result_log +--enable_query_log + + +# not gather events into relay log w/o executing yet +stop slave sql_thread; + +##call p1(1); + +connection master; + +--disable_query_log +--disable_result_log + +# +# Load producer +# + +# initial timestamp to record + +# the extra ts col on slave is effective only with the STMT format (todo: bug-report) +set @save.binlog_format= @@session.binlog_format; +set @@session.binlog_format=STATEMENT; +let $i = $databases; +while($i) +{ + eval insert into test$i.benchmark set state='slave takes on load'; + + dec $i; +} +set @@session.binlog_format= @save.binlog_format; + +connection slave; + +insert into test1.benchmark set state='master started load'; + + +connection master; + +while ($iter) +{ + let $i = $databases; + + while ($i) + { + + begin; + ###eval insert into tm_nk values($iter, $i1, repeat('a', round(rand()*10))); + + let $q= $wk_queries; + while ($q) + { + let $m= `select 1 + floor(rand() * $tables)`; + eval insert into test$i.ti_wk_$m values(null, $i, uuid()); + + dec $q; + } + + let $q= $nk_queries; + while ($q) + { + let $m= `select 1 + floor(rand() * $tables)`; + eval insert into test$i.ti_nk_$m values(null, $i, uuid()); + + dec $q; + } + commit; + + dec $i; + } + + dec $iter; +} + +connection slave; + +##use test1; +insert into test1.benchmark set state='master ends load'; + +connection master; + +# terminal timestamp to record + +let $i = $databases; +set @save.binlog_format= @@session.binlog_format; +set @@session.binlog_format=STATEMENT; +while($i) +{ + eval insert into test$i.benchmark set state='slave ends load'; + + dec $i; +} +set @@session.binlog_format= @save.binlog_format; + +--enable_result_log +--enable_query_log + +connection slave; + +## todo: record start and end time of appying to compare times of +# parallel and sequential execution. + +--disable_query_log +--disable_result_log + +insert into test1.benchmark set state='slave is processing load'; + +# To force filling timestamp cols with the slave local clock values +# to implement benchmarking. + +set @save.mts_exp_slave_local_timestamp=@@global.mts_exp_slave_local_timestamp; +set @@global.mts_exp_slave_local_timestamp=1; + +--sleep 1 + +start slave sql_thread; + +let $wait_timeout= 600; +let $wait_condition= SELECT count(*)+sleep(1) = 5 FROM test1.benchmark; +source include/wait_condition.inc; + +use test; +select * from test1.benchmark into outfile 'benchmark.out'; +select ts from test1.benchmark where state like 'master started load' into @m_0; +select ts from test1.benchmark where state like 'master ends load' into @m_1; +select ts from test1.benchmark where state like 'slave takes on load' into @s_0; +select ts from test1.benchmark where state like 'slave ends load' into @s_1; +select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta_m', + time_to_sec(@s_1) - time_to_sec(@s_0) as 'delta_s' into outfile 'delta.out'; + +--enable_result_log +--enable_query_log + + +connection master; + +--disable_query_log +--disable_result_log + +let $i = $databases; +while($i) +{ + eval drop database test$i; + + dec $i; +} + +use test; +drop procedure one_session; + +--enable_result_log +--enable_query_log + +sync_slave_with_master; +#connection slave; +set @@global.mts_exp_slave_local_timestamp= @save.mts_exp_slave_local_timestamp; + +# End of the tests === added file 'mysql-test/suite/rpl/r/rpl_parallel_benchmark.result' --- a/mysql-test/suite/rpl/r/rpl_parallel_benchmark.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_parallel_benchmark.result 2011-04-02 11:32:02 +0000 @@ -0,0 +1,17 @@ +include/master-slave.inc +[connection master] +set @save.mts_slave_parallel_workers= @@global.mts_slave_parallel_workers; +call mtr.add_suppression('Slave: Error dropping database'); +include/stop_slave.inc +start slave; +stop slave sql_thread; +use test; +select * from test1.benchmark into outfile 'benchmark.out'; +select ts from test1.benchmark where state like 'master started load' into @m_0; +select ts from test1.benchmark where state like 'master ends load' into @m_1; +select ts from test1.benchmark where state like 'slave takes on load' into @s_0; +select ts from test1.benchmark where state like 'slave ends load' into @s_1; +select time_to_sec(@m_1) - time_to_sec(@m_0) as 'delta_m', +time_to_sec(@s_1) - time_to_sec(@s_0) as 'delta_s' into outfile 'delta.out'; +set @@global.mts_exp_slave_local_timestamp= @save.mts_exp_slave_local_timestamp; +include/rpl_end.inc === added file 'mysql-test/suite/rpl/t/rpl_parallel_benchmark-master.opt' --- a/mysql-test/suite/rpl/t/rpl_parallel_benchmark-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_benchmark-master.opt 2011-04-02 11:32:02 +0000 @@ -0,0 +1 @@ +--log-warnings=0 === added file 'mysql-test/suite/rpl/t/rpl_parallel_benchmark-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_parallel_benchmark-slave.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_benchmark-slave.opt 2011-04-02 11:32:02 +0000 @@ -0,0 +1,3 @@ +--skip-log-bin --skip-log-slave-updates --log-warnings=0 --slave-transaction-retries=0 + + === added file 'mysql-test/suite/rpl/t/rpl_parallel_benchmark.test' --- a/mysql-test/suite/rpl/t/rpl_parallel_benchmark.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_parallel_benchmark.test 2011-04-02 11:32:02 +0000 @@ -0,0 +1,57 @@ +# +# WL#5563 Prototype for Parallel Slave with db name partitioning. +# +# The test checks correctness of replication and is designed for +# benchmarking and comparision with results of its sequential +# counterpart rpl_sequential.test. +# Both tests leave mysqld.2/data/test/delta.out file +# that contains a row with two columns. +# 1. the duration (in seconds) of execution on the master +# 2. the duration of execution on the slave +# The 2nd column of the rpl_parallel can be compared with the 2nd of rpl_sequential.test. +# +# The duration recorded in the file accounts the SQL thread/workers work. +# That is benchmarking on the slave side is effectively started with +# `start slave sql_thread'. +# NOTICE, there is set @@global.slave_local_timestamp=1; +# +# +# of load that rpl_parallel_load.test represents. +# See there how to tune load and concurrency parameters. +# +# Example of usage. +# To gather a collection of figures: +# mysql-test$ export slave; +# mysql-test$ slave=parallel; for n in `seq 1 10`; +# do ./mtr --vardir=/dev/shm/var1 --mtr-build-thread=765 rpl_$slave +# --mysqld=--binlog-format=statement; +# find /dev/shm/var1 -name delta.out -exec cat {} \; | cat >> delta.$slave.log; +# done +# +# mysql-test$ slave=sequential; ... +# +# In the end there will be mysql-test/delta.{parallel,sequential}.log files. +# + +let $rpl_skip_reset_master_and_slave= 1; + +--source include/master-slave.inc + +connection slave; +set @save.mts_slave_parallel_workers= @@global.mts_slave_parallel_workers; +###select @@global.mts_slave_parallel_workers as 'non-zero means parallel'; + +let $workers = `select @@global.mts_slave_parallel_workers`; +###let $databases= $workers; +# workers vary db:s do not +let $databases= 16; + +connection master; +source extra/rpl_tests/rpl_parallel_benchmark_load.test; + +connection slave; +--disable_query_log +set @@global.mts_slave_parallel_workers= @save.mts_slave_parallel_workers; +--enable_result_log + +--source include/rpl_end.inc --===============0492829709== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/andrei.elkin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: andrei.elkin@stripped # target_branch: file:///home/andrei/MySQL/BZR/2a-23May/WL/mysql-next-\ # mr-wl5569/ # testament_sha1: 9dab83b16ea5e8444ab36a05a5daf45e206b50b1 # timestamp: 2011-04-02 14:32:12 +0300 # source_branch: file:///home/andrei/MySQL/BZR/2a-23May/mysql-trunk/ # base_revision_id: andrei.elkin@stripped\ # et1jkewtcojpukkw # # Begin bundle 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 --===============0492829709==--