简介: 近期遇到一个问题,用户这边反馈实例压测tps和qps相加结果是要比iops最大值要大
问题复现分析:
环境准备:
Ecs规格:ecs.g6. xlarge(4C16G)
centos7.6
数据库规格:rds.mysql.s3.large(4C8G)
mysql 5.7
参数配置:
o sync_binlog=1、innodb_flush_log_at_trx_commit=1:确保每次提交的数据完整写入磁盘中。
o rpl_semi_sync_master_enabled=ON:开启数据库半同步模式,保证主备库数据的一致性。
o Performance_schema=ON:内存大于等于8 GB的实例规格默认开启Performance Schema
测试工具:SysBench 1.0.20
安装测试工具
在ECS实例执行如下命令安装SysBench。
yum install gcc gcc-c++ autoconf automake make libtool bzr mysql-devel git mysql
git clonehttps://github.com/akopytov/sysbench.git
##从Git中下载SysBench
cd sysbench
##打开SysBench目录
git checkout 1.0.20
##切换到SysBench 1.0.20版本
./autogen.sh
##运行autogen.sh
./configure --prefix=/usr --mandir=/usr/share/man
make
##编译
make install
1,构建数据
数据量:80*100000
sysbench --db-driver=mysql --mysql-host=rm-bp15ffqrv1s4d63bq.mysql.rds.aliyuncs.com --mysql-port=3306 --mysql-user=zt --mysql-password=Aliyun2021 --mysql-db=wjk --table_size=100000 --tables=80 --events=0 --time=120 oltp_read_write prepare
2、压测并发4个线程
TPS 500
IOPS 4000
3、压测并发8个线程
Tps 1100
Iops 3800
4、压测 并发80个线程
Tps 2100
Iops 860
5、压测 并发600个线程
Tps 2100
Iops 350
6、分析原因
设置了innodb_flush_log_at_trx_commit =1, 也就是每次事务提交前都要刷盘, 每次刷盘是把整个innodb_log_buffer都写入redo里面(包括其它事务), 所以并发增加后, 每次刷盘所包含的事务也就更多了(total次数减少), 数据量也大了(avg_written增大). 宏观来看就是写iops减少了. 那是不是并发越多性能越好呢, 肯定不是, 本次实验600并发的时候TPS已经开始降下来了, 连接本身占用的资源就多, 应该是个正态分布.
7、结论
并发数越多, IO利用率越高(iops越低). 主要是redo log的原因.