1 mysqlslap简介
mysqlslap是从5.1.4版开始的一个MySQL官方提供的压力测试工具。通过模拟多个并发客户端访问MySQL来执行压力测试,同时详细的提供了“高负荷攻击MySQL”的数据性能报告。并且能很好的对比多个存储引擎在相同环境下的不同并发数压力性能差别。
mysqlslap不需要专门的安装部署,安装mysql的时候在bin目录下自带mysqlslap。这次的介绍以mysql5.5.28为例,关于mysql的安装不在介绍。
2 mysqlslap参数
通过mysqlslap --help命令可以查看到mysqlslap参数的详细介绍。
--print-defaults 打印程序的参数列表
--no-defaults 不从配置文件里读取默认配置信息
--defaults-file=# 指定my.cnf配置文件存放位置。
--defaults-extra-file=# 读取完全局文件后读取该文件。
--help,-? 打印帮助信息
--auto-generate-sql,-a 用系统自动生成的sql测试。
--auto-generate-sql-add-autoincrement 对自动生成的表增加AUTO_INCREMENT自增列。
--auto-generate-sql-execute-number=# 自动生成查询的个数。
--auto-generate-sql-guid-primary 增加GUID-based主键。
--auto-generate-sql-load-type=name 指定导入测试数据的类型,包含: mixed,update,write,key,read;默认是mixed。
--auto-generate-sql-secondary-indexes=# 对自动生成的表增加二级索引的个数,默认是0。
--auto-generate-sql-unique-query-number=# 不同的查询数量,默认值是10。
--auto-generate-sql-unique-write-number=# 每个线程执行多少行插入,默认是100。
--auto-generate-sql-write-number=# 执行N个不同的插入语句,默认是10。
--commit=# 执行N条语句之后执行一次提交。
--compress,-C 如果服务器和客户端支持都压缩,则压缩信息传递。
--concurrency=name,-c 客户端连接的并发数。
--create=name 创建表的语句或包含sql语句的文件。
--create-schema=name 测试的schema,MySQL中schema也就是database
--csv[=name] 用逗号隔开格式的输出结果,没有指定输出到的文件就输出到标准输出。
--debug[=#],-# This is a non-debug version. Catch this and exit.
--debug-check 退出时检查内存及打开文件的信息。
--debug-info,-T 退出时要额外输出CPU以及内存的相关信息。
--default-auth=name Default authentication client-side plugin to use.
--delimiter=name,-F 文件中的SQL语句使用的分割符号。
--detach=# 执行N条语句后,断开连接并重连。
--enable-cleartext-plugin Enable/disable the clear text authentication plugin.
--engine=name,-e 测试存储引擎,如myisam,innodb等,可以有多个,用分隔符隔开。
--host=name,-h 远程主机IP
--iterations=#,-i 迭代测试的次数。
--no-drop Do not drop the schema after the test.
--number-char-cols=name,-x 创建的表内varchar列的数量(前提:指定--auto-generate-sql)
--number-int-cols=name,-y 创建的表内int列的数量(前提:指定--auto-generate-sql)
--number-of-queries=# 客户端执行查询的总量。
--only-print 只打印测试语句而不实际执行。
--password[=name],-p 连接mysql数据库的密码
--plugin-dir=name Directory for client-side plugins.
--port=#,-P 连接mysql数据库的端口
--post-query=name 测试完成以后执行的SQL语句的文件或者字符串,这个过程不影响时间计算
--post-system=name 测试完成以后执行的系统语句,这个过程不影响时间计算。
--pre-query=name 测试执行之前执行的SQL语句的文件或者字符串,这个过程不影响时间计算。
--pre-system=name 测试执行之前执行的系统语句,这个过程不影响时间计算。
--protocol=name The protocol to use for connection (tcp, socket, pipe, memory).
--query=name,-q 自定义的语句或包含sql语句的文件。
--silent,-s 只测试,不输出。
--socket=name,-S 连接数据库的socket文件位置。
--ssl Enable SSL for connection (automatically enabled wit other flags).
--ssl-ca=name CA file in PEM format (check OpenSSL docs, implies --ssl).
--ssl-capath=name CA directory (check OpenSSL docs, implies --ssl).
--ssl-cert=name X509 cert in PEM format (implies --ssl).
--ssl-cipher=name SSL cipher to use (implies --ssl).
--ssl-key=name X509 key in PEM format (implies --ssl).
--ssl-verify-server-cert Verify server's "Common Name" in its cert against hostname used when connecting. This option is disabled by default.
--user=name,-u 登陆mysql数据库的用户名。
--verbose,-v 输出更多的信息。
--version,-V 打印版本信息。
3 mysqlslap实践
3.1 自动语句测试
3.1.1 通过IP连接测试
- [root@localhost /]# /usr/local/mysql/bin/mysqlslap --defaults-file=/etc/my.cnf --concurrency=100,200 --iterations=1 --number-int-cols=8 --auto-generate-sql --auto-generate-sql-load-type=mixed --engine=myisam,innodb --number-of-queries=10000 -uroot -pjesse --number-char-cols=35 --auto-generate-sql-add-autoincrement --debug-info -P3355 -h192.168.1.100
- Benchmark
- Running for engine myisam
- Average number of seconds to run all queries: 1.078 seconds
- Minimum number of seconds to run all queries: 1.078 seconds
- Maximum number of seconds to run all queries: 1.078 seconds
- Number of clients running queries: 100
- Average number of queries per client: 100
- Benchmark
- Running for engine myisam
- Average number of seconds to run all queries: 1.134 seconds
- Minimum number of seconds to run all queries: 1.134 seconds
- Maximum number of seconds to run all queries: 1.134 seconds
- Number of clients running queries: 200
- Average number of queries per client: 50
- Benchmark
- Running for engine innodb
- Average number of seconds to run all queries: 2.305 seconds
- Minimum number of seconds to run all queries: 2.305 seconds
- Maximum number of seconds to run all queries: 2.305 seconds
- Number of clients running queries: 100
- Average number of queries per client: 100
- Benchmark
- Running for engine innodb
- Average number of seconds to run all queries: 2.999 seconds
- Minimum number of seconds to run all queries: 2.999 seconds
- Maximum number of seconds to run all queries: 2.999 seconds
- Number of clients running queries: 200
- Average number of queries per client: 50
- User time 1.44, System time 2.96
- Maximum resident set size 51964, Integral resident set size 0
- Non-physical pagefaults 6368, Physical pagefaults 0, Swaps 0
- Blocks in 0 out 0, Messages in 0 out 0, Signals 0
- Voluntary context switches 60713, Involuntary context switches 90
[root@localhost /]# /usr/local/mysql/bin/mysqlslap --defaults-file=/etc/my.cnf --concurrency=100,200 --iterations=1 --number-int-cols=8 --auto-generate-sql --auto-generate-sql-load-type=mixed --engine=myisam,innodb --number-of-queries=10000 -uroot -pjesse --number-char-cols=35 --auto-generate-sql-add-autoincrement --debug-info -P3355 -h192.168.1.100 Benchmark Running for engine myisam Average number of seconds to run all queries: 1.078 seconds Minimum number of seconds to run all queries: 1.078 seconds Maximum number of seconds to run all queries: 1.078 seconds Number of clients running queries: 100 Average number of queries per client: 100 Benchmark Running for engine myisam Average number of seconds to run all queries: 1.134 seconds Minimum number of seconds to run all queries: 1.134 seconds Maximum number of seconds to run all queries: 1.134 seconds Number of clients running queries: 200 Average number of queries per client: 50 Benchmark Running for engine innodb Average number of seconds to run all queries: 2.305 seconds Minimum number of seconds to run all queries: 2.305 seconds Maximum number of seconds to run all queries: 2.305 seconds Number of clients running queries: 100 Average number of queries per client: 100 Benchmark Running for engine innodb Average number of seconds to run all queries: 2.999 seconds Minimum number of seconds to run all queries: 2.999 seconds Maximum number of seconds to run all queries: 2.999 seconds Number of clients running queries: 200 Average number of queries per client: 50 User time 1.44, System time 2.96 Maximum resident set size 51964, Integral resident set size 0 Non-physical pagefaults 6368, Physical pagefaults 0, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 60713, Involuntary context switches 90
测试结果分析:
如第一组和第二组benchmark:使用mysam引擎,模拟100个客户端同时运行这些SQL语句(10000条),平均要花1.078秒,模拟200个客户端同时运行这些SQL语句(10000条),平均要花1.134秒,并发数越多,执行完所有查询的时间越长。为了准确起见,可以多迭代测试几次,如--iterations=5。
从第三组和第四组benchmark上看:使用事务型存储引擎innodb要比非事务型myisam存储引擎慢些。
3.1.2 通过SOCKET文件连接测试
- [root@localhost /]# /usr/local/mysql/bin/mysqlslap --defaults-file=/etc/my.cnf --concurrency=100,200 --iterations=1 --number-int-cols=8 --auto-generate-sql --auto-generate-sql-load-type=mixed --engine=myisam,innodb --number-of-queries=10000 -uroot -pjesse --number-char-cols=35 --auto-generate-sql-add-autoincrement --debug-info -S /usr/local/mysql/data/mysql.sock
- Benchmark
- Running for engine myisam
- Average number of seconds to run all queries: 1.077 seconds
- Minimum number of seconds to run all queries: 1.077 seconds
- Maximum number of seconds to run all queries: 1.077 seconds
- Number of clients running queries: 100
- Average number of queries per client: 100
- Benchmark
- Running for engine myisam
- Average number of seconds to run all queries: 1.076 seconds
- Minimum number of seconds to run all queries: 1.076 seconds
- Maximum number of seconds to run all queries: 1.076 seconds
- Number of clients running queries: 200
- Average number of queries per client: 50
- Benchmark
- Running for engine innodb
- Average number of seconds to run all queries: 2.242 seconds
- Minimum number of seconds to run all queries: 2.242 seconds
- Maximum number of seconds to run all queries: 2.242 seconds
- Number of clients running queries: 100
- Average number of queries per client: 100
- Benchmark
- Running for engine innodb
- Average number of seconds to run all queries: 3.154 seconds
- Minimum number of seconds to run all queries: 3.154 seconds
- Maximum number of seconds to run all queries: 3.154 seconds
- Number of clients running queries: 200
- Average number of queries per client: 50
- User time 1.46, System time 1.43
- Maximum resident set size 53252, Integral resident set size 0
- Non-physical pagefaults 6321, Physical pagefaults 0, Swaps 0
- Blocks in 0 out 0, Messages in 0 out 0, Signals 0
- Voluntary context switches 80876, Involuntary context switches 30
[root@localhost /]# /usr/local/mysql/bin/mysqlslap --defaults-file=/etc/my.cnf --concurrency=100,200 --iterations=1 --number-int-cols=8 --auto-generate-sql --auto-generate-sql-load-type=mixed --engine=myisam,innodb --number-of-queries=10000 -uroot -pjesse --number-char-cols=35 --auto-generate-sql-add-autoincrement --debug-info -S /usr/local/mysql/data/mysql.sock Benchmark Running for engine myisam Average number of seconds to run all queries: 1.077 seconds Minimum number of seconds to run all queries: 1.077 seconds Maximum number of seconds to run all queries: 1.077 seconds Number of clients running queries: 100 Average number of queries per client: 100 Benchmark Running for engine myisam Average number of seconds to run all queries: 1.076 seconds Minimum number of seconds to run all queries: 1.076 seconds Maximum number of seconds to run all queries: 1.076 seconds Number of clients running queries: 200 Average number of queries per client: 50 Benchmark Running for engine innodb Average number of seconds to run all queries: 2.242 seconds Minimum number of seconds to run all queries: 2.242 seconds Maximum number of seconds to run all queries: 2.242 seconds Number of clients running queries: 100 Average number of queries per client: 100 Benchmark Running for engine innodb Average number of seconds to run all queries: 3.154 seconds Minimum number of seconds to run all queries: 3.154 seconds Maximum number of seconds to run all queries: 3.154 seconds Number of clients running queries: 200 Average number of queries per client: 50 User time 1.46, System time 1.43 Maximum resident set size 53252, Integral resident set size 0 Non-physical pagefaults 6321, Physical pagefaults 0, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 80876, Involuntary context switches 30
3.2 自定义脚本测试
- [root@localhost /]# touch /tmp/create.sql /tmp/query.sql
- [root@localhost /]# vi /tmp/create.sql
- DROP TABLE IF EXISTS test.slaptable;
- CREATE TABLE test.slaptable (c1 varchar(32) primary key,c2 INT(32) ,c3 VARCHAR(50));
- INSERT INTO test.slaptable VALUES (uuid(),1804289383,'9DHOFilEREk3q7oce8O3BEJC0woJsm6uzFAEynLH2xCsw1L');
- INSERT INTO test.slaptable VALUES (uuid(),822890675, 'e83ro9w4jjteQg4yoo9xHck3WNqzs54W5zEm92ikdRF48BW');
- INSERT INTO test.slaptable VALUES (uuid(),1308044878,'LDC1vzJLkJXKn5onqOy04MTw1WksCYqPl2Jg2eteqOqTLfG');
- INSERT INTO test.slaptable VALUES (uuid(),964445884, 'q8G2ExJjz2o3KhnIJBbEJYFROTpO5pNvxgyBT9nSCbNO9Ai');
- INSERT INTO test.slaptable VALUES (uuid(),1586903190,'3DetH9j7Ixar90Jey5outd1ZIAJdJTjMaD7rMiqYXHFhHaB');
- INSERT INTO test.slaptable VALUES (uuid(),962033002, 'qYuHQbdrDND8lXqIdcNbAeWOBLZlpZOX5AoNlQFzpK7Qjxc');
- INSERT INTO test.slaptable VALUES (uuid(),1910858270,'rcIbCQWG4pf0yTZhaIT67nj7BY21FWJqaWrZxEh13Kt2hRb');
- INSERT INTO test.slaptable VALUES (uuid(),63299708, 'fetxWcJsXnxzxmsdhvoekFc5mSES8tyxvsuPK5Hjs7ihtaJ');
- INSERT INTO test.slaptable VALUES (uuid(),737703662, 'DWTXDkFSFHtte9bbDSwgZjmryHglLhqjAKEF4MkJfT49eXn');
[root@localhost /]# touch /tmp/create.sql /tmp/query.sql [root@localhost /]# vi /tmp/create.sql DROP TABLE IF EXISTS test.slaptable; CREATE TABLE test.slaptable (c1 varchar(32) primary key,c2 INT(32) ,c3 VARCHAR(50)); INSERT INTO test.slaptable VALUES (uuid(),1804289383,'9DHOFilEREk3q7oce8O3BEJC0woJsm6uzFAEynLH2xCsw1L'); INSERT INTO test.slaptable VALUES (uuid(),822890675, 'e83ro9w4jjteQg4yoo9xHck3WNqzs54W5zEm92ikdRF48BW'); INSERT INTO test.slaptable VALUES (uuid(),1308044878,'LDC1vzJLkJXKn5onqOy04MTw1WksCYqPl2Jg2eteqOqTLfG'); INSERT INTO test.slaptable VALUES (uuid(),964445884, 'q8G2ExJjz2o3KhnIJBbEJYFROTpO5pNvxgyBT9nSCbNO9Ai'); INSERT INTO test.slaptable VALUES (uuid(),1586903190,'3DetH9j7Ixar90Jey5outd1ZIAJdJTjMaD7rMiqYXHFhHaB'); INSERT INTO test.slaptable VALUES (uuid(),962033002, 'qYuHQbdrDND8lXqIdcNbAeWOBLZlpZOX5AoNlQFzpK7Qjxc'); INSERT INTO test.slaptable VALUES (uuid(),1910858270,'rcIbCQWG4pf0yTZhaIT67nj7BY21FWJqaWrZxEh13Kt2hRb'); INSERT INTO test.slaptable VALUES (uuid(),63299708, 'fetxWcJsXnxzxmsdhvoekFc5mSES8tyxvsuPK5Hjs7ihtaJ'); INSERT INTO test.slaptable VALUES (uuid(),737703662, 'DWTXDkFSFHtte9bbDSwgZjmryHglLhqjAKEF4MkJfT49eXn');3.2.2 创建测试脚本(查询)
- [root@localhost /]# vi /tmp/query.sql
- SELECT c2, c3 FROM test.slaptable;
- SELECT c2, c3 FROM test.slaptable;
- SELECT c2, c3 FROM test.slaptable;
- SELECT c2, c3 FROM test.slaptable;
- SELECT c2, c3 FROM test.slaptable;
- SELECT c2, c3 FROM test.slaptable;
- SELECT c2, c3 FROM test.slaptable;
- SELECT c2, c3 FROM test.slaptable;
- SELECT c2, c3 FROM test.slaptable;
- SELECT c2, c3 FROM test.slaptable;
[root@localhost /]# vi /tmp/query.sql SELECT c2, c3 FROM test.slaptable; SELECT c2, c3 FROM test.slaptable; SELECT c2, c3 FROM test.slaptable; SELECT c2, c3 FROM test.slaptable; SELECT c2, c3 FROM test.slaptable; SELECT c2, c3 FROM test.slaptable; SELECT c2, c3 FROM test.slaptable; SELECT c2, c3 FROM test.slaptable; SELECT c2, c3 FROM test.slaptable; SELECT c2, c3 FROM test.slaptable;3.2.3 通过自定义脚本进行测试
- [root@localhost /]# /usr/local/mysql/bin/mysqlslap --defaults-file=/etc/my.cnf --create=/tmp/create.sql --query=/tmp/query.sql --concurrency=10 --iterations=1000 --engine=innodb --number-of-queries=10 -ujesse -pjesse --debug-info -h192.168.1.100 -P3355
- Warning: Using a password on the command line interface can be insecure.
- Benchmark
- Running for engine innodb
- Average number of seconds to run all queries: 0.001 seconds
- Minimum number of seconds to run all queries: 0.001 seconds
- Maximum number of seconds to run all queries: 0.003 seconds
- Number of clients running queries: 10
- Average number of queries per client: 1
- User time 1.02, System time 4.84
- Maximum resident set size 4684, Integral resident set size 0
- Non-physical pagefaults 27156, Physical pagefaults 0, Swaps 0
- Blocks in 0 out 0, Messages in 0 out 0, Signals 0
- Voluntary context switches 73002, Involuntary context switches 2973
[root@localhost /]# /usr/local/mysql/bin/mysqlslap --defaults-file=/etc/my.cnf --create=/tmp/create.sql --query=/tmp/query.sql --concurrency=10 --iterations=1000 --engine=innodb --number-of-queries=10 -ujesse -pjesse --debug-info -h192.168.1.100 -P3355 Warning: Using a password on the command line interface can be insecure. Benchmark Running for engine innodb Average number of seconds to run all queries: 0.001 seconds Minimum number of seconds to run all queries: 0.001 seconds Maximum number of seconds to run all queries: 0.003 seconds Number of clients running queries: 10 Average number of queries per client: 1 User time 1.02, System time 4.84 Maximum resident set size 4684, Integral resident set size 0 Non-physical pagefaults 27156, Physical pagefaults 0, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 73002, Involuntary context switches 2973
4 mysqlslap使用小结
mysqlslap对于模拟多个用户同时对MySQL发起“进攻”提供了方便。同时详细的提供了“高负荷攻击MySQL”的详细数据报告。而且如果想同时对于多个不同引擎的性能做对比,这个工具再好不过了。