1.mysqlslap
安装:简单,装了mysql就有了
作用:模拟并发测试数据库性能。
优点:简单,容易使用。
不足:不能指定生成的数据规模,测试过程不清楚针对十万级还是百万级数据做的测试,感觉不太适合做综合测试,比较适合针对既有数据库,对单个sql进行优化的测试。
2.tpcc-mysql
安装:
如果从原网站上下载源码比较麻烦,需要工具、注册、生成证书等。这里提供一个下载包http://blog.chinaunix.net/blog/downLoad/fileid/8532.html作用:测试mysql数据库的整体性能
优点:符合tpcc标准,有标准的方法,模拟真实的交易活动,结果比较可靠。
不足:不能单独测试读或者写的性能,对于一些以查询为主或者只写的应用,就没有这么大的意义了。
3.sysbench
安装:下载rpm包:ck-0.5.2-2.el7.x86_64.rpm,luajit-2.0.4-3.el7.x86_64.rpm,sysbench-1.0.9-2.el7.x86_64.rpm
作用:模拟并发,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL
优点:可以指定测试数据的规模,可以单独测试读、写的性能,也可以测试读写混合的性能。
不足:测试的时候,由于网络原因,测试的非常慢,但是最终给的结果却很好,并发支持很高。
1.selinux和firewalld状态为disabled
2.各主机信息如下:(因为server1,server2,server3之前是做过MHA架构的,最后的结果是:server2是主库。因为从库上进行操作,会导致主从不一致,所以这里的实验环境是server2,而不是server1。)
主机 | ip |
---|---|
server2(装有mysql数据库的主机) | 172.25.83.2 |
在oltp测试中,基本分为四个阶段:
1.安装sysbench:
下载sysbench需要的rpm包:ck-0.5.2-2.el7.x86_64.rpm,sysbench-1.0.9-2.el7.x86_64.rpm,luajit-2.0.4-3.el7.x86_64.rpm。并使用yum进行安装
安装完成之后,会生成相应的目录和文件。其中最为重要的是/usr/share/sysbench/tests/include/oltp_legacy下的oltp.lua文件
2.初始化数据:
<1>登陆数据库,创建压力测试需要的数据库sbtest:
[root@server2 ~]# mysql -uroot -pXinjiaojiao+523
<2>在该主机(172.25.83.2)上进行sysbench数据生成,在sbtest库下生成sbtest表,共100W记录。
[root@server2 ~]# sysbench --test=/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp-table-size=1000000 --oltp-read-only=off --init-rng=on --num-threads=16 --max-requests=0 --oltp-dist-type=uniform --max-time=1800 --mysql-user=root --mysql-socket=/var/lib/mysql/mysql.sock --mysql-password=Xinjiaojiao+523 --db-driver=mysql --mysql-table-engine=innodb --oltp-test-mode=complex prepare
上面命令中各参数的含义如下:
- --test=/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua #oltp.lua文件所在的绝对路径
- --oltp-table-size=1000000 #每个表产生的记录行数;还有一个参数--oltp-tables-count=用来指定产生表的数量。这里没有指定,表示默认产生一张表。
- --oltp-read-only=off #表示不止产生只读SQL,也就是使用oltp.lua时会采用读写混合模式。默认是off,如果设置为on,则不会产生update,delete,insert的sql。
- --init-rng=on #在测试开始时是初始化随机数发生器。默认是off。
- --num-threads=16 #并发线程数,可以理解为模拟的客户端并发连接数
- --max-requests=0 #压力测试产生请求的总数,如果以下面的max-time来记,这个值设为0
- --oltp-dist-type=uniform #指定随机取样类型,可选值有 uniform(均匀分布), Gaussian(高斯分布), special(空间分布)。默认是special
- --max-time=180 #压力测试的持续时间,这里是180s(3分钟)。
- --mysql-user=root #数据库的登陆名
- --mysql-socket=/var/lib/mysql/mysql.sock #数据库的执行入口
- --mysql-password=Xinjiaojiao+523 #数据库的登陆密码
- --db-driver=mysql #数据库类型,指定数据库驱动程序为mysql
- --mysql-table-engine=innodb #设置mysql中表的引擎为innodb类型的,除此之外,还有一个选项为myisam。
- isam是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。MyIASM是IASM表的新版本
- innodb它提供了事务控制能力功能,它确保一组命令全部执行成功,或者当任何一个命令出现错误时所有命令的结果都被回退,可以想像在电子银行中事务控制能力是非常重要的。支持COMMIT、ROLLBACK和其他事务特性。最新版本的Mysql已经计划移除对BDB的支持,转而全力发展InnoDB。
- --oltp-test-mode=complex #执行模式,这里是事务式的。可选值有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。
- prepare #注意最后一行。一项测试开始前需要用prepare来准备好表和数据;run执行真正的压测;cleanup用来清除数据和表。
3.执行测试
在主库上(172.25.83.2)进行压力测试,持续时间为3分钟,产生大量的binlog。
[root@server2 ~]# sysbench --test=/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp-table-size=1000000 --oltp-read-only=off --init-rng=on --num-threads=16 --max-requests=0 --oltp-dist-type=uniform --max-time=180 --mysql-user=root --mysql-socket=/var/lib/mysql/mysql.sock --mysql-password=Xinjiaojiao+523 --db-driver=mysql --mysql-table-engine=innodb --oltp-test-mode=complex run
结果解读
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
WARNING: --num-threads is deprecated, use --threads instead
WARNING: --max-time is deprecated, use --time instead
sysbench 1.0.9 (using system LuaJIT 2.0.4)
Running the test with following options:
Number of threads: 16
Initializing random number generator from current time
Initializing worker threads...
Threads started!
SQL statistics:
queries performed:
read: 388976 //总select数量
write: 111114 //总update、insert、delete语句数量
other: 55560 //commit、unlock tables以及其他mutex的数量
total: 555650 //全部总数
transactions: 27776 (154.23 per sec.) //精确的说是这一项后面的TPS (即每秒事务数)。但如果使用了-oltp-skip-trx=on,这项事务数恒为0,需要用total number of events 去除以总时间,得到tps(其实还可以分为读tps和写tps)
queries: 555650 (3085.40 per sec.) ////精确的说是这一项后面的QPS (即每秒请求、查询次数)。
ignored errors: 8 (0.04 per sec.) //忽略的错误数
reconnects: 0 (0.00 per sec.)
General statistics: //一些统计结果
total time: 180.0876s //即max-time指定的压测实际
total number of events: 27776 //总的事件数,一般与transactions相同
Latency (ms):
min: 24.15 //最小耗时
avg: 103.72 //95%的语句的平均响应时间
max: 557.76 //最大耗时
95th percentile: 150.29
sum: 2881056.92
Threads fairness: //线程的稳定性
events (avg/stddev): 1736.0000/5.16 //事件(平均值/偏差)
execution time (avg/stddev): 180.0661/0.01 //执行时间(平均值/偏差)
我们一般关注的用于绘图的指标主要有:
--percentile=98
的方式去更改)-oltp-skip-trx=on
,这项事务数恒为0,需要用total number of events
去除以总时间,得到tps(其实还可以分为读tps和写tps)sysbench还可以对文件系统IO测试,CPU性能测试,以及内存分配与传输速度测试,这里就不介绍了。
总结起来sysbench的缺点就是,模拟的表结构太简单,不像tpcc-mysql那样完整的事务系统。但对于性能压测对比还是很有用的,因为sysbench使用的环境参数限制是一样的。
4.清理数据:(在这儿而言,就是删除了初始化数据阶段产生的数据)
[root@server2 ~]# sysbench --test=/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp-table-size=1000000 --oltp-read-only=off --init-rng=on --num-threads=16 --max-requests=0 --oltp-dist-type=uniform --max-time=180 --mysql-user=root --mysql-socket=/var/lib/mysql/mysql.sock --mysql-password=Xinjiaojiao+523 --db-driver=mysql --mysql-table-engine=innodb --oltp-test-mode=complex cleanup