`

MySQL压力测试工具

 
阅读更多

第一、mysqlslap

mysqlslap是一个mysql官方提供的压力测试工具。以下是比较重要的参数:
–defaults-file,配置文件存放位置
–concurrency,并发数
–engines,引擎
–iterations,迭代的实验次数
–socket,socket文件位置

自动测试:
–auto-generate-sql,自动产生测试SQL
–auto-generate-sql-load-type,测试SQL的类型。类型有mixed,update,write,key,read。
–number-of-queries,执行的SQL总数量
–number-int-cols,表内int列的数量
–number-char-cols,表内char列的数量

例如 1:
shell>mysqlslap –defaults-file=/u01/mysql1/mysql/my.cnf –concurrency=50,100 –iterations=1 –number-int-cols=4 –auto-generate-sql –auto-generate-sql-load-type=write –engine=myisam –number-of-queries=200 -S/tmp/mysql1.sock
Benchmark
Running for engine myisam
Average number of seconds to run all queries: 0.016 seconds
Minimum number of seconds to run all queries: 0.016 seconds
Maximum number of seconds to run all queries: 0.016 seconds
Number of clients running queries: 50
Average number of queries per client: 4

Benchmark
Running for engine myisam
Average number of seconds to run all queries: 0.265 seconds
Minimum number of seconds to run all queries: 0.265 seconds
Maximum number of seconds to run all queries: 0.265 seconds
Number of clients running queries: 100
Average number of queries per client: 2

指定数据库的测试:
–create-schema,指定数据库名称
–query,指定SQL语句,可以定位到某个包含SQL的文件

例如2:
shell>mysqlslap –defaults-file=/u01/mysql1/mysql/my.cnf –concurrency=25,50 –iterations=1 –create-schema=test –query=/u01/test.sql -S/tmp/mysql1.sock
Benchmark
Average number of seconds to run all queries: 0.018 seconds
Minimum number of seconds to run all queries: 0.018 seconds
Maximum number of seconds to run all queries: 0.018 seconds
Number of clients running queries: 25
Average number of queries per client: 1

Benchmark
Average number of seconds to run all queries: 0.011 seconds
Minimum number of seconds to run all queries: 0.011 seconds
Maximum number of seconds to run all queries: 0.011 seconds
Number of clients running queries: 50
Average number of queries per client: 1

碰到的问题:
测试过程中,当并发数超过300时,就会出错
mysqlslap: Could not create thread
由于系统默认的“stack size”为10M,这样并发300个进程时,就消耗了10M X 300 = 3000M 内存,超过系统可用内存导致。
解决办法:
通过修改”stack size“为1M(1024),这样并发3000个进程就相当于系统默认的300个进程的内存使用量。

ulimit -s 1024

例如3:

MySQL从5.1.4版开始带有一个压力测试工具mysqlslap,通过模拟多个并发客户端访问mysql来执行测试,使用起来非常的简单。通过mysqlslap –help可以获得可用的选项,这里列一些主要的参数,更详细的说明参考官方手册

–auto-generate-sql, -a
自动生成测试表和数据

–auto-generate-sql-load-type=type
测试语句的类型。取值包括:read,key,write,update和mixed(默认)。

–number-char-cols=N, -x N
自动生成的测试表中包含多少个字符类型的列,默认1

–number-int-cols=N, -y N
自动生成的测试表中包含多少个数字类型的列,默认1

–number-of-queries=N
总的测试查询次数

–query=name,-q
使用自定义脚本执行测试,例如可以调用自定义的一个存储过程或者sql语句来执行测试。

–create-schema
测试的schema,MySQL中schema也就是database

–commint=N
多少条DML后提交一次

–compress, -C
如果服务器和客户端支持都压缩,则压缩信息传递

–concurrency=N, -c N
并发量,也就是模拟多少个客户端同时执行select。可指定多个值,以逗号或者–delimiter参数指定的值做为分隔符

–engine=engine_name, -e engine_name
创建测试表所使用的存储引擎,可指定多个

–iterations=N, -i N
测试执行的迭代次数

–detach=N
执行N条语句后断开重连

–debug-info, -T
打印内存和CPU的信息

–only-print
只打印测试语句而不实际执行

测试的过程需要生成测试表,插入测试数据,这个mysqlslap可以自动生成,默认生成一个mysqlslap的schema,如果已经存在则先删除,这里要注意了,不要用–create-schema指定已经存在的库,否则后果可能很严重。可以用–only-print来打印实际的测试过程:

$mysqlslap -a --only-print
DROP SCHEMA IF EXISTS `mysqlslap`;
CREATE SCHEMA `mysqlslap`;
use mysqlslap;
CREATE TABLE `t1` (intcol1 INT(32) ,charcol1 VARCHAR(128));
INSERT INTO t1 VALUES (1804289383,'mxvtvmC9127qJNm06sGB8R92q2j7vTiiITRDGXM9ZLzkdekbWtmXKwZ2qG1llkRw5m9DHOFilEREk3q7oce8O3BEJC0woJsm6uzFAEynLH2xCsw1KQ1lT4zg9rdxBL');
...
SELECT intcol1,charcol1 FROM t1;
INSERT INTO t1 VALUES (364531492,'qMa5SuKo4M5OM7ldvisSc6WK9rsG9E8sSixocHdgfa5uiiNTGFxkDJ4EAwWC2e4NL1BpAgWiFRcp1zIH6F1BayPdmwphatwnmzdwgzWnQ6SRxmcvtd6JRYwEKdvuWr');
DROP SCHEMA IF EXISTS `mysqlslap`;

可以看到最后由删除一开始创建的schema的动作,整个测试完成后不会在数据库中留下痕迹。假如我们执行一次测试,分别50和100个并发,执行1000次总查询,那么:

$mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --debug-info
Benchmark
  Average number of seconds to run all queries: 0.375 seconds
  Minimum number of seconds to run all queries: 0.375 seconds
  Maximum number of seconds to run all queries: 0.375 seconds
  Number of clients running queries: 50
  Average number of queries per client: 20

Benchmark
  Average number of seconds to run all queries: 0.453 seconds
  Minimum number of seconds to run all queries: 0.453 seconds
  Maximum number of seconds to run all queries: 0.453 seconds
  Number of clients running queries: 100
  Average number of queries per client: 10

User time 0.29, System time 0.11
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 4032, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 7319, Involuntary context switches 681

上结果可以看出,50和100个并发分别得到一次测试结果(Benchmark),并发数越多,执行完所有查询的时间越长。为了准确起见,可以多迭代测试几次:

$ mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --debug-info
Benchmark
  Average number of seconds to run all queries: 0.380 seconds
  Minimum number of seconds to run all queries: 0.377 seconds
  Maximum number of seconds to run all queries: 0.385 seconds
  Number of clients running queries: 50
  Average number of queries per client: 20

Benchmark
  Average number of seconds to run all queries: 0.447 seconds
  Minimum number of seconds to run all queries: 0.444 seconds
  Maximum number of seconds to run all queries: 0.451 seconds
  Number of clients running queries: 100
  Average number of queries per client: 10

User time 1.44, System time 0.67
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 17922, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 36796, Involuntary context switches 4093

测试同时不同的存储引擎的性能进行对比:

$ mysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodbmysqlslap -a --concurrency=50,100 --number-of-queries 1000 --iterations=5 --engine=myisam,innodb --debug-info
Benchmark
  Running for engine myisam
  Average number of seconds to run all queries: 0.200 seconds
  Minimum number of seconds to run all queries: 0.188 seconds
  Maximum number of seconds to run all queries: 0.210 seconds
  Number of clients running queries: 50
  Average number of queries per client: 20

Benchmark
  Running for engine myisam
  Average number of seconds to run all queries: 0.238 seconds
  Minimum number of seconds to run all queries: 0.228 seconds
  Maximum number of seconds to run all queries: 0.251 seconds
  Number of clients running queries: 100
  Average number of queries per client: 10

Benchmark
  Running for engine innodb
  Average number of seconds to run all queries: 0.375 seconds
  Minimum number of seconds to run all queries: 0.370 seconds
  Maximum number of seconds to run all queries: 0.379 seconds
  Number of clients running queries: 50
  Average number of queries per client: 20

Benchmark
  Running for engine innodb
  Average number of seconds to run all queries: 0.443 seconds
  Minimum number of seconds to run all queries: 0.440 seconds
  Maximum number of seconds to run all queries: 0.447 seconds
  Number of clients running queries: 100
  Average number of queries per client: 10

User time 2.83, System time 1.66
Maximum resident set size 0, Integral resident set size 0
Non-physical pagefaults 34692, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 87306, Involuntary context switches 10326
 

第二、SysBench

SysBench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。它主要包括以下几种方式的测试:
       1、cpu性能
       2、磁盘io性能
       3、调度程序性能
       4、内存分配及传输速度
       5、POSIX线程性能
       6、数据库性能(OLTP基准测试)      

目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库。

    一、安装
    首先,在 http://sourceforge.net/projects/sysbench 下载源码包。
    接下来,按照以下步骤安装:

    tar zxf sysbench-0.4.8.tar.gz && cd sysbench-0.4.8 &&./configure && make && make install && strip /usr/local/bin/sysbench

    以上方法适用于 MySQL 安装在标准默认目录下的情况,如果 MySQL 并不是安装在标准目录下的话,那么就需要自己指定 MySQL 的路径了。比如我的 MySQL 喜欢自己安装在 /usr/local/mysql 下,则按照以下方法编译:

    /configure --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib && make && make install

    当然了,用上面的参数编译的话,就要确保你的 MySQL lib目录下有对应的 so 文件,如果没有,可以自己下载 devel 或者 share 包来安装。
    另外,如果想要让 sysbench 支持 pgsql/oracle 的话,就需要在编译的时候加上参数
    --with-pgsql
    或者
    --with-oracle
    这2个参数默认是关闭的,只有 MySQL 是默认支持的。

    二、开始测试
    编译成功之后,就要开始测试各种性能了,测试的方法官网网站上也提到一些,但涉及到 OLTP 测试的部分却不够准确。在这里我大致提一下:
    1、cpu性能测试

    sysbench --test=cpu --cpu-max-prime=20000 run
    cpu测试主要是进行素数的加法运算,在上面的例子中,指定了最大的素数为 20000,自己可以根据机器cpu的性能来适当调整数值。

    2、线程测试

    sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
    3、磁盘IO性能测试

    sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw preparesysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw runsysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw cleanup
        上述参数指定了最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读。

    4、内存测试

    sysbench --test=memory --memory-block-size=8k --memory-total-size=4G run
    上述参数指定了本次测试整个过程是在内存中传输 4G 的数据量,每个 block 大小为 8K。

    5、OLTP测试

    sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000000 --mysql-socket=/tmp/mysql.sock --mysql-user=test --mysql-host=localhost --mysql-password=test prepare
    上述参数指定了本次测试的表存储引擎类型为 myisam,这里需要注意的是,官方网站上的参数有一处有误,即 --mysql-table-engine,官方网站上写的是 --mysql-table-type,这个应该是没有及时更新导致的。另外,指定了表最大记录数为 1000000,其他参数就很好理解了,主要是指定登录方式。测试 OLTP 时,可以自己先创建数据库 sbtest,或者自己用参数 --mysql-db 来指定其他数据库。--mysql-table-engine 还可以指定为 innodb 等 MySQL 支持的表存储引擎类型。

 

第三、JDBHammer

JDBHammer 是一个数据库压力测试工具,它可以模拟指定数量的并发用户进行数据库查询操作并给出测试的结果报表。当前只支持 MySQL 数据库。

分享到:
评论

相关推荐

    MySQL压力测试工具mysqlslap.pdf

    MySQL 压力测试工具 mysqlslap MySQL 压力测试工具 mysqlslap 是一个功能强大且易于使用的压力测试工具,从 MySQL 5.1.4 版本开始提供。通过模拟多个并发客户端访问 MySQL,以执行测试,使用起来非常简单。 ...

    mysql压力测试工具

    MySQL压力测试工具——sysbench详解 sysbench是一个强大的多线程、多事件驱动的系统和数据库性能测试工具。它不仅可以评估系统的CPU、内存、磁盘I/O等硬件性能,还能针对MySQL数据库进行复杂的基准测试,帮助开发者...

    MySQL压力测试工具mysqlslap资料.pdf

    MySQL 压力测试工具 mysqlslap 资料 MySQL 压力测试工具 mysqlslap 是 MySQL 从 5.1.4 版开始带有的一个压力测试工具,通过模拟多个并发客户端访问 MySQL 来执行测试,使用起来非常的简单。 mysqlslap 工具的主要...

    06-MySQL压力测试工具sysbench1

    MySQL 压力测试工具 sysbench 介绍 sysbench 是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。目前 sysbench 主要支持 MySQL, pgsql, oracle 这 3 种数据库。 ...

    MySQL压力测试工具mysqlslap宣贯.pdf

    MySQL压力测试工具mysqlslap是MySQL数据库管理系统提供的一种性能测试工具,从5.1.4版本开始被引入。它的主要作用是模拟多个并发客户端对MySQL服务器进行访问,从而评估和测试MySQL服务器在高负载条件下的性能表现。...

    MySQLCC:MySQL压力测试工具,使用PHP编写

    MySQL压力测试工具,使用PHP编写 请注意:本项目仅用于学习和测试,不要用于违法行为,造成的一切后果由使用者自行承担。 这是一个使用PHP编写MySQL性能测试工具,用于检测数据库的性能,可承载的并发数量等。 经过...

    数据库压力测试工具

    在给定文件中,提到了如何使用数据库压力测试工具来进行这类测试,以及如何设计和实现这些工具。以下是从文件中提取的关键知识点: 1. **数据库压力测试工具的重要性和应用场景**: - 数据库压力测试工具用于验证...

    Mysqlslap MySQL压力测试工具 简单教程

    MySQL从5.1.4版开始带有一个压力测试工具mysqlslap,通过模拟多个并发客户端访问mysql来执行测试,使用起来非常的简单。通过mysqlslap –help可以获得可用的选项,这里列一些主要的参数,更详细的说明参考官方手册。...

    MYSQL学习资料

    mysqlslap MySQL压力测试工具 mysql proxy安装配置 mysql 触发器 mysql与MongoDB语法对比 mysql分表的3种方法 MySQL数据库扩展小记 mysql架构方案 MySQL水平分区表实际操作总结 Mysql水平分表 mysql水平分表和垂直...

    MySQL性能测试工具

    MySQL性能测试工具是数据库管理员和开发人员用于评估MySQL数据库系统性能的重要工具。这些工具通过模拟大量并发用户执行各种SQL操作,如插入(增)、删除、更新(改)和查询(查),来测量数据库的响应时间、吞吐量...

    叶金荣_MySQL压力测试经验

    ### 叶金荣_MySQL压力测试经验 #### 一、引言 在IT行业中,数据库作为企业核心系统的基石,其稳定性和性能至关重要。随着业务的发展和技术的进步,对数据库的压力测试变得越来越重要。叶金荣先生是一位在数据库领域...

    mysql压力测试脚本实例

    MySQL压力测试是为了评估数据库在高负载条件下的性能和稳定性,通常包括读写操作的速度、并发处理能力以及资源消耗等指标。以下是一个简单的MySQL压力测试脚本实例,它涉及了数据库表的创建、数据插入以及自定义函数...

    数据库压测工具

    SQLSERVER 压力测试工具、mysql压力测试工具、数据库压测工具

Global site tag (gtag.js) - Google Analytics