MYSQL基准测试工具

本文主要是记录下自己熟悉MYSQL基准测试工具的历程,没涉及到任何生产环境。

1.benchmark

首先用到的肯定是BENCHMARK()函数了,它可以测试特定操作的执行速度.参数是执行的次数和表达式.该函数可以方便的测试某些特定操作的性能。比如md5函数比sha1快

mysql> set @input := 'Im leo';
Query OK, 0 rows affected (0.00 sec)

mysql> select benchmark(10000000, md5(@input));
+----------------------------------+
| benchmark(10000000, md5(@input)) |
+----------------------------------+
|                                0 |
+----------------------------------+
1 row in set (2.88 sec)

mysql> select benchmark(10000000, sha1(@input));   
+-----------------------------------+
| benchmark(10000000, sha1(@input)) |
+-----------------------------------+
|                                 0 |
+-----------------------------------+
1 row in set (4.05 sec)

在高性能MYSQL上看到,表达式必须包含用户自定义的变量,否则多次执行同样的表达式会因为系统缓存命中而影响结果。但经过多次测试也没发现有多少影响

2.sql-bench

 sql-bench是一组基于perl开发的测试工具组成。在sql-bench子目录中包含了该工具。老规矩,先看看README就知道怎么操作了

执行

./run-all-tests --server=mysql --cmp=mysql,pg,solid --user=root --password=password--log

第一执行,

Can't locate DBI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./run-all-tests line 37.
一看就知道缺少perl的DBI,于是 yum search perl-DBI

第二次执行

Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 56) line 3.
百度下,这次执行 perl-DBD-MySQL.x86_64

第三次执行

Got error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)' when connecting to DBI:mysql:database=test;host=localhost;mysql_read_default_file=/alidata/server/mysql/my.cnf with user: 'root' password: 'xxxxx'
在/var/lib/下建个mysql目录 cp -s就行。

第四次执行,这次没问题。但悲剧了,书上介绍运行全部测试要一个多小时,我没信......还是先抽根烟,等等。

Time for select_range_prefix (20000:43500):  3 wallclock secs ( 0.96 usr  0.12 sys +  0.00 cusr  0.00 csys =  1.08 CPU)
Time for select_range_key2 (20000:43500):  3 wallclock secs ( 0.97 usr  0.13 sys +  0.00 cusr  0.00 csys =  1.10 CPU)
Time for select_group (101):  6 wallclock secs ( 0.01 usr  0.00 sys +  0.00 cusr  0.00 csys =  0.01 CPU)

全部测试测试主要显示是CPU耗费的资源,包括用户,系统的占用情况

enerating random keys
Creating tables
Inserting 100000 rows in order
Inserting 100000 rows in reverse order
Inserting 100000 rows in random order
Time for insert (300000): 1372 wallclock secs ( 7.23 usr  3.42 sys +  0.00 cusr  0.00 csys = 10.65 CPU)
Testing insert of duplicates
Time for insert_duplicates (100000): 12 wallclock secs ( 2.66 usr  1.18 sys +  0.00 cusr  0.00 csys =  3.84 CPU)
展示一部分测试结果

3.sysbench

sysbench不仅可以测试数据库的性能还可以测试运行数据库服务器的性能

测试CPU

 /usr/local/bin/sysbench --test=cpu --cpu-max-prime=20000 run
Test execution summary:
    total time:                          37.4243s
    total number of events:              10000
    total time taken by event execution: 37.4222
    per-request statistics:
         min:                                  3.69ms
         avg:                                  3.74ms
         max:                                 10.87ms
         approx.  95 percentile:               3.79ms


Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   37.4222/0.00
sysbench的文件I/O基准测试

文件I/O基准测试可以测试系统在不同I/O下的性能,这对于比较不同硬盘驱动器,不同的RAID卡,不同的RAID模式都很有帮助

首先创建数据集

/usr/local/bin/sysbench --test=fileio --file-total-size=200M prepare
sysbench 0.4.10:  multi-threaded system evaluation benchmark

128 files, 1600Kb each, 200Mb total
第二步就是运行阶段

  • seqwr 顺序写入
  • seqrewr 顺序重写
  • seqrd 顺序读取
  • rndrd随机读取
  • rndwr随机写入
  • rndrw混合随机读写

运行

/usr/local/bin/sysbench --test=fileio --file-total-size=200M --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 run 

测试结果

Operations performed:  202543 Read, 135028 Write, 432000 Other = 769571 Total
Read 3.0906Gb  Written 2.0604Gb  Total transferred 5.1509Gb  (17.58Mb/sec)
 1125.15 Requests/sec executed

Test execution summary:
    total time:                          300.0237s
    total number of events:              337571
    total time taken by event execution: 68.7907
    per-request statistics:
         min:                                  0.00ms
         avg:                                  0.20ms
         max:                                 16.85ms
         approx.  95 percentile:               1.55ms

Threads fairness:
    events (avg/stddev):           337571.0000/0.00
    execution time (avg/stddev):   68.7907/0.00
测试结果中包含了每秒请求数(1125.15),吞吐量(17.58Mb)请求大大约95%的时间分布

最后一步清楚数据

sysbench的OLTP基准测试

OLTP的基准测试模拟一个简单的事物处理系统的工作负载

首先生成一张表(先确认db是否存在)

/usr/local/bin/sysbench --test=oltp --oltp-table-name=sysbench --oltp-table-size=1000000 --mysql-db=leo --mysql-user=root --mysql-password=xxxxx --db-driver=innodb  prepare
然后运行

/usr/local/bin/sysbench --test=oltp --oltp-table-name=sysbench --oltp-table-size=100000 --mysql-db=leo --mysql-user=root --mysql-password=xxxx --max-time=60 --oltp-read-only=on --max-requests=0 --num-threads=2 --db-driver=innodb run   

结果

OLTP test statistics:
    queries performed:
        read:                            447482
        write:                           0
        other:                           63926
        total:                           511408
    transactions:                        31963  (532.71 per sec.)
    deadlocks:                           0      (0.00 per sec.)
    read/write requests:                 447482 (7457.89 per sec.)
    other operations:                    63926  (1065.41 per sec.)

Test execution summary:
    total time:                          60.0011s
    total number of events:              31963
    total time taken by event execution: 119.8510
    per-request statistics:
         min:                                  1.77ms
         avg:                                  3.75ms
         max:                                 25.34ms
         approx.  95 percentile:               4.04ms

Threads fairness:
    events (avg/stddev):           15981.5000/126.50
    execution time (avg/stddev):   59.9255/0.00

其中有价值的信息如下

  • 总的事务数
  • 每秒实务数
  • 时间统计信息(最小,平均,最大响应时间,以及95%百分比响应时间)
  • 线程公平性统计(thread-fairness),用来表示模拟负载的公平性


参考书籍:高性能MYSQL


你可能感兴趣的:(MYSQL)