Linux下Mysql数据库的压力测试(mysql版本:mysql-5.7.24)——sysbench

一.Mysql数据库的几种压力测试工具:

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

优点:可以指定测试数据的规模,可以单独测试读、写的性能,也可以测试读写混合的性能。

不足:测试的时候,由于网络原因,测试的非常慢,但是最终给的结果却很好,并发支持很高。

二.实验环境(rhel7.3版本)

1.selinux和firewalld状态为disabled

2.各主机信息如下:(因为server1,server2,server3之前是做过MHA架构的,最后的结果是:server2是主库。因为从库上进行操作,会导致主从不一致,所以这里的实验环境是server2,而不是server1。)

主机 ip
server2(装有mysql数据库的主机) 172.25.83.2


 

三.Mysql数据库的压力测试过程演示:Sysbench-OLTP

在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。
  1. isam是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。MyIASM是IASM表的新版本
  2. innodb它提供了事务控制能力功能,它确保一组命令全部执行成功,或者当任何一个命令出现错误时所有命令的结果都被回退,可以想像在电子银行中事务控制能力是非常重要的。支持COMMIT、ROLLBACK和其他事务特性。最新版本的Mysql已经计划移除对BDB的支持,转而全力发展InnoDB。
  • --oltp-test-mode=complex     #执行模式,这里是事务式的。可选值有simple,complex,nontrx。默认是complex
  1. simple:简单查询,SELECT c FROM sbtest WHERE id=N
  2. complex (advanced transactional):事务模式在开始和结束事务之前加上begin和commit, 一个事务里可以有多个语句,如点查询、范围查询、排序查询、更新、删除、插入等,并且为了不破坏测试表的数据,该模式下一条记录删除后会在同一个事务里添加一条相同的记录。
  3. 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      //执行时间(平均值/偏差)

我们一般关注的用于绘图的指标主要有:

  • response time avg: 平均响应时间。(后面的95%的大小可以通过--percentile=98的方式去更改)
  • transactions: 精确的说是这一项后面的TPS 。但如果使用了-oltp-skip-trx=on,这项事务数恒为0,需要用total number of events 去除以总时间,得到tps(其实还可以分为读tps和写tps)
  • read/write requests: 用它除以总时间,得到吞吐量QPS
  • 当然还有一些系统层面的cpu,io,mem相关指标

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

猜你喜欢

转载自blog.csdn.net/qq_42303254/article/details/88189503