sysbench 1.1.0 (using bundled LuaJIT 2.1.0-beta3)
测试
- 在不同的持久化策略下(binlog, redo log持久化)mysql5.7和mysql8.0 在读写模式、只读模式、只写模式(oltp_read_write,oltp_read_only,oltp_write_only)下的性能表现
- sysbench 测试时间为60s,测试的表数量为20
- 测试分别在双1模式(安全性)和0 2模式(高性能)下进行
参数 | 可选值 | 含义 |
---|---|---|
sync_binlog | 0 | binlog刷盘持久化由操作系统完成,性能好,存在丢失binlog的风险 |
sync_binlog | 1 | 事务提交后刷盘持久化,最安全 |
sync_binlog | N | 在每N个事务提交后进行刷盘持久化 |
innodb_flush_log_at_trx_commit | 0 | 每秒钟写redo log 并刷盘持久化 |
innodb_flush_log_at_trx_commit | 1 | 事务提交后写redo log 并刷盘持久化,最安全 |
innodb_flush_log_at_trx_commit | 2 | 事务提交后写redo log , 每秒刷盘持久化 |
双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左右
0 2 模式下
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 禁用预编译语句,不然并发测试线程多时会报下面的错误
FATAL: mysql_stmt_prepare() failed
FATAL: MySQL error: 1461 “Can’t create more than max_prepared_stmt_count statements (current value: 16382)”
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 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
使用脚本
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=“
∗
"
e
c
h
o
−
e
"
*" echo -e "
∗"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
m
y
s
q
l
−
u
1 mysql -u
1mysql−uuser -p
p
a
s
s
w
d
−
P
passwd -P
passwd−Pport -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
s
y
s
b
e
n
c
h
/
u
s
r
/
l
o
c
a
l
/
s
h
a
r
e
/
s
y
s
b
e
n
c
h
/
4 sysbench /usr/local/share/sysbench/
4sysbench/usr/local/share/sysbench/{test_mode}.lua --mysql_storage_engine=innodb --table-size=100000 --tables=20 --mysql-db=test_1 --mysql-user=
u
s
e
r
−
−
m
y
s
q
l
−
p
a
s
s
w
o
r
d
=
user --mysql-password=
user−−mysql−password=passwd --mysql-port=
p
o
r
t
−
−
m
y
s
q
l
−
h
o
s
t
=
port --mysql-host=
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
p
o
r
t
s
;
d
o
f
o
r
t
h
r
e
a
d
n
u
m
i
n
5
,
10
,
20
,
30
,
40
,
80
,
120
,
200
;
d
o
r
e
s
t
a
r
t
m
y
s
q
l
d
"
ports;do for thread_num in {5,10,20,30,40,80,120,200};do restart_mysqld "
ports;doforthreadnumin5,10,20,30,40,80,120,200;dorestartmysqld"port"
check_las_comm "
?
"
"
r
e
s
t
a
r
t
m
y
s
q
l
d
?" "restart mysqld
?""restartmysqld{port} failed "
clean_os_cache
purge_binlog “$port”
red_echo “sysbench
t
h
r
e
a
d
n
u
m
t
h
r
e
a
d
s
c
l
e
a
n
u
p
m
y
s
q
l
d
thread_num threads cleanup mysqld
threadnumthreadscleanupmysqld{port}”
sysbench_with_diff_thread “
t
h
r
e
a
d
n
u
m
"
"
thread_num" "
threadnum""port” “cleanup” “$test_mode”>/dev/null
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!