使用Sysbench对MySQL进行压力测试

Posted WhCAT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Sysbench对MySQL进行压力测试相关的知识,希望对你有一定的参考价值。

|前言



    sysbench是 一个模块化、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。sysbench 目前支持对mysql/Oracle/PostgreSQL数据库进行基准测试。除了sysbench外, 可以对数据库进行基准测试的工具还有很多,比如MySQL自带的性能测试工具 mysqlslap Super Smack、Jmeter 等,之所以选择sysbench是因为sysbench不仅功能丰富还适合对数据库做长时间高并发测试(一般为了反映数据库全天的负载情况,至少要连续测试24小时)。


sysbench主要包括以下几种方式的测试:

     1、cpu性能

     2、磁盘io性能

     3、调度程序性能

     4、内存分配及传输速度

     5、POSIX线程性能

     6、数据库性能(OLTP基准测试)


我们这里用的是其数据库性能测试功能。



|压测目的



【1】让开发者或运维人员对当前所用数据库的性能有一定的了解,根据自己的业务场景估算出服务器容量,必要时可进行扩容。
【2】为参数调优前后做一个参考。



|压测指标



以下这几个指标足够反映出数据库服务器的性能情况:

【1】QPS:每秒钟处理完的请求的次数
【2】TPS:秒钟处理完的事务的次数
【3】RT:响应时间,一次请求所需要的平均处理时间
【4】并发量:系统能同时处理的请求数




|操作步骤



【1】下载并安装sysbench
【2】使用sysbench准备测试数据(prepare)
【3】执行压测(run)
【4】分析测试结果
【5】清除测试数据-非必需(cleanup)



|sysbench安装



    以centos为例,其他系统请参考sysbench官方说明文档,项目地址:https://github.com/akopytov/sysbench


curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bashsudo yum -y install sysbench


注意:请让sysbench运行在一台单独的主机上,否则可能会导致测试结果不准确,并且sysbench和MySQL存在冲突的可能。



|sysbench用法



用法格式:

sysbench script [options]... [command]     - script:测试脚本;    - options:可选参数    - command:命令

   

script:


    sysbench 通过脚本定义了若干常用的压测模型,以下简单列出几个常用的模型:


压测模型 描述
bulk_inert.lua 批量插入数据
insert.lua 单值插入数据
delete.lua 删除数据
oltp.lua 混合读写测试,读写比例14:4
select.lua 简单的主键查询


    除此之外,用户还可以使用自己编写的lua脚本,或直接去修改官方提供的脚本,在这里我们使用的测试脚本是oltp.lua


options连接信息参数:


参数名称 参数说明 示例
--mysql-host MySQL服务器地址 192.168.1.10
--mysql-port MySQL服务器端口号 3306
--mysql-user 连接用户名 root
--mysql-password 连接密码 123



options执行参数:


参数名称 参数说明 示例
--oltp-test-mode 执行模式 complex
--oltp-tables-count 测试表的数量 10
--oltp-table-size 单个测试表的记录数 100000
--threads 并发线程数 10
--time 测试时间(秒) 300
--report-interval 生成报告的时间间隔(秒) 10


执行模式可选值:

simple: 简单查询,SELECT c FROM sbtest WHERE id=N

nontrx (non-transactional) :与simple相似,但是可以进行update/insert等操作,所以如果做连续的对比压测,你可能需要重新cleanup,prepare。

- complex (advanced transactional) :事务模式。针对InnoDB引擎sysbench在开始和结束事务之前加上begin和commit;针对MyISAM引擎,sysbench将会在开始和结束之间使用LOCK TABLES/UNLOCK TABLES语句。 一个事务里可以有多个语句,如点查询、范围查询、排序查询、更新、删除、插入等,并且为了不破坏测试表的数据,在该模式下一条记录删除后会在同一个事务里添加一条相同的记录。


在这里,我们选择事务模式。


command:


可选值 解释
prepare 准备测试数据
run 执行测试
cleanup 清除测试数据



|准备测试数据



第一步:在要测试的MySQL服务器上创建数据库"sbtest"

第二步:运行以下命令在10张表里共生成100W条测试数据:

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.1.10 --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-tables-count=10 --oltp-table-size=100000 prepare


测试脚本

/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua


的存放路径在不同的平台或不同的Linux发行版上可能不同,请根据自己的实际情况变通。


|进行压力测试



运行以下命令:

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.1.10 --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-test-mode=complex --threads=10 --time=300 --report-interval=10 run

    本例中开启了10个线程、测试时间300s、生成报告的间隔时间10s、测试模式为事务模式。


|测试结果分析



    因为上面设置了生成报告的时间间隔是10s,所以可以看到每10s报告一次测试结果:


使用Sysbench对MySQL进行压力测试


    待跑完300s后,就可以看到一个汇总后的结果,我们所关心的QPS、TPS、响应时间也在里面:



    TPS结果:这300s共执行了38498次事务,平均下来每秒处理的事务数为128(TPS为128)。

    QPS结果:这300s共执行完成了770438次请求,平均下来每秒处理的请求数数为2567(QPS为2567)。

    RT结果:最大响应时间为300ms,最小响应时间为32ms,平均响应时间为77ms,95%请求的响应时间大概是125ms。

    ignored errors:共有29个错误被忽略,平均每秒0.1个。在本例中,客户端开了10个线程。可以在错误数没有明显提告的情况下,尝试加大并发线程数数,这样测出来的TPS和QPS理论上会更高,也能更好的反映数据库并发处理能力。


|清除数据



    清除数据清的是数据库里的测试数据。当然了,你也可以选择不清除。清除数据的命令和准备数据的命令类似,可以直接把前面写的准备测试数据的那条命令最后的prepare换成cleanup

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --mysql-host=192.168.1.10 --mysql-port=3306 --mysql-user=root --mysql-password=123 --oltp-tables-count=10 --oltp-table-size=100000 cleanup



非常感谢你能看到这里。如果你感觉这篇文章确实对你有所帮助,不妨点个在看,让更多人能够看到这篇文章。

以上是关于使用Sysbench对MySQL进行压力测试的主要内容,如果未能解决你的问题,请参考以下文章

使用sysbench对mysql压力测试

使用sysbench对mysql压力测试

使用sysbench进行MySQL压力测试

使用sysbench进行MySQL压力测试

sysbench工具和mysql的基准测试

Sysbench压力测试工具简介和使用