Mysql基准测试:
【什么是基准测试】:基准测试是一种测量和评估软件性能指标的活动,用于建立某个时刻的性能基准,
以便系统发生软硬件变化时重新进行基准测试
(针对系统设置的一种压力测试)
【基准测试】:直接,简单,易用,用于评估服务器的处理能力(简化的压力测试,不关心逻辑,和业务没有关系)
【压力测试】:对真实的业务进行测试,获得真实系统所能承受的压力
【基准测试的目的】:建立mysql性能的基准线
确定当前mysql服务器运行情况
模拟比当前系统更高的负载,以找出系统的扩展瓶颈
测试不同的硬件,软件和操作系统的配置
证明新的硬件设备是否配置正确
【如何进行基准测试】:
对整个系统进行基准测试,从系统入口进行测试
【优点】: 能够测试整个系统的性能,包括web服务器,缓存,数据库等
能反映出系统中各个组建接口间的性能问题,体现真实性能状况
【缺点】: 测试设计复杂,消耗时间长
-------------------------------------------
单独对某个组件(mysql)进行基准测试
【优点】: 测试设计简单,耗时短
【缺点】: 无法全面了解整个系统的性能基准线
【mysql基准测试的常见指标】
单位时间内所处理的事务数:TPS
单位时间内所处理的查询书:QPS
响应时间:衡量完成一个测试任务所花费的整体时间
【平均响应时间】,【最小响应时间】,【最大响应时间】,【各时间所占百分比】
并发量:同时处理查询请求的数量(正在工作中的并发的操作数或同时工作的数量,而不是多少连接的线程)
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
基准测试步骤:
【计划和设计基准测试】
【1.对整个系统还是一个组件,使用什么样的数据,时间,次数】
【2.准备基准测试及数据收集脚本。 收集信息(cpu使用率,IO,网络流量,状态与计数器信息等)】
【3.运行基准测试】
【4.保存及分析基准测试结果】
【基准测试中容易忽略的问题】
【1.使用生产环境的数据时只使用了部分数据】
【2.多用户场景中,只做了单用户测试(多线程测试)】
【3.单服务器测试分布式应用(使用相同架构测试)】
【反复执行同一查询】
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
基准测试工具:
【常用基准测试工具】
【mysqlslap】:mysql自带基准测试工具
特点: 可模拟服务器负载,并输出相关统计信息
可指定也可自动生成查询语句
常用参数:
mysqlslap
--auto-generate-sql:由系统自动生成sql脚本进行测试
--auto-generate-sql-add-autoincrement:在生成的表中增加自增id
--auto-generate-sql-load-type:指定测试中使用的查询类型
--auto-generate-sql-write-number:指定初始化数据时生成的数据量
--concurrency: 指定并发线程数量
--engine: 指定测试表的存储引擎,可用逗号分隔多个存储引擎
--no-drop: 指定不清理测试数据
--iterations: 指定测试运行的次数
--number-of-queries:指定每一个线程执行的查询数量
--debug-info: 指定输出额外的内存及cpu统计信息
--number-int-cols: 指定测试表中包含的int类型列的数量
--number-char-cols:指定测试表中包含的varchar类型列的数量
--create-schema: 指定执行测试数据库的名字
--query: 用于指定自定义的sql脚本
--only-print: 并不运行测试脚本,而是把生成的脚本打印出来
--auto-generate-sql, -a 自动生成测试表和数据,表示用mysqlslap工具自己生成的SQL脚本来测试并发压力。
--auto-generate-sql-load-type=type 测试语句的类型。代表要测试的环境是读操作还是写操作还是两者混合的。取值包括:read,key,write,update和mixed(默认)。
--auto-generate-sql-add-auto-increment 代表对生成的表自动添加auto_increment列,从5.1.18版本开始支持。
--number-char-cols=N, -x N 自动生成的测试表中包含多少个字符类型的列,默认1
--number-int-cols=N, -y N 自动生成的测试表中包含多少个数字类型的列,默认1
--number-of-queries=N 总的测试查询次数(并发客户数×每客户查询次数)
--query=name,-q 使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。
--create-schema 代表自定义的测试库名称,测试的schema,MySQL中schema也就是database。
--commint=N 多少条DML后提交一次。
--compress, -C 如果服务器和客户端支持都压缩,则压缩信息传递。
--concurrency=N, -c N 表示并发量,也就是模拟多少个客户端同时执行select。可指定多个值,以逗号或者--delimiter参数指定的值做为分隔符。例如:--concurrency=100,200,500。
--engine=engine_name, -e engine_name 代表要测试的引擎,可以有多个,用分隔符隔开。例如:--engines=myisam,innodb。
--iterations=N, -i N 测试执行的迭代次数,代表要在不同并发环境下,各自运行测试多少次。
--only-print 只打印测试语句而不实际执行。
--detach=N 执行N条语句后断开重连。
--debug-info, -T 打印内存和CPU的相关信息。
mysqlslap -a -uroot -p112358 --concurrency=1,50,100,200 --iterations=3 --number-int-cols=5 --number-char-cols=5
--auto-generate-sql --auto-generate-sql-add-autoincrement --engine=innodb --number-of-queries=10 --create-schema=sbtest
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
【sysbench】:
安装:
下载 wget https://github.com/akopytov/sysbench/archive/0.5.zip
解压 unzip 0.5.zip
切换目录 cd sysbench-0.5
运行脚本 ./autogen.sh
设置参数 ./configure --with-mysql-includes=/usr/local/mysql/include/ \--with-mysql-libs=/usr/local/mysql/lib/
编译安装 make && make install
【cpu性能测试】
sysbench --test=cpu --cpu-max-prime=20000 run
cpu测试主要是进行素数的加法运算,在上面的例子中,指定了最大的素数为 20000,自己可以根据机器cpu的性能来适当调整数值。
【线程测试】
sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
【磁盘IO性能测试】
free -m :查看内存量
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw prepare
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw run
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw cleanup
上述参数指定了最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读。
【内存测试】
free -m :查看内存量
sysbench --test=memory --memory-block-size=8k --memory-total-size=4G run
上述参数指定了本次测试整个过程是在内存中传输 4G 的数据量,每个 block 大小为 8K。
【OLTP测试】
sysbench --test=./oltp.lua --mysql-table-engine=innodb --oltp-table-size=10000 --mysql-db=imooc --mysql-user=root --mysql-password=112358 --oltp-tables-count=10 --mysql-host=localhost --mysql-socket=/tmp/mysql.sock prepare
测试 OLTP 时,可以自己先创建数据库 sbtest,或者自己用参数 --mysql-db 来指定其他数据库。
--mysql-table-engine 还可以指定为 innodb,myisam 等 MySQL 支持的表存储引擎类型。
【常用命令】:
--mysql-user: 测试执行用户
--mysql-password: 测试执行的用户密码
--mysql-table-engine: 用于指定所使用的存储引擎
--mysql-db=dbtest1a: 测试使用的目标数据库,这个库名要事先创建
--oltp-tables-count=10: 产生表的数量
--oltp-table-size=10000000: 每个表产生的记录行数
--oltp-dist-type=uniform: 指定随机取样类型,可选值有 uniform(均匀分布), Gaussian(高斯分布), special(空间分布)。默认是special
--oltp-read-only=off: 表示不止产生只读SQL,也就是使用oltp.lua时会采用读写混合模式。默认 off,如果设置为on,则不会产生update,delete,insert的sql。
--oltp-test-mode=nontrx: 执行模式,这里是非事务式的。可选值有simple,complex,nontrx。默认是complex
【simple】:简单查询,SELECT c FROM sbtest WHERE id=N
【complex (advanced transactional)】:事务模式在开始和结束事务之前加上begin和commit, 一个事务里可以有多个语句,如点查询、范围查询、排序查询、更新、删除、插入等,并且为了不破坏测试表的数据,该模式下一条记录删除后会在同一个事务里添加一条相同的记录。
【nontrx (non-transactional)】:与simple相似,但是可以进行update/insert等操作,所以如果做连续的对比压测,你可能需要重新cleanup,prepare。
--oltp-skip-trx=[on|off]: 省略begin/commit语句。默认是off
--rand-init=on: 是否随机初始化数据,如果不随机化那么初始好的数据每行内容除了主键不同外其他完全相同
--num-threads=12: 并发线程数,可以理解为模拟的客户端并发连接数
--report-interval=10: 表示每10s输出一次测试进度报告
--max-requests=0: 压力测试产生请求的总数,如果以下面的max-time来记,这个值设为0
--max-time=120: 压力测试的持续时间,这里是2分钟。
prepare: 用于准备测试数据
run: 实际进行测试
cleanup: 清理测试数据