background
Test mysql5.7 mysql8.0 respectively and write, read-only, write-only property (tps, qps) when a mode different concurrency
premise
- Use test version mysql5.7.22 and mysql8.0.15
- sysbench before testing before the restart mysql service, and empty the cache os (to avoid cache hit when several tests)
- Mysql5.7 and mysql8.0 be tested each time the test is a new generation of test data and then
- Every ensure consistent mysql5.7 and mysql8.0 configuration parameters test
surroundings
myql5.7.22
5.7.22-log
innodb_buffer_pool_size 128M
innodb_log_buffer_size 64M
innodb_log_file_size 48M
binlog_format ROW
log_bin ON
transaction_isolation REPEATABLE-READ
mysql8.0.15
8.0.15
innodb_buffer_pool_size 128M
innodb_log_buffer_size 64M
innodb_log_file_size 48M
binlog_format ROW
log_bin ON
transaction_isolation REPEATABLE-READ
sysbench
sysbench -V
sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3)
test
- Performance under different persistence strategy (binlog, redo log persistence) mysql5.7 and mysql8.0 in read-write mode, read-only, write-only mode (oltp_read_write, oltp_read_only, oltp_write_only) under
- sysbench test time is 60s, the test number 20 in Table
- Were tested in dual mode 1 (safety), and 02 mode (high performance)
parameter | Optional value | meaning |
---|---|---|
sync_binlog | 0 | binlog brush plate persistence done by the operating system, good performance, there is the risk of loss binlog |
sync_binlog | 1 | After the transaction commits brush plate persistence, safest |
sync_binlog | N | Brush plate persistence after each transaction commits N |
innodb_flush_log_at_trx_commit | 0 | Per second write redo log and brush plate persistence |
innodb_flush_log_at_trx_commit | 1 | After the transaction commits write redo log and brush plate persistence, safest |
innodb_flush_log_at_trx_commit | 2 | After the transaction commits write redo log, brush persistent disk per second |
Dual mode 1
SHOW GLOBAL VARIABLES WHERE Variable_name IN('sync_binlog','innodb_flush_log_at_trx_commit');
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1 |
| sync_binlog | 1 |
+--------------------------------+-------+
mysql5.7 and mysql8.0 performance in read mode
- 1 dual configuration, read-write mode, mysql5.7.22 and mysql8.0.15 tps, qps similar performance, mysql8.0.15-threaded at 120, there was a decrease jitter performance
mysql5.7 and mysql8.0 performance in read-only mode
- 1 double configuration, in read-only mode, mysql5.7.22 of tps, qps about 1/3 better than mysql8.0.15; after increasing the number of concurrent threads, tps, qps and not with the increase, but there has been a downward trend
mysql5.7 and mysql8.0 performance in write-only mode
- 1 double configuration, write-only mode, with the rise in the number of concurrent performance mysql5.7.22 better than mysql8.0.15 about 1/4
The mode 02
SHOW GLOBAL VARIABLES WHERE Variable_name IN('sync_binlog','innodb_flush_log_at_trx_commit');
+--------------------------------+-------+
| Variable_name | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2 |
| sync_binlog | 0 |
+--------------------------------+-------+
mysql5.7 and mysql8.0 performance in read mode
- Disposed at 02, read-write mode, when the number of concurrent low, mysql5.7.22 performance is better than mysql8.0.15; when a relatively high number of concurrent, mysql8.0.15 performance is better than mysql5.7.22; for concurrent threads 80 above, performance begins decline
mysql5.7 and mysql8.0 performance in read-only mode
- Disposed at 02, read-only mode, mysql5.7.22 mysql8.0.15 better performance than about 1/3; the number of concurrent with the increase, there is no increase in performance, but tends to decrease
mysql5.7 and mysql8.0 performance in write-only mode
- 02 configuration, write-only mode, mysql5.7.22 of tps shake relatively large; mysql5.7.22 of about 1/3 qps better than mysql8.0.15
in conclusion
- Overall, mysql5.7.22 in read-write mode, read-only, write-only mode is superior performance under the mysql8.0.15
- With the increase in the number of parallel, performance does not also increase, but also declined
- The test results are carried out under the configuration is low, does not mean absolute
Note
sysbench need to set --db-ps-mode = disable disable precompiled statements, or thread a long time concurrent test will be reported the following error
FATAL: mysql_stmt_prepare () failed The
FATAL: MySQL error: 1461 "of Can not the Create More Within last max_prepared_stmt_count statements ( value Current: of 16382) "
FATAL: the mysql_stmt_prepare () failed
FATAL: the MySQL error: 1461" Can Not Create More max_prepared_stmt_count Within last statements (Current value: of 16382) "
FATAL: thread_init' function failed: /usr/local/share/sysbench/oltp_common.lua:288: SQL API error FATAL: mysql_stmt_prepare() failed FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)" FATAL:
thread_init 'function failed: / usr / local / Share / SysBench / oltp_common.lua: 288: SQL API error
FATAL: mysql_stmt_prepare () failed The
Using a script
cat sysbench_test_mysql5.7_8.0_tps_qps.sh
#!/bin/bash
#用于sysbench 测试在读写模式、只读模式、只写模式下 mysql5.7和mysql8.0 的tps,qps
#nohup bash $0 >/tmp/sysbench_test 2>& 1 &
#
user=admin
passwd=admin
ports="8015 57222"
host=127.0.0.1
sysbench_test_mode="oltp_read_write oltp_read_only oltp_write_only"
sysbench_test_info_path=/tmp/sysbench-test
function red_echo () {
local what="$*"
echo -e "$(date +%F-%T) \e[1;31m ${what} \e[0m"
}
function check_las_comm(){
if [ $1 -ne 0 ];then
red_echo $2
exit 1
fi
}
function restart_mysqld(){
service mysqld${1} restart
sleep 2
}
function purge_binlog(){
port=$1
mysql -u$user -p$passwd -P$port -h$host<<EOF
purge binary logs before now();
EOF
}
function clean_os_cache(){
echo 3 > /proc/sys/vm/drop_caches
}
function sysbench_with_diff_thread(){
thread_num=$1
port=$2
order=$3
test_mode=$4
sysbench /usr/local/share/sysbench/${test_mode}.lua --mysql_storage_engine=innodb --table-size=100000 --tables=20 --mysql-db=test_1 --mysql-user=$user --mysql-password=$passwd --mysql-port=$port --mysql-host=$host --threads=$thread_num --time=60 --report-interval=2 --db-ps-mode=disable --events=0 --db-driver=mysql $order
}
function main(){
for test_mode in $sysbench_test_mode;do
for port in $ports;do
for thread_num in {5,10,20,30,40,80,120,200};do
restart_mysqld "$port"
check_las_comm "$?" "restart mysqld${port} failed "
clean_os_cache
purge_binlog "$port"
red_echo "sysbench $thread_num threads cleanup mysqld${port}"
sysbench_with_diff_thread "$thread_num" "$port" "cleanup" "$test_mode">/dev/null
red_echo "sysbench $thread_num threads prepare mysqld${port}"
sysbench_with_diff_thread "$thread_num" "$port" "prepare" "$test_mode">/dev/null
mkdir -p $sysbench_test_info_path
red_echo "sysbench $thread_num threads run mysqld${port} $test_mode"
sysbench_with_diff_thread "$thread_num" "$port" "run" "$test_mode" > $sysbench_test_info_path/${test_mode}_${thread_num}_$port
# service mysqld{port} stop
done
done
done
}
main