MySQL stress testing tool

A, MySQL comes with stress testing tool --Mysqlslap

mysqlslap is mysql's own benchmarking tool that query data, the syntax is simple, flexible and easy to use. The tool can simulate multiple clients concurrently issue a query to the server update, given the performance test data and provides a variety of Compare the performance of the engine. Before and after mysql performance optimization mysqlslap to provide an intuitive basis for verification, system operation and maintenance and DBA staff should have some common stress test tool, in order to accurately grasp the online user traffic and limit resistance to stress issues such as database support.

1, change the default maximum number of connections

Before MySQL pressure test, we need to change the default maximum number of connections, as follows:

[root@mysql data]# vim /etc/my.cnf      #编辑主配置文件
[mysqld]
   ............#省略部分内容
max_connections=1024

as follows:

MySQL stress testing tool

mysql> show variables like 'max_connections';     #查看最大连接数
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 1024  |
+-----------------+-------+
1 row in set (0.00 sec)

Stress testing:

[root@mysql ~]# mysqlslap --defaults-file=/etc/my.cnf --concurrency=100,200 --iterations=1 --number-int-cols=20 --number-char-cols=30 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --engine=myisam,innodb --number-of-queries=2000 -uroot -p123.com --verbose

Test description above command: an analog test two concurrent read and write, the first 100, second 200, automatically generates SQL scripts, init test table 20 contains fields 30
char s fields 2000 each query request execution. Test Engine are myisam, innodb. (There are many of these options are the default values can be omitted, if you want to understand explanation of each option, you can use mysqlslap --help query)

The above command returns the following results:

MySQL stress testing tool

Test results show: Myisam first client 100 initiates simultaneously with the investigation by 0.557 / s, while the second client 200 initiates a search by 0.522 / s Innodb first client 100 initiates a search by 0.256 / s at the same time, The client 200 while the second lookup initiated by 0.303 / s.

According to actual needs, a little bit of pressure to increase the number of concurrent tests.

Second, the use of third-party tools to stress test sysbench

1, the installation tool sysbench

[root@mysql ~]# yum -y install epel-release     #安装第三方epel源
[root@mysql ~]# yum -y install sysbench            #安装sysbench工具
[root@mysql ~]# sysbench --version           #确定工具已安装
sysbench 1.0.17

sysbench can perform the following tests:

  • CPU computing performance test
  • Disk IO performance test
  • Scheduler Performance Testing
  • Memory allocation and transmission speed test
  • POSIX thread performance test
  • Database performance test (OLTP benchmark, need Lua script execution / usr / share / sysbench / directory, for example oltp_read_only.lua script performs read-only test)
  • You specify your own Lua scripts to customize the test when sysbench can also run the command.

2, view sysbench tools help options

[root@mysql ~]# sysbench --help
Usage:
  sysbench [options]... [testname] [command]

Commands implemented by most tests: prepare run cleanup help # 可用的命令,四个

General options:            # 通用选项
  --threads=N                     要使用的线程数,默认 1 个 [1]
  --events=N                      最大允许的事件个数 [0]
  --time=N                        最大的总执行时间,以秒为单位 [10]
  --forced-shutdown=STRING        在 --time 时间限制到达后,强制关闭之前等待的秒数,默认“off”禁用(number of seconds to wait after the --time limit before forcing shutdown, or 'off' to disable) [off]
  --thread-stack-size=SIZE        每个线程的堆栈大小 [64K]
  --rate=N                        平均传输速率。0 则无限制 [0]
  --report-interval=N             以秒为单位定期报告具有指定间隔的中间统计信息 0 禁用中间报告 [0]
  --report-checkpoints=[LIST,...] 转储完整的统计信息并在指定的时间点重置所有计数器。参数是一个逗号分隔的值列表,表示从测试开始经过这个时间量时必须执行报告检查点(以秒为单位)。报告检查点默认关闭。 []
  --debug[=on|off]                打印更多 debug 信息 [off]
  --validate[=on|off]             尽可能执行验证检查 [off]
  --help[=on|off]                 显示帮助信息并退出 [off]
  --version[=on|off]              显示版本信息并退出 [off]
  --config-file=FILENAME          包含命令行选项的文件
  --tx-rate=N                     废弃,改用 --rate [0]
  --max-requests=N                废弃,改用 --events [0]
  --max-time=N                    废弃,改用 --time [0]
  --num-threads=N                 废弃,改用 --threads [1]

Pseudo-Random Numbers Generator options:    # 伪随机数发生器选项
  --rand-type=STRING random numbers distribution {uniform,gaussian,special,pareto} [special]
  --rand-spec-iter=N number of iterations used for numbers generation [12]
  --rand-spec-pct=N  percentage of values to be treated as 'special' (for special distribution) [1]
  --rand-spec-res=N  percentage of 'special' values to use (for special distribution) [75]
  --rand-seed=N      seed for random number generator. When 0, the current time is used as a RNG seed. [0]
  --rand-pareto-h=N  parameter h for pareto distribution [0.2]

Log options:    # 日志选项
  --verbosity=N verbosity level {5 - debug, 0 - only critical messages} [3]

  --percentile=N       percentile to calculate in latency statistics (1-100). Use the special value of 0 to disable percentile calculations [95]
  --histogram[=on|off] print latency histogram in report [off]

General database options:   # 通用的数据库选项

  --db-driver=STRING  指定要使用的数据库驱动程序 ('help' to get list of available drivers)
  --db-ps-mode=STRING prepared statements usage mode {auto, disable} [auto]
  --db-debug[=on|off] print database-specific debug information [off]

Compiled-in database drivers:   # 內建的数据库驱动程序,默认支持 MySQL 和 PostgreSQL
  mysql - MySQL driver
  pgsql - PostgreSQL driver

mysql options:              # MySQL 数据库专用选项
  --mysql-host=[LIST,...]          MySQL server host [localhost]
  --mysql-port=[LIST,...]          MySQL server port [3306]
  --mysql-socket=[LIST,...]        MySQL socket
  --mysql-user=STRING              MySQL user [sbtest]
  --mysql-password=STRING          MySQL password []
  --mysql-db=STRING                MySQL database name [sbtest]
  --mysql-ssl[=on|off]             use SSL connections, if available in the client library [off]
  --mysql-ssl-cipher=STRING        use specific cipher for SSL connections []
  --mysql-compression[=on|off]     use compression, if available in the client library [off]
  --mysql-debug[=on|off]           trace all client library calls [off]
  --mysql-ignore-errors=[LIST,...] list of errors to ignore, or "all" [1213,1020,1205]
  --mysql-dry-run[=on|off]         Dry run, pretend that all MySQL client API calls are successful without executing them [off]

pgsql options:              # PostgreSQL 数据库专用选项
  --pgsql-host=STRING     PostgreSQL server host [localhost]
  --pgsql-port=N          PostgreSQL server port [5432]
  --pgsql-user=STRING     PostgreSQL user [sbtest]
  --pgsql-password=STRING PostgreSQL password []
  --pgsql-db=STRING       PostgreSQL database name [sbtest]

Compiled-in tests:          # 內建测试类型
  fileio - File I/O test
  cpu - CPU performance test
  memory - Memory functions speed test
  threads - Threads subsystem performance test
  mutex - Mutex performance test

See 'sysbench <testname> help' for a list of options for each test.

3, sysbench test MySQL database performance

1) Prepare the test data

#查看sysbench自带的lua脚本使用方法
[root@mysql ~]# sysbench /usr/share/sysbench/oltp_common.lua help
#必须创建sbtest库,sbtest事sysbench默认使用的库名
[root@mysql ~]# mysqladmin -uroot -p123.com create sbtest;
#然后,准备测试所用的表,这些测试表放在测试库sbtest中。这里使用的lua脚本为/usr/share/sysbench/oltp_common.lua。
[root@mysql ~]# sysbench --mysql-host=127.0.0.1 \
> --mysql-port=3306 \
> --mysql-user=root \
> --mysql-password=123.com \
> /usr/share/sysbench/oltp_common.lua \
> --tables=10 \
> --table_size=100000 \
> prepare
#其中--tables=10表示创建10个测试表,
#--table_size=100000表示每个表中插入10W行数据,
#prepare表示这是准备数的过程。

2) to confirm the presence of the test data

[root@mysql ~]# mysql -uroot -p123.com sbtest;      #登录到sbtest库
mysql> show tables;       #查看相应的表
+------------------+
| Tables_in_sbtest |
+------------------+
| sbtest1          |
| sbtest10         |
| sbtest2          |
| sbtest3          |
| sbtest4          |
| sbtest5          |
| sbtest6          |
| sbtest7          |
| sbtest8          |
| sbtest9          |
+------------------+
10 rows in set (0.00 sec)
mysql> select count(*) from sbtest1;      #随机选择一个表,确认其有100000条数据
+----------+
| count(*) |
+----------+
|   100000 |
+----------+
1 row in set (0.01 sec)

3) database testing and results analysis

Statements prepared under slightly modified data before it can be used to test the.

Note that, before using lua script for oltp_common.lua, it is a generic script is invoked other lua script, it can not be directly used to test.

So, I am here to do with oltp_read_write.lua read the script, written test. There are many other types of tests, such as read-only test, write-only test, delete the test, high-volume insert the test and so on. You can find the corresponding lua scripts can be called.

#执行测试命令如下:
[root@mysql ~]# sysbench --threads=4 \
> --time=20 \
> --report-interval=5 \
> --mysql-host=127.0.0.1 \
> --mysql-port=3306 \
> --mysql-user=root \
> --mysql-password=123.com \
> /usr/share/sysbench/oltp_read_write.lua \
> --tables=10 \
> --table_size=100000 \
> run

Returns the result of the command is as follows:

[root@mysql ~]# sysbench --threads=4 --time=20 --report-interval=5 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123.com /usr/share/sysbench/oltp_read_write.lua --tables=10 --table_size=100000 run
sysbench 1.0.17 (using system LuaJIT 2.0.4)

Running the test with following options:
Number of threads: 4
Report intermediate results every 5 second(s)
Initializing random number generator from current time

Initializing worker threads...

Threads started!

#以下是每5秒返回一次的结果,统计的指标包括:
# 线程数、tps(每秒事务数)、qps(每秒查询数)、
# 每秒的读/写/其它次数、延迟、每秒错误数、每秒重连次数
[ 5s ] thds: 4 tps: 675.29 qps: 13513.94 (r/w/o: 9460.62/2701.95/1351.37) lat (ms,95%): 8.58 err/s: 0.00 reconn/s: 0.00
[ 10s ] thds: 4 tps: 679.05 qps: 13586.79 (r/w/o: 9511.29/2717.40/1358.10) lat (ms,95%): 8.58 err/s: 0.00 reconn/s: 0.00
[ 15s ] thds: 4 tps: 676.82 qps: 13538.23 (r/w/o: 9476.70/2707.69/1353.84) lat (ms,95%): 8.74 err/s: 0.20 reconn/s: 0.00
[ 20s ] thds: 4 tps: 684.62 qps: 13692.11 (r/w/o: 9585.02/2737.86/1369.23) lat (ms,95%): 8.43 err/s: 0.00 reconn/s: 0.00
SQL statistics:
    queries performed:
        read:                            190190   # 执行的读操作数量
        write:                           54337    # 执行的写操作数量
        other:                           27169    # 执行的其它操作数量
        total:                           271696
    transactions:                        13584  (678.88 per sec.)    # 执行事务的平均速率
    queries:                             271696 (13578.35 per sec.)   # 平均每秒能执行多少次查询
    ignored errors:                      1      (0.05 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          20.0084s    # 总消耗时间
    total number of events:              13584    # 总请求数量(读、写、其它)

Latency (ms):
         min:                                    2.68
         avg:                                    5.89
         max:                                   38.21
         95th percentile:                        8.58    # 采样计算的平均延迟

         sum:                                79985.65

Threads fairness:
    events (avg/stddev):           3396.0000/60.84
    execution time (avg/stddev):   19.9964/0.00

4, cpu / io / test memory, etc.

sysbench built several test indicators are as follows:

[root@mysql ~]# sysbench --help
      ..........  # 省略部分内容
Compiled-in tests:
  fileio - File I/O test
  cpu - CPU performance test
  memory - Memory functions speed test
  threads - Threads subsystem performance test
  mutex - Mutex performance test

Help direct output test method, e.g., FileIO test:

[root@mysql ~]# sysbench fileio help
sysbench 1.0.17 (using system LuaJIT 2.0.4)

fileio options:
  --file-num=N                  number of files to create [128]
  --file-block-size=N           block size to use in all IO operations [16384]
  --file-total-size=SIZE        total size of files to create [2G]
  --file-test-mode=STRING       test mode {seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw}
  --file-io-mode=STRING         file operations mode {sync,async,mmap} [sync]
  --file-async-backlog=N        number of asynchronous operatons to queue per thread [128]
  --file-extra-flags=[LIST,...] list of additional flags to use to open files {sync,dsync,direct} []
  --file-fsync-freq=N           do fsync() after this number of requests (0 - don't use fsync()) [100]
  --file-fsync-all[=on|off]     do fsync() after each write operation [off]
  --file-fsync-end[=on|off]     do fsync() at the end of test [on]
  --file-fsync-mode=STRING      which method to use for synchronization {fsync, fdatasync} [fsync]
  --file-merged-requests=N      merge at most this number of IO requests if possible (0 - don't merge) [0]
  --file-rw-ratio=N             reads/writes ratio for combined test [1.5]

1) test io performance

For example, create five files, a total of 2G, each file is probably 400M.

[root@mysql ~]# sysbench fileio --file-num=5 --file-total-size=2G prepare
[root@mysql ~]# ll -lh test*
-rw------- 1 root root 410M 1月   2 18:47 test_file.0
-rw------- 1 root root 410M 1月   2 18:47 test_file.1
-rw------- 1 root root 410M 1月   2 18:48 test_file.2
-rw------- 1 root root 410M 1月   2 18:48 test_file.3
-rw------- 1 root root 410M 1月   2 18:48 test_file.4

Then run the test:

[root@mysql ~]# sysbench --events=5000 \
> --threads=16 \
> fileio \
> --file-num=5 \
> --file-total-size=2G \
> --file-test-mode=rndrw \
> --file-fsync-freq=0 \
> --file-block-size=16384 \
> run

Returned results are as follows:

Initializing worker threads...

Threads started!

File operations:
    reads/s:                      6374.88
    writes/s:                     4271.21
    fsyncs/s:                     170.34

Throughput:           #吞吐量
    read, MiB/s:                  99.61          #表示读带宽
    written, MiB/s:               66.74             #表示写的带宽

General statistics:
    total time:                          0.4684s
    total number of events:              5000

Latency (ms):
         min:                                    0.00
         avg:                                    0.99
         max:                                   50.64
         95th percentile:                        4.74
         sum:                                 4940.23

Threads fairness:
    events (avg/stddev):           312.5000/15.32
    execution time (avg/stddev):   0.3088/0.01

2) test cpu performance

[root@mysql ~]# sysbench cpu --threads=40 --events=10000 --cpu-max-prime=20000 run

-------- end of this article so far, thanks for reading --------

Guess you like

Origin blog.51cto.com/14154700/2463918