MySQL 压力测试

开始之前先做个小实验

今天登录一台测试机,发现MySQL服务起不来,查看日志发现报错



刚开始认为mysql库中的几个关键表损坏了,想着去修复一下呢,结果并不是,更狠


库全没了

也不知道它经历了啥,里面的系统库都没有了。后来我想系统库大部分表啥的都一样,可能就里面的数据有不一样的。如果把同版本的msyql sys performance_schema 移动过来并授权,应该就能启动,于是从隔壁同版本的mysql scp系统库导data目录

查看下


启动 ,没有问题 


Ok 正常运转。


下面要对MySQL 进行压测。

使用sysbench 工具进行压测

Sysbench 简介

sysbench是一款开源的多线程工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试,数据库目前支持MySQL/Oracle/PostgreSQL。

对于大多数版本Linux 可以直接yum 安装

yum -y installsysbench

也可以编译安装

默认支持MySQL,如果需要测试Oracle/PostgreSQL,则在configure时需要加上–with-oracle或者–with-pgsql参数

./configure--prefix=/u01/sysbench --with-mysql-includes=/opt/mysql/include/mysql--with-mysql-libs=/opt/mysql/lib/mysql

make &&make install

安装

yum install -y automake libtool 依赖包

ln -sf /usr/local/mysql/lib/libmysql*/usr/lib64

ln -sf /usr/local/mysql/lib/libmysqlclient.so/usr/lib64/libmysqlclient_r.so

 wgethttp://imysql.com/wp-content/uploads/2014/09/sysbench-0.4.12-1.1.tgz

 tar zxf sysbench-0.4.12-1.1.tgz

 cd sysbench-0.4.12-1.1/

./autogen.sh

 ./configure--with-mysql-includes=/usr/local/mysql/include/ --with-mysql-libs=/usr/local/mysql/lib/

 make

 make install

 sysbench –help

说明没有问题 安装成功




需要关注的事项



MySQL oltp 测试脚本


1 准备数据(如果没有做全局变量,需要在绝对路径下执行)

./sysbench --mysql-host=192.168.193.128 --mysql-port=3306 --mysql-user=root--mysql-password=123456--test=/root/sysbench-0.4.12-1.1/sysbench/tests/db/oltp.lua  --oltp-table-size=10000--oltp_tables_count=50 --rand-init=on --mysql-table-engine=innodb prepare

--test=tests/db/oltp.lua表示调用 tests/db/oltp.lua 脚本进行 oltp 模式测试,

oltp --oltp_tables_count=50 表示会生成 50个测试表

--oltp-table-size=10000

表示每个测试表填充数据量为10000行

--rand-init=on  表示每个测试表都是用随机数据来填充的

2 执行测试

./sysbench  --mysql-host=192.168.193.128--mysql-port=3306 --mysql-user=root --mysql-password=123456--test=/root/sysbench-0.4.12-1.1/sysbench/tests/db/oltp.lua  --oltp-table-size=10000--oltp_tables_count=50 --mysql-table-engine=innodb --num-threads=100 --oltp-read-only=off--report-interval=10 --rand-type=uniform --max-time=1800 --max-request=0--percentile=99 run >> /root/test.log


--num-threads=1024

   表示发起1024个并发连接

--oltp-read-only=off

表示不要进行只读测试,也就是会采用读写混合模式测试

--report-interval=10

表示每10秒输出一次测试进度报告

--rand-type=uniform

表示随机类型为固定模式,其他几个可选随机模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累托)

--max-time=1800

表示最大执行时长为1800秒,测试将在这个时间后结束

--max-requests=0

表示总请求数为 0,因为上面已经定义了总执行时长,所以总请求数可以设定为 0;也可以只设定总请求数,不设定最大执行时长

--percentile=99 表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值



3 数据删除

./sysbench  --mysql-host=192.168.193.128--mysql-port=3306 --mysql-user=root --mysql-password=123456--test=/root/sysbench-0.4.12-1.1/sysbench/tests/db/oltp.lua  --oltp-table-size=1000--oltp_tables_count=20 --mysql-table-engine=innodb --num-threads=100 --oltp-read-only=off--report-interval=10 --rand-type=uniform --max-time=600 --max-request=0 --percentile=99 cleanup

4 看测试报告



当然测试的结果跟测试的数据量是有关的,本次测试量50*10000,50万行数据。其实没有多少,所以测试结果看着很好,其实没有太大参考价值。因为数据量还不到100m。所以,加大数据量才有价值。




如果加大数据量的话,比如上亿数据,是需要时间的。有没有可以快速压测的方法呢。有的,MySQL自带mysqlslap工具。mysqlslap是mysql自带的基准测试工具。

优点:查询数据,语法简单,灵活容易使用.该工具可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较。

常用的选项

--concurrency

    并发数量,多个可以用逗号隔开

--engines

      要测试的引擎,可以有多个,用分隔符隔开,如--engines=myisam,innodb

--iterations

     要运行这些测试多少次

--auto-generate-sql

        用系统自己生成的SQL脚本来测试

--auto-generate-sql-load-type

    要测试的是读还是写还是两者混合的(read,write,update,mixed)

--number-of-queries

         总共要运行多少次查询。每个客户运行的查询数量可以用查询总数/并发数来计算


--number-int-cols

            创建测试表的int型字段数量

--number-char-cols

            创建测试表的chat型字段数量

--create-schema

           测试的database

--query

自己的SQL 脚本执行测试

--only-print

如果只想打印看看SQL语句是什么,可以用这个选项

--auto-generate-sql-add-autoincrement

代表对生成的表自动添加auto_increment列,从5.1.18版本开始



mysqlslap--concurrency=200,300,500,650 --iterations=3 --number-int-cols=20--number-char-cols=30 --auto-generate-sql --auto-generate-sql-add-autoincrement--auto-generate-sql-load-type=mixed --engine=innodb --number-of-queries=2000--verbose -udzyd -p123456

模拟并发200,300,500,600客户端 表int20 char30混合查询 每次2000查询,执行3次




mysqlslap  --concurrency=200,250 --iterations=2--create-schema=dzyd -e innodb --query="/root/query.sql" -uroot-p123456

使用自建的sql来测试,这样比较准确,本次自建的sql来自该项目原数据库的慢查询日志中sql


你可能感兴趣的:(MySQL 压力测试)