sysbench
sysbench是基于LuaJIT的可编写多线程基准工具,可用于数据库基准测试,了解系统及数据库的基础性能相关信息,项目地址:sysbench。sysbench包含以下基准测试:
- oltp_*.lua:模拟OLTP下的数据库基准测试的集合
- fileio:文件系统基准测试
- cpu;简单的CPU基准测试
- memory:内存访问基准测试
- threads:基于线程的调度程序基准测试
- mutex:POSIX互斥基准测试
安装相关依赖及编译程序包
1 | $ yum -y install make automake libtool pkgconfig libaio-devel mariadb-devel openssl-devel |
sysbench性能基准测试三大步骤:
- prepare:初始化测试需要的数据。例如文件系统测试中的文件或数据库测试数据填充
- run:运行指定的测试内容
- clean:测试运行完成后清理测试临时数据
文件系统测试
查看fileio选项
1 | [root@t-luhx03-v-szzb service]# sysbench fileio help |
初始化测试文件
1 | sysbench fileio --file-total-size=5G --file-num=1 --file-block-size=16384 --file-test-mode=rndrw prepare |
执行性能测试
1 | sysbench fileio --file-total-size=5G --file-test-mode=rndrw --time=300 --file-test-mode=rndrw --file-num=1 run |
注:上述随机读写测试后IOPS=(6.02+4.02)*1024/16=642.56
清除测试文件
1 | sysbench fileio --file-total-size=5G --file-test-mode=rndrw --time=300 --file-test-mode=rndrw --file-num=1 clean |
mysql测试
常用数据库选项
选项 | 描述 | 默认值 |
---|---|---|
–mysql-host | mysql host | |
–mysql-port | mysql port | |
–mysql-user | mysql连接用户 | |
–mysql-password | mysql连接用户密码 | |
–mysql-db | mysql测试数据库名 | |
–oltp-tables-count | 测试表数量 | |
–oltp-table-size | 每张测试表数据量 | |
–report-interval | 指定测试进度报告输出的间隔,单位为秒 | |
–oltp-dist-type | 指定随机取样类型,可选值有uniform(均匀分布),Gaussian(高斯分布),special(空间分布) | special |
–rand-init | 否随机初始化数据,如果不随机则除了主键不一致其它字段全一致 | |
–events | 压力测试产生请求的总数,为0则不限制,由time去控制 | |
–oltp-test-mode | 执行模式,可选值有simple(简单查询)、complex(事务模式)、nontrx(非事务模式) | complex |
–oltp-read-only | 是否设置为只读模式 | OFF |
–time | 压力测试的持续时间,单位为秒 | |
–threads | 并发线程数 |
- 只读测试:需要将oltp-read-only设置为on的,也可以使用select.lua
- 混合读写测试:需要把oltp-read-only设置为off,通过分析oltp.lua可以看出单个事务操作的比例select:update_key:update_non_key:delete:insert = 14:1:1:1:1。可通过oltp-point-selects、oltp-simple-ranges、oltp-sum-ranges、oltp-order-ranges、oltp-distinct-ranges,oltp-index-updates、oltp-non-index-updates这些选项去调整读写权重
- 更新测试:如果只想比较update或insert,可以使用update_index.lua脚本,这里是更新索引列上的值
测试导入数据
1 | /usr/local/sysbench/bin/sysbench /usr/local/sysbench/share/sysbench/tests/include/oltp_legacy/oltp.lua \ |
执行后可能存在如下错误
1 | /usr/local/sysbench/bin/sysbench: error while loading shared libraries: libmysqlclient.so.20: cannot open shared object file: No such file or directory |
解决方案
1 | ln -s /usr/local/mysql/lib/libmysqlclient.so.20 /usr/lib64/libmysqlclient.so.20 |
执行测试
1 | /usr/local/sysbench/bin/sysbench /usr/local/sysbench/share/sysbench/tests/include/oltp_legacy/oltp.lua \ |
执行后会出现如下输出
1 | sysbench 1.0.19 (using bundled LuaJIT 2.1.0-beta2) |
注:read表示查询数量,write表示DML数量,transactions则为TPS,Latency为响应时间,queries表示QPS
清理测试数据
1 | /usr/local/sysbench/bin/sysbench /usr/local/sysbench/share/sysbench/tests/include/oltp_legacy/oltp.lua \ |
TPCC-MYSQL
tpcc-mysql是percona基于TCP-C衍生的产品,专门用于MySQL TPCC测试,项目地址:tpcc-mysql。tpcc-mysql内部模拟电商环境数据,其测试表包括仓库、订单、客户,其与sysbench最大的区别在于tpcc-mysql测试过程会不断增加测试数据,而sysbench数据量则保持不变,因此能更好模拟业务不断增长下的性能表现。
安装依赖包及编译程序包
1 | $ yum install bzr -y |
初始化测试数据
1 | root@(none) 22:21: create database tpcc; |
注:-w表示warehouse表的数据量,其它表会按照与这张表的比例关系插入测试数据
创建索引
1 | mysql -uroot -p tpcc < add_fkey_idx.sql |
启动测试
1 | tpcc_start -h server_host -P port -d database_name -u mysql_user -p mysql_password -w warehouses -c connections -r warmup_time -l running_time -i report_interval -f report_file -t trx_file |
- -w:指定仓库数量
- -c:指定并发连接数
- -r:定开始测试前进行warmup的时间,进行数据预热
- -l:测试时长
- -i:生成报告间隔时长
- -f:指定生成的报告文件名,内容为timestamp对应新订单业务耗时
- -t:指定生成的报告文件名,内容为线程对应的CPU TIME
报告分析
1 | $ ./tpcc_start -h localhost -P33006 -d tpcc -uroot -p'Abcd123#' -S /service/mysql/data/mysqld.sock -w 2 -c 32 -r 10 -l 60 -f tpcc_mysql_report |
- MEASURING START:第一列为10秒间隔时间,第二列为10秒内执行新订单交易数,第三列为95%新订单交易平均时间,第四列为99%新订单交易平均时间,第五列为新订单交易最长响应时间,第五列为支付业务的结果:吞吐量|最大响应时间,第六列为发货业务的结果,第七列为库存业务的结果
- Raw Results:分别对应五个业务模块,依次是新订单、支付、订单查询、发货、库存。sc:success表示操作成功的量,rt:retry表示操作重试的量,fl:failure为操作失败的量,avg_rt为平均重试次数
- transaction percentage:各个业务的占比
- response time:各个业务的响应时间
注:tpcc-mysql测试指标为TPMC,即一分钟的事务量,换算成TPS也就是248
mysqlslap
mysqlslap是mysql自带的基准测试功能,可以通过工具自动生成测试数据测试,也可以自身业务内容进行压力测试。详情参考:mysqlslap
1 | [root@t-luhx03-v-szzb ~]# mysqlslap --user=root --password=Abcd123# --concurrency=100 --number-int-cols=5 --number-char-cols=20 --auto-generate-sql |
我们可以通过自定义表数据,并通过–query选项来指定业务操作脚本,其中我们可以利用substring(MD5(rand()) from 1 for 32)来随机生成字符串,模拟业务增长场景。
当然我们可以看到mysqlslap的输出结果过于简单,这里我们可以通过NMON收集测试过程中的系统状态信息,通过mysqladmin -uroot -p extended-status输出数据库状态信息,对结果进行筛选汇总能得到一个更全面的信息。