mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
06d874ba90
5.6 files
478 lines
12 KiB
Text
478 lines
12 KiB
Text
# Tests for PERFORMANCE_SCHEMA
|
|
|
|
--source include/not_embedded.inc
|
|
--source include/have_perfschema.inc
|
|
|
|
#
|
|
# Important note:
|
|
# this test is extremely sensitive to how threads are running inside the server,
|
|
# so it has it's own -master.opt file, to enforce it runs alone in mysqld
|
|
#
|
|
|
|
# Setup
|
|
|
|
flush status;
|
|
flush tables;
|
|
|
|
# Remove to debug
|
|
--disable_result_log
|
|
|
|
# Make sure the internal server caches are all full
|
|
select * from performance_schema.mutex_instances;
|
|
select * from performance_schema.rwlock_instances;
|
|
select * from performance_schema.cond_instances;
|
|
select * from performance_schema.file_instances;
|
|
|
|
select count(*) from performance_schema.mutex_instances
|
|
into @v0_mutex_instances;
|
|
|
|
select count(*) from performance_schema.rwlock_instances
|
|
into @v0_rwlock_instances;
|
|
|
|
select count(*) from performance_schema.cond_instances
|
|
into @v0_cond_instances;
|
|
|
|
select count(*) from performance_schema.file_instances
|
|
into @v0_file_instances;
|
|
|
|
select count(*) from performance_schema.mutex_instances
|
|
into @v1_mutex_instances;
|
|
|
|
select count(*) from performance_schema.rwlock_instances
|
|
into @v1_rwlock_instances;
|
|
|
|
select count(*) from performance_schema.cond_instances
|
|
into @v1_cond_instances;
|
|
|
|
select count(*) from performance_schema.file_instances
|
|
into @v1_file_instances;
|
|
|
|
select count(name), name from performance_schema.mutex_instances
|
|
group by name;
|
|
|
|
select count(name), name from performance_schema.rwlock_instances
|
|
group by name;
|
|
|
|
select count(name), name from performance_schema.cond_instances
|
|
group by name;
|
|
|
|
select count(event_name), event_name from performance_schema.file_instances
|
|
group by event_name;
|
|
|
|
begin;
|
|
create table test.t1(a int) engine = innodb;
|
|
create table test.t2(a int) engine = innodb;
|
|
create table test.t3(a int) engine = innodb;
|
|
create table test.t4(a int) engine = innodb;
|
|
create table test.t5(a int) engine = innodb;
|
|
create table test.t6(a int) engine = innodb;
|
|
create table test.t7(a int) engine = innodb;
|
|
create table test.t8(a int) engine = innodb;
|
|
create table test.t9(a int) engine = innodb;
|
|
create table test.t10(a int) engine = innodb;
|
|
|
|
# Make sure there is at least 1 table handle,
|
|
# to fully initialize the storage engine share if needed.
|
|
select * from test.t1;
|
|
select * from test.t2;
|
|
select * from test.t3;
|
|
select * from test.t4;
|
|
select * from test.t5;
|
|
select * from test.t6;
|
|
select * from test.t7;
|
|
select * from test.t8;
|
|
select * from test.t9;
|
|
select * from test.t10;
|
|
commit;
|
|
|
|
select count(*) from performance_schema.mutex_instances
|
|
into @v2_mutex_instances;
|
|
|
|
select count(*) from performance_schema.rwlock_instances
|
|
into @v2_rwlock_instances;
|
|
|
|
select count(*) from performance_schema.cond_instances
|
|
into @v2_cond_instances;
|
|
|
|
select count(*) from performance_schema.file_instances
|
|
into @v2_file_instances;
|
|
|
|
select count(name), name from performance_schema.mutex_instances
|
|
group by name;
|
|
|
|
select count(name), name from performance_schema.rwlock_instances
|
|
group by name;
|
|
|
|
select count(name), name from performance_schema.cond_instances
|
|
group by name;
|
|
|
|
select count(event_name), event_name from performance_schema.file_instances
|
|
group by event_name;
|
|
|
|
select @v2_mutex_instances, @v1_mutex_instances, @v0_mutex_instances;
|
|
select @v2_rwlock_instances, @v1_rwlock_instances, @v0_rwlock_instances;
|
|
select @v2_cond_instances, @v1_cond_instances, @v0_cond_instances;
|
|
select @v2_file_instances, @v1_file_instances, @v0_file_instances;
|
|
|
|
select round((@v2_mutex_instances - @v1_mutex_instances) / 10)
|
|
into @mutex_per_share;
|
|
select round((@v2_rwlock_instances - @v1_rwlock_instances) / 10)
|
|
into @rwlock_per_share;
|
|
select round((@v2_cond_instances - @v1_cond_instances) / 10)
|
|
into @cond_per_share;
|
|
select round((@v2_file_instances - @v1_file_instances) / 10)
|
|
into @file_per_share;
|
|
|
|
connect (con1, localhost, root,,);
|
|
select "con1 connected";
|
|
|
|
connect (con2, localhost, root,,);
|
|
select "con2 connected";
|
|
|
|
connect (con3, localhost, root,,);
|
|
select "con3 connected";
|
|
|
|
connect (con4, localhost, root,,);
|
|
select "con4 connected";
|
|
|
|
connect (con5, localhost, root,,);
|
|
select "con5 connected";
|
|
|
|
connect (con6, localhost, root,,);
|
|
select "con6 connected";
|
|
|
|
connect (con7, localhost, root,,);
|
|
select "con7 connected";
|
|
|
|
connect (con8, localhost, root,,);
|
|
select "con8 connected";
|
|
|
|
connect (con9, localhost, root,,);
|
|
select "con9 connected";
|
|
|
|
connect (con10, localhost, root,,);
|
|
select "con10 connected";
|
|
|
|
connection default;
|
|
|
|
select count(*) from performance_schema.mutex_instances
|
|
into @v3_mutex_instances;
|
|
|
|
select count(*) from performance_schema.rwlock_instances
|
|
into @v3_rwlock_instances;
|
|
|
|
select count(*) from performance_schema.cond_instances
|
|
into @v3_cond_instances;
|
|
|
|
select count(*) from performance_schema.file_instances
|
|
into @v3_file_instances;
|
|
|
|
select count(name), name from performance_schema.mutex_instances
|
|
group by name;
|
|
|
|
select count(name), name from performance_schema.rwlock_instances
|
|
group by name;
|
|
|
|
select count(name), name from performance_schema.cond_instances
|
|
group by name;
|
|
|
|
select count(event_name), event_name from performance_schema.file_instances
|
|
group by event_name;
|
|
|
|
select @v3_mutex_instances, @v2_mutex_instances;
|
|
select @v3_rwlock_instances, @v2_rwlock_instances;
|
|
select @v3_cond_instances, @v2_cond_instances;
|
|
select @v3_file_instances, @v2_file_instances;
|
|
|
|
select round((@v3_mutex_instances - @v2_mutex_instances) / 10)
|
|
into @mutex_per_con;
|
|
select round((@v3_rwlock_instances - @v2_rwlock_instances) / 10)
|
|
into @rwlock_per_con;
|
|
select round((@v3_cond_instances - @v2_cond_instances) / 10)
|
|
into @cond_per_con;
|
|
select round((@v3_file_instances - @v2_file_instances) / 10)
|
|
into @file_per_con;
|
|
|
|
--connection con1
|
|
|
|
lock table test.t1 write, test.t2 write, test.t3 write, test.t4 write,
|
|
test.t5 write, test.t6 write, test.t7 write, test.t8 write, test.t9 write,
|
|
test.t10 write;
|
|
|
|
--send
|
|
select t1.*, t2.*, t3.*, t4.*, t5.*, t6.*, t7.*, t8.*, t9.*, t10.*
|
|
from t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
|
|
|
|
--connection con2
|
|
|
|
--send
|
|
select t1.*, t2.*, t3.*, t4.*, t5.*, t6.*, t7.*, t8.*, t9.*, t10.*
|
|
from t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
|
|
|
|
--connection con3
|
|
|
|
--send
|
|
select t1.*, t2.*, t3.*, t4.*, t5.*, t6.*, t7.*, t8.*, t9.*, t10.*
|
|
from t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
|
|
|
|
--connection con4
|
|
|
|
--send
|
|
select t1.*, t2.*, t3.*, t4.*, t5.*, t6.*, t7.*, t8.*, t9.*, t10.*
|
|
from t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
|
|
|
|
--connection con5
|
|
|
|
--send
|
|
select t1.*, t2.*, t3.*, t4.*, t5.*, t6.*, t7.*, t8.*, t9.*, t10.*
|
|
from t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
|
|
|
|
--connection con6
|
|
|
|
--send
|
|
select t1.*, t2.*, t3.*, t4.*, t5.*, t6.*, t7.*, t8.*, t9.*, t10.*
|
|
from t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
|
|
|
|
--connection con7
|
|
|
|
--send
|
|
select t1.*, t2.*, t3.*, t4.*, t5.*, t6.*, t7.*, t8.*, t9.*, t10.*
|
|
from t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
|
|
|
|
--connection con8
|
|
|
|
--send
|
|
select t1.*, t2.*, t3.*, t4.*, t5.*, t6.*, t7.*, t8.*, t9.*, t10.*
|
|
from t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
|
|
|
|
--connection con9
|
|
|
|
--send
|
|
select t1.*, t2.*, t3.*, t4.*, t5.*, t6.*, t7.*, t8.*, t9.*, t10.*
|
|
from t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
|
|
|
|
--connection con10
|
|
|
|
--send
|
|
select t1.*, t2.*, t3.*, t4.*, t5.*, t6.*, t7.*, t8.*, t9.*, t10.*
|
|
from t1, t2, t3, t4, t5, t6, t7, t8, t9, t10;
|
|
|
|
connection default;
|
|
|
|
select count(*) from performance_schema.mutex_instances
|
|
into @v4_mutex_instances;
|
|
|
|
select count(*) from performance_schema.rwlock_instances
|
|
into @v4_rwlock_instances;
|
|
|
|
select count(*) from performance_schema.cond_instances
|
|
into @v4_cond_instances;
|
|
|
|
select count(*) from performance_schema.file_instances
|
|
into @v4_file_instances;
|
|
|
|
select count(name), name from performance_schema.mutex_instances
|
|
group by name;
|
|
|
|
select count(name), name from performance_schema.rwlock_instances
|
|
group by name;
|
|
|
|
select count(name), name from performance_schema.cond_instances
|
|
group by name;
|
|
|
|
select count(event_name), event_name from performance_schema.file_instances
|
|
group by event_name;
|
|
|
|
select @v4_mutex_instances, @v3_mutex_instances;
|
|
select @v4_rwlock_instances, @v3_rwlock_instances;
|
|
select @v4_cond_instances, @v3_cond_instances;
|
|
select @v4_file_instances, @v3_file_instances;
|
|
|
|
select round((@v4_mutex_instances - @v3_mutex_instances) / 10)
|
|
into @mutex_per_handle;
|
|
select round((@v4_rwlock_instances - @v3_rwlock_instances) / 10)
|
|
into @rwlock_per_handle;
|
|
select round((@v4_cond_instances - @v3_cond_instances) / 10)
|
|
into @cond_per_handle;
|
|
select round((@v4_file_instances - @v3_file_instances) / 10)
|
|
into @file_per_handle;
|
|
|
|
--connection con1
|
|
--reap
|
|
|
|
unlock tables;
|
|
|
|
--connection con2
|
|
--reap
|
|
|
|
--connection con3
|
|
--reap
|
|
|
|
--connection con4
|
|
--reap
|
|
|
|
--connection con5
|
|
--reap
|
|
|
|
--connection con6
|
|
--reap
|
|
|
|
--connection con7
|
|
--reap
|
|
|
|
--connection con8
|
|
--reap
|
|
|
|
--connection con9
|
|
--reap
|
|
|
|
--connection con10
|
|
--reap
|
|
|
|
--disconnect con1
|
|
--disconnect con2
|
|
--disconnect con3
|
|
--disconnect con4
|
|
--disconnect con5
|
|
--disconnect con6
|
|
--disconnect con7
|
|
--disconnect con8
|
|
--disconnect con9
|
|
--disconnect con10
|
|
|
|
--connection default
|
|
|
|
drop table test.t1;
|
|
drop table test.t2;
|
|
drop table test.t3;
|
|
drop table test.t4;
|
|
drop table test.t5;
|
|
drop table test.t6;
|
|
drop table test.t7;
|
|
drop table test.t8;
|
|
drop table test.t9;
|
|
drop table test.t10;
|
|
|
|
--enable_result_log
|
|
|
|
#
|
|
# This test must have *_lost = 0,
|
|
# otherwise the measurement is just wrong.
|
|
#
|
|
|
|
show status like "performance_schema%";
|
|
|
|
#
|
|
# Expecting 2:
|
|
# - wait/synch/mutex/sql/MDL_wait::LOCK_wait_status
|
|
# - wait/synch/mutex/sql/TABLE_SHARE::LOCK_ha_data
|
|
# plus mutexes used inside the storage engine
|
|
# This is very storage engine dependent
|
|
# For innodb:
|
|
# - wait/synch/mutex/innodb/autoinc_mutex
|
|
# - wait/synch/mutex/innodb/os_mutex
|
|
# Note that depending on the platform,
|
|
# and the version of the compiler used,
|
|
# code in the server may use either native platform atomics
|
|
# or a mutex.
|
|
# Note also that in DEBUG builds, code uses more mutexes.
|
|
# Because of all these parameters,
|
|
# this test is disabled, as predicting an exact number is difficult.
|
|
#
|
|
# commented: select @mutex_per_share <= 5;
|
|
|
|
#
|
|
# Expecting 1:
|
|
# - wait/synch/rwlock/sql/MDL_lock::rwlock
|
|
# plus rwlocks used inside the storage engine
|
|
# This is very storage engine dependent
|
|
#
|
|
select @rwlock_per_share <= 3;
|
|
|
|
#
|
|
# Expecting 0:
|
|
#
|
|
select @cond_per_share;
|
|
|
|
#
|
|
# Expecting 1:
|
|
# - wait/io/file/sql/FRM
|
|
# plus files used inside the storage engine
|
|
# This is very storage engine dependent
|
|
#
|
|
select @file_per_share <= 3;
|
|
|
|
#
|
|
# Expecting 3:
|
|
# - wait/synch/mutex/mysys/my_thread_var::mutex
|
|
# - wait/synch/mutex/mysys/THR_LOCK::mutex
|
|
# - wait/synch/mutex/sql/THD::LOCK_thd_data
|
|
#
|
|
select @mutex_per_con;
|
|
|
|
#
|
|
# Expecting 1:
|
|
# - wait/synch/rwlock/sql/MDL_context::LOCK_waiting_for
|
|
#
|
|
select @rwlock_per_con;
|
|
|
|
#
|
|
# Expecting 2:
|
|
# - wait/synch/cond/mysys/my_thread_var::suspend
|
|
# - wait/synch/cond/sql/MDL_context::COND_wait_status
|
|
#
|
|
select @cond_per_con;
|
|
|
|
#
|
|
# Expecting 0:
|
|
#
|
|
select @file_per_con;
|
|
|
|
#
|
|
# Expecting 0:
|
|
#
|
|
select @mutex_per_handle;
|
|
|
|
#
|
|
# Expecting 0:
|
|
#
|
|
select @rwlock_per_handle;
|
|
|
|
#
|
|
# Expecting 0:
|
|
#
|
|
select @cond_per_handle;
|
|
|
|
#
|
|
# Expecting 0:
|
|
#
|
|
select @file_per_handle;
|
|
|
|
#
|
|
# IMPORTANT NOTE:
|
|
# when any measurement here changes, the heuristics
|
|
# in storage/perfschema/pfs_autosize.cc need to be updated.
|
|
# Note that this in turns will lead to different estimations for automated
|
|
# sizing, and imply to update the results for sizing_*.
|
|
#
|
|
|
|
# commented: (@mutex_per_share <= 5)
|
|
# Mutexes are not instrumented by default,
|
|
# not enforcing mutex estimates
|
|
|
|
select if(
|
|
(@rwlock_per_share <= 3)
|
|
AND (@cond_per_share = 0)
|
|
AND (@file_per_share <= 3)
|
|
AND (@mutex_per_con = 3)
|
|
AND (@rwlock_per_con = 1)
|
|
AND (@cond_per_con = 2)
|
|
AND (@file_per_con = 0)
|
|
AND (@mutex_per_handle = 0)
|
|
AND (@rwlock_per_handle = 0)
|
|
AND (@cond_per_handle = 0)
|
|
AND (@file_per_handle = 0),
|
|
"OK: heuristics are up to date",
|
|
"FAILED: heuristics need to be updated")
|
|
as status;
|
|
|