MySQL基准测试及性能优化
mysql基准测试
什么是基准测试
数据库的基准测试是对数据库的性能指标进行定量的、可复现的、可对比的测试。
基准测试与压力测试
- 基准测试可以理解为针对系统的一种压力测试。但基准测试不关心业务逻辑,更加简单、直接、易于测试,数据可以由工具生成,不要求真实;
- 压力测试一般考虑业务逻辑(如购物车业务),要求真实的数据。
基准测试的作用
对于多数Web应用,整个系统的瓶颈在于数据库;原因很简单:Web应用中的其他因素,例如网络带宽、负载均衡节点、应用服务器(包括CPU、内存、硬盘灯、连接数等)、缓存,都很容易通过水平的扩展(俗称加机器)来实现性能的提高。而对于MySQL,由于数据一致性的要求,无法通过增加机器来分散向数据库写数据带来的压力;虽然可以通过前置缓存(Redis等)、读写分离、分库分表来减轻压力,但是与系统其它组件的水平扩展相比,受到了太多的限制。
而对数据库的基准测试的作用,就是分析在当前的配置下(包括硬件配置、OS、数据库设置等),数据库的性能表现,从而找出MySQL的性能阈值,并根据实际系统的要求调整配置。
基准测试的指标
常见的数据库指标包括:
- TPS/QPS:衡量吞吐量。
- 响应时间:包括平均响应时间、最小响应时间、最大响应时间、时间百分比等,其中时间百分比参考意义较大,如前95%的请求的最大响应时间。。
- 并发量:同时处理的查询请求的数量。
基准测试的分类
对MySQL的基准测试,有如下两种思路:
针对整个系统的基准测试:通过http请求进行测试,如通过浏览器、APP或postman等测试工具。该方案的优点是能够更好的针对整个系统,测试结果更加准确;缺点是设计复杂实现困难。
只针对MySQL的基准测试:优点和缺点与针对整个系统的测试恰好相反。在针对MySQL进行基准测试时,一般使用专门的工具进行,例如mysqlslap、sysbench等。其中,sysbench比mysqlslap更通用、更强大,且更适合Innodb(因为模拟了许多Innodb的IO特性)
常见的MySQL压力测试工具
mysqlslap
Sysbench
tpcc-mysql
MySQL Benchmark Suite
MySQL super-smack
MyBench
mysqlslap(压测)
官方介绍:https://dev.mysql.com/doc/refman/5.7/en/mysqlslap.html
mysqlslap,mysqlslap是MySQL5.1.4之后自带的benchmark基准测试工具,该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。测试的过程默认生成一个mysqlslap的schema,生成测试表T1,查询和插入测试数据,mysqlslap库自动生成,如果已经存在则先删除。用–only-print来打印实际的测试过程,整个测试完成后不会在数据库中留下痕迹。
使用格式:
mysqlslap [options] |
常用参数[options]说明
# 自动生成测试表和测试数据,表示用mysqlslap工具自己生成的SQL脚本来测试并发压力 |
运行结果各项含义
# 运行所有语句的平均秒数 |
mysqslap示例
# 单线程测试 |
Sysbench(压测)
sysbench是跨平台的基准测试工具,支持多线程,支持多种数据库;主要包括以下几种测试
- cpu性能
- 磁盘io性能
- 调度程序性能
- 内存分配及传输速度
- POSIX线程性能
- 数据库性能(OLTP基准测试)
本文主要介绍对数据库性能的测试
安装Sysbench
# 下载并解压 |
安装时遇到的问题
查看版本时报错
sysbench: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory |
解决方法
# 查看动态链接库 |
ldconfig
ldconfig命令的用途主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表,为了让动态链接库为系统所共享,需运行动态链接库的管理命令ldconfig,此执行程序存放在/sbin目录下
ldconfig几个需要注意的地方:
- 往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf的,但是完了之后要调一下ldconfig,不然这个library会找不到。
- 在上面两个目录以外加东西的时候,一定要修改/etc/ld.so.conf,然后再调用ldconfig,不然也会找不到。比如安装了一个mysql到/usr/local/mysql,mysql有一大堆library在/usr/local/mysql/lib下面
- 如果想在这两个目录以外放lib,但是又不想在/etc/ld.so.conf中加东西(或者是没有权限加东西)。那也可以,就是export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。
- ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。
- 总之,就是不管做了什么关于library的变动后,最好都ldconfig一下,不然会出现一些意想不到的结果。不会花太多的时间,但是会省很多的事。
- 再有,诸如libdb-4.3.so文件头中是会含有库名相关的信息的(即含“libdb-4.3.so”,可用strings命令查看),因此仅通过修改文件名以冒充某已被识别的库(如libdb-4.8.so)是行不通的。为此可在编译库的Makefile中直接修改配置信息,指定特别的库名。
执行./configure报错:cannot find -lmysqlclient_r
解决方法
# 安装mysql-devel |
sysbench语法
执行sysbench –help,可以看到sysbench的详细使用方法。sysbench的基本语法如下:
sysbench [options]… [testname] [command]
command是sysbench要执行的命令,包括prepare、run和cleanup,顾名思义,prepare是为测试提前准备数据,run是执行正式的测试,cleanup是在测试完成后对数据库进行清理。
testname指定了要进行的测试,在老版本的sysbench中,可以通过--test
参数指定测试的脚本;而在新版本中,--test
参数已经声明为废弃,可以不使用–test,而是直接指定脚本。
# 如以下两种写法效果是一样的 |
测试时使用的脚本为lua脚本,可以使用sysbench自带脚本,也可以自己开发。对于大多数应用,使用sysbench自带的脚本就足够了。不同版本的sysbench中,lua脚本的位置可能不同可以使用locate进行搜索
# 安装locate工具 |
option 是sysbench的参数,一下是比较常用的参数
# mysql连接参数 |
sysbench使用注意
- 尽量不要在MySQL服务器运行的机器上进行测试,一方面可能无法体现网络(哪怕是局域网)的影响,另一方面,sysbench的运行(尤其是设置的并发数较高时)会影响MySQL服务器的表现。
- 可以逐步增加客户端的并发连接数(–thread参数),观察在连接数不同情况下,MySQL服务器的表现;如分别设置为10,20,50,100等。
- 一般执行模式选择complex即可,如果需要特别测试服务器只读性能,或不使用事务时的性能,可以选择simple模式或nontrx模式。
- 如果连续进行多次测试,注意确保之前测试的数据已经被清理干净。
sysbench测试mysql TPS/QPS
# 创建用于测试的数据库 |
sysbench测试mysql脚本
# mysqlpressure.sh |
sysbench解读测试报告
SQL statistics: |
其中mysql测试主要关注 :
- queries:查询总数及qps
- transactions:事务总数及tps
- Latency-95th percentile:前95%的请求的最大响应时间
FIO(磁盘压测工具)
服务器资源监控工具nmon
nmon 是 Nigel’s performance Monitor for Linux(nigel 的 Linux 性能监控器)的英文缩写;它有三种运行模式,分别是:实时屏幕模式、数据收集模式、定时计划执行模式;这款工具运行时,本身资源消耗很小,而且监控的资源种类比较多,使用非常简单,所以,在没有搭建专业的监控平台时,很多人都会想到用它来监控服务器
nmon安装与使用
# 查看centos的发行版本 |
实时屏幕模式
直接执行nmon,开启nmon的实时屏幕展示模式
参数说明
c # 带条形图的 CPU 利用率统计信息(CPU 核心线程) |
数据收集模式
执行nmon -f,开启nmon的数据收集模式,该命令不在后面跟参数,则默认为 -s300 -c288
注:直接执行这个命令,后面不带参数,该命令将在后台持续执行24小时,手机24小时资源使用情况
参数说明
-f # 标准输出到表格文件,默认 -s300 -c288 ,为 24 小时,输出文件格式为:hostname_YMD_HHMM.nmon |
常用参数 -f -s -c -m -p
常用案例
# 监控服务器,将结果标准输出,命令将后台持续运行24小时 |
定时计划执行模式
nmon -x 开启定时计划执行模式,若后面不添加任何参数,默认为-s900 -c96 即每隔900秒获取一次数据,总共执行96次,也就是24小时,收集的数据结果将采用标准输出
使用-X参数,默认为-s30 -c120 即每隔30秒获取一次数据共执行120次,也就是1小时,收集的数据结果采用标准输出
-z 用root账户运行,收集1天数据,输出到/var/perf/tmp文件夹
查看结果
标准输出结果查看
nmon的标准输出结果文件为:主机名_年月日_时分。nmon是一种文本数据文件,可以用文本编辑器打开,但不便于阅读,可以使用nmon的analysis工具打开
- 本地电脑下载 nmon_analysis:
http://nmon.sourceforge.net/pmwiki.php?n=Site.Nmon-Analyser&utm_source=testingpai.com
解压刚刚下载的tar包
从Linux服务器上下载nmon标准输出文件到本地电脑
使用Excel打开刚刚解压的nmon analyser v**.xlsm文件,启用宏
- 点击 【Analyze nmon data】按钮,选择从服务器上下载的 nmon 文件,将会自动分析,生成一个 xlsx 的文件,保存,自动会用 Excel 打开,打开我们就能看到多个图表
如果生成的nmon标准输出文件过大,可以使用其他工具:如 nmonchar.tar
http://nmon.sourceforge.net/pmwiki.php?n=Site.Nmonchart&utm_source=testingpai.com
# 需要安装ksh |
生产环境 my.cnf 配置案例(未完待续)
配置文件生成工具参考链接:https://imysql.com/my_cnf_generator
计算mysql占用内存大小链接:http://www.mysqlcalculator.com
|