-
バックグラウンド
-
前提
-
周囲
-
テスト
-
ダブル1モードの場合
-
02モード
- 結論として
バックグラウンド
読み取り/書き込み、読み取り専用、および書き込み専用モード(tps、qps)で、異なる同時実行性の下でmysql5.7とmysql8.0のパフォーマンスをテストします。
前提
-
テストバージョンはmysql5.7.22およびmysql8.0.15です。
-
sysbenchテストの前に、mysqlサービスを再起動し、osキャッシュをクリアします(複数のテスト中にキャッシュにヒットしないようにするため)
-
テストが実行されるたびに、mysql5.7およびmysql8.0のテストの前に新しいテストデータが生成されます
-
mysql5.7とmysql8.0の構成パラメーターが各テスト中に一貫していることを確認してください
- 328ページのMySQLPDFドキュメントを整理しました
周囲
Machine cat / etc / redhat-release | xargs echo'version '&& dmidecode -s system-product-name | xargs echo'仮想化されているかどうか '&& cat / proc / cpuinfo | grep "processor" | wc -l | xargs echo' cpuコアのバージョン数CentOSLinuxリリース7.5.1804(コア)KVMcpuコア番号4を仮想化するかどうか
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)
テスト
-
異なる永続化戦略(binlog、REDOログ永続性)での読み取り/書き込みモード、読み取り専用モード、および書き込み専用モード(oltp_read_write、oltp_read_only、oltp_write_only)でのmysql5.7およびmysql8.0のパフォーマンス
-
sysbenchのテスト時間は60秒で、テストされるテーブルの数は20です。
- テストは、デュアル1モード(安全)と0 2モード(高性能)で実行されました。
ダブル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およびmysql8.0のパフォーマンス
- ダブル1構成、読み取り/書き込みモードでは、mysql5.7.22とmysql8.0.15のtpsおよびqpsのパフォーマンスはほぼ同じです。mysql8.0.15に120の同時スレッドがある場合、パフォーマンスは低下します。
読み取り専用モードでのmysql5.7およびmysql8.0のパフォーマンス
- ダブル1構成、読み取り専用モードでは、mysql5.7.22のtpsとqpsはmysql8.0.15よりも約1/3優れています。同時スレッドの数が増加した後、tpsとqpsは増加しませんが、減少傾向を示します。
書き込み専用モードでのmysql5.7およびmysql8.0のパフォーマンス
- 書き込み専用モードでのダブル1構成では、同時実行数が増えるため、mysql5.7.22のパフォーマンスはmysql8.0.15よりも約1/4優れています。
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およびmysql8.0のパフォーマンス
- 0 2構成、読み取り/書き込みモードで、同時実行数が少ない場合、mysql5.7.22のパフォーマンスはmysql8.0.15よりも優れています。同時実行数が比較的多い場合、mysql8.0.15のパフォーマンスはmysql5.7.22よりも優れています。同時スレッド数が80を超える場合、パフォーマンスが開始されます。低下
読み取り専用モードでのmysql5.7およびmysql8.0のパフォーマンス
- 0 2構成、読み取り専用モードでは、mysql5.7.22のパフォーマンスはmysql8.0.15よりも約1/3優れています。同時実行数が増えると、パフォーマンスは向上しませんが、低下傾向にあります。
書き込み専用モードでのmysql5.7およびmysql8.0のパフォーマンス
- 0 2構成、書き込み専用モードでは、mysql5.7.22のtpsジッターは比較的大きく、mysql5.7.22のqpsはmysql8.0.15よりも約1/3優れています。
結論として
-
全体として、mysql5.7.22は、読み取り/書き込みモード、読み取り専用モード、および書き込み専用モードでmysql8.0.15よりも優れています。
-
パラレルの数が増えると、パフォーマンスは向上せず、低下します
- このテストの結果は、絶対的な意味ではない非常に低い構成で実行されました。
注意sysbench需要設定--db-ps-mode = disable禁用预编译语句、不然到ρ現在の値:16382) "致命的:mysql_stmt_prepare()が失敗しました致命的:MySQLエラー:1461" max_prepared_stmt_countステートメントを超えて作成できません(現在の値:16382) "致命的:thread_init '関数が失敗しました:/ usr / local / share / sysbench / oltp_common.lua:288:SQL APIエラーFATAL:mysql_stmt_prepare()が失敗しましたFATAL:MySQLエラー:1461 "max_prepared_stmt_countステートメント(現在の値:16382)を超えて作成できません" FATAL:thread_init '関数が失敗しました:/ usr / local / share /sysbench/oltp_common.lua:288:SQL APIエラー致命的:mysql_stmt_prepare()が失敗しました
スクリプトを使用する
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