背景
公司的业务更新,新部门需要用MySQL5.7版本。 本人之前也只是研究和测试过,并没有真的在线上投入使用过5.7版本,所以需要在服务器上进行一系列的压测,得到数据库服务器所能承载的压力。虽然之前曾经用过sysbench压测,但是在实际使用过程中还是遇到了一些问题。
首先,我压测的目的在于:在现有机器配置下,MySQL5.7所能承受的QPS、线程并发数、IOPS、TPS等基本特性的能力。
其次,我希望将压测的结果整理成直观的图形界面,方便查看。
在开始之前,我首先附上MySQL官方对于5.7版本的测试图例:
如上,官方测试的结果是 MySQL 5.7 在Point Select 查询测试中,测试成绩可以达到1600000 QPS, 是MySQL 5.6 的3倍多。
官方的测试环境如下:
- Intel(R) Xeon(R) CPU E7-8890 v3h
- 4 sockets x 18 cores-HT (144 CPU threads)
- 2.5 GHz, 512GB RAM
- Linux kernel 3.16
在我们的真实测试的结果可能会和官方的结果有比较大的差距,因为官方的服务器配置还是挺高的。
将压测结果绘图的方法
有些时候,我们需要将一些例如压测、数据统计等结果以图形的方式统计出来。下面简单的说一下我的方式,就是用最简单Execl了。
1. 收集需要绘制成图表的数据
2. 将数据填入Execl表格,纵向表示多种对比的测试模式、横向表示各个测试模式在不同条件下的测试结果值。
如上,将数据写入Execl后,将数据选中后,选择插入—推荐的图标,就会有很多形式的框图供你选择:
如上,就可以获得我们想要的图形结果了。
注: 如果对MySQL不是很了解,或者没有丰富的压测经验,有时候很难去把握压测的基准值和方法,这里附上一篇叶金荣老师的博客,可以来简单做一些参考:
http://imysql.cn/tag/压测
内容
不得不说,我在实际使用中遇到的第一个问题就是sysbench的安装。虽然网上有很多教程,但是中间总是会遇到一些库依赖关系难以轻易解决。虽然我们可以直接通过yum安装的形式很轻易的就安装sysbench,但是一般yum安装默认安装的是0.4版本的sysbench,此版本很多功能不太完善,比如不支持多表压测等。
因为解决过程因情况和环境而异,这里就不再多做阐述了,只是在这里特提醒自己遇到问题的时候要按部就班的去解决,尝试,戒骄戒躁。
压测服务器环境
注意:我们这里的数据库服务器是有硬件的RAID 缓存的,所以在测试的时候需要将此考虑进去。
根据上面的服务器环境,我们应该保证在压测过程中照顾到如下几点:
- 生成的压测数据至少需要大于我们设置的Innodb_buffer_pool_size,否则压测数据被缓存在内存中 。
- 每轮测试完成后,用下面的方法删除系统cache,释放swap(如果用到了swap的话),如果条件允许最好可以重启MySQL甚至OS。
1 2 3 |
$ sync // 将脏数据刷新到磁盘 $ echo 3 > /proc/sys/vm/drop_caches // 清除OS Cache $ swapoff -a && swapon -a |
压测使用参数
1 |
./sysbench --test=tests/db/oltp.lua --db-driver=mysql --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password="xxxxxxx" --mysql-db=sbtest --oltp-table-size=50000000 --oltp_tables_count=5 --rand-init=on --num-threads=8 --oltp-read-only=off --report-interval=10 --rand-type=uniform --max-time=600 --percentile=99 run > xinyu8.log & |
上面是我在压测运行期间的使用参数,具体含义可以参考官方文档。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
--db-driver=mysql //压测的目标数据库类型 --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password="xxxxxxx" --mysql-db=sbtest //压测的目标数据库 --oltp-table-size=50000000 //压测目标数据表的行数 --oltp_tables_count=5 // 压测目标表的个数 --rand-init=on // 表示每个测试表都是用随机数据来填充的 --num-threads=8 //压测时的并发线程数 --oltp-read-only=off //是否进行只读压测 --report-interval=10 //每隔10s进行一次报告 --rand-type=uniform // 表示随机类型为固定模式,其他几个可选随机模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累托) --max-time=600 //表示最大执行时长 --percentile=99 // 表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值 |
压测的粒度以及影响压测的MySQL主要参数
压测结果
1. 只读测试的结果,与官方给出的结果差了一个数量级! 当然官方的配置比我的好些,不过我觉得还是我自己的测试过程有误差。
2. 读写测试的结果,此测试结果与实际使用场景误差可能较大,因为我们有接近1G的Raid Cache缓存。并且压测数据量太小。
3. TPS 每秒事务数的压测结果,单个事务中可能包含增、删、改、查等操作,比例为 select:update_key:update_non_key:delete:insert = 14:1:1:1:1
4. 混合读写的平均响应时间的结果,响应时间纵坐标的单位为ms。因为测试对应的只有5张表,所以热点数据比较集中,真实场景的响应时间应该会低于上图。