sysbench 对mysql进行基准测试

Posted on Posted in mysql

> 安装

  1. [root@iZ25trmqls5Z ~]# cd /usr/src  
  2. [root@iZ25trmqls5Z src]# unzip sysbench-0.5.zip  
  3. [root@iZ25trmqls5Z src]# cd sysbench-0.5  
  4. [root@iZ25trmqls5Z sysbench-0.5]# ./autogen.sh  
  5. [root@iZ25trmqls5Z sysbench-0.5]# ./configure --prefix=/usr/local/sysbench --with-mysql-includes=/usr/local/mysql/include --with-mysql-libs=/usr/local/mysql/lib  
  6.   
  7. [root@iZ25trmqls5Z sysbench-0.5]# make  
  8. /usr/bin/ld: cannot find -lmysqlclient_r  
  9. collect2: ld returned 1 exit status  
  10. make[2]: *** [sysbench] Error 1  
  11. make[2]: Leaving directory `/usr/src/sysbench-0.5/sysbench'  
  12. make[1]: *** [all-recursive] Error 1  
  13. make[1]: Leaving directory `/usr/src/sysbench-0.5/sysbench'  
  14. make: *** [all-recursive] Error 1  
  15.   
  16. #报错,解决  
  17. #下载网址 http://mirror.cogentco.com/pub/mysql/MySQL-5.7/MySQL-shared-5.7.4_m14-1.el6.x86_64.rpm  
  18. [root@iZ25trmqls5Z sysbench-0.5]# rpm -ivh MySQL-shared-5.7.4_m14-1.el6.x86_64.rpm  
  19. [root@iZ25trmqls5Z sysbench-0.5]# make && make install  
  20. [root@iZ25trmqls5Z sysbench-0.5]# cd /usr/local/sysbench/  
  21. [root@iZ25trmqls5Z sysbench]# mkdir -p share/tests/db  
  22. [root@iZ25trmqls5Z sysbench]# cp /usr/src/sysbench-0.5/sysbench/tests/db/*.lua share/tests/db/  
  23. [root@iZ25trmqls5Z sysbench]# bin/sysbench --version  
  24. sysbench 0.5  
  25. [root@iZ25trmqls5Z sysbench]# mysql -h 10.10.10.10 -uuser -ppassowrd -e "create database dbtest;"  

> select

非事务只读测试
10个表,50W数据量,200个线程,持续120s

  1. bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.10.10.10 --mysql-port=3306 --mysql-user=username --mysql-password=password --mysql-db=dbtest --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --oltp-dist-type=uniform --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=on --oltp-skip-trx=on --max-time=120 --num-threads=200 prepare  
  2.   
  3. bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.10.10.10 --mysql-port=3306 --mysql-user=username --mysql-password=password --mysql-db=dbtest --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --oltp-dist-type=uniform --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=on --oltp-skip-trx=on --max-time=120 --num-threads=200 run  
  4.   
  5. bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.10.10.10 --mysql-port=3306 --mysql-user=username --mysql-password=password --mysql-db=dbtest --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --oltp-dist-type=uniform --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=on --oltp-skip-trx=on --max-time=120 --num-threads=200 cleanup  

一项测试开始前需要用prepare来准备好表和数据,run执行真正的压测,cleanup用来清除数据和表。表结构

  1. mysql> desc sbtest1;  
  2. +-------+------------------+------+-----+---------+----------------+  
  3. | Field | Type             | Null | Key | Default | Extra          |  
  4. +-------+------------------+------+-----+---------+----------------+  
  5. | id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |  
  6. | k     | int(10) unsigned | NO   | MUL | 0       |                |  
  7. | c     | char(120)        | NO   |     |         |                |  
  8. | pad   | char(60)         | NO   |     |         |                |  
  9. +-------+------------------+------+-----+---------+----------------+  
  10. 4 rows in set (0.11 sec)  

> 选项

* mysql-db=dbtest1a:测试使用的目标数据库,这个库名要事先创建
* --oltp-tables-count=10:产生表的数量
* --oltp-table-size=500000:每个表产生的记录行数
* --oltp-dist-type=uniform:指定随机取样类型,可选值有 uniform(均匀分布), Gaussian(高斯分布), special(空间分布)。默认是special
* --oltp-read-only=off:表示不止产生只读SQL,也就是使用oltp.lua时会采用读写混合模式。默认 off,如果设置为on,则不会产生update,delete,insert的sql。
* --oltp-test-mode=nontrx :执行模式,这里是非事务式的。可选值有simple,complex,nontrx。默认是complex
simple:简单查询,SELECT c FROM sbtest WHERE id=N
complex (advanced transactional):事务模式在开始和结束事务之前加上begin和commit, 一个事务里可以有多个语句,如点查询、范围查询、排序查询、更新、删除、插入等,并且为了不破坏测试表的数据,该模式下一条记录删除后会在同一个事务里添加一条相同的记录。
nontrx (non-transactional):与simple相似,但是可以进行update/insert等操作,所以如果做连续的对比压测,你可能需要重新cleanup,prepare。
* --oltp-skip-trx=[on|off]:省略begin/commit语句。默认是off
* --rand-init=on:是否随机初始化数据,如果不随机化那么初始好的数据每行内容除了主键不同外其他完全相同
* --num-threads=12: 并发线程数,可以理解为模拟的客户端并发连接数
* --report-interval=10:表示每10s输出一次测试进度报告
* --max-requests=0:压力测试产生请求的总数,如果以下面的max-time来记,这个值设为0
* --max-time=120:压力测试的持续时间,这里是2分钟。

针对不同的选项取值就会有不同的子选项。比如oltp-dist-type=special,就有比如oltp-dist-pct=1、oltp-dist-res=50两个子选项,代表有50%的查询落在1%的行(即热点数据)上,另外50%均匀的(sample uniformly)落在另外99%的记录行上。

再比如oltp-test-mode=nontrx时, 就可以有oltp-nontrx-mode,可选值有select(默认), update_key, update_nokey, insert, delete,代表非事务式模式下使用的测试sql类型。

以上代表的是一个只读的例子,可以把num-threads依次递增(16,36,72,128,256,512),或者调整my.cnf参数,比较效果。另外需要注意的是,大部分mysql中间件对事务的处理,默认都是把sql发到主库执行,所以只读测试需要加上oltp-skip-trx=on来跳过测试中的显式事务。

  1. [  10s] threads: 200, tps: 0.00, reads: 2548.32, writes: 0.00, response time: 2966.78ms (95%), errors: 0.00, reconnects:  0.00  
  2. [  20s] threads: 200, tps: 0.00, reads: 2765.70, writes: 0.00, response time: 2482.01ms (95%), errors: 0.00, reconnects:  0.00  
  3. [  30s] threads: 200, tps: 0.00, reads: 2764.70, writes: 0.00, response time: 2499.16ms (95%), errors: 0.00, reconnects:  0.00  
  4. [  40s] threads: 200, tps: 0.00, reads: 2496.00, writes: 0.00, response time: 2888.78ms (95%), errors: 0.00, reconnects:  0.00  
  5. [  50s] threads: 200, tps: 0.00, reads: 3034.41, writes: 0.00, response time: 2043.78ms (95%), errors: 0.00, reconnects:  0.00  
  6. [  60s] threads: 200, tps: 0.00, reads: 2990.30, writes: 0.00, response time: 1244.20ms (95%), errors: 0.00, reconnects:  0.00  
  7. [  70s] threads: 200, tps: 0.00, reads: 2992.60, writes: 0.00, response time: 1212.22ms (95%), errors: 0.00, reconnects:  0.00  
  8. [  80s] threads: 200, tps: 0.00, reads: 2974.90, writes: 0.00, response time: 1237.89ms (95%), errors: 0.00, reconnects:  0.00  
  9. [  90s] threads: 200, tps: 0.00, reads: 2952.30, writes: 0.00, response time: 1201.74ms (95%), errors: 0.00, reconnects:  0.00  
  10. [ 100s] threads: 200, tps: 0.00, reads: 2932.30, writes: 0.00, response time: 1273.98ms (95%), errors: 0.00, reconnects:  0.00  
  11. [ 110s] threads: 200, tps: 0.00, reads: 2935.70, writes: 0.00, response time: 1565.78ms (95%), errors: 0.00, reconnects:  0.00  
  12. [ 120s] threads: 200, tps: 0.00, reads: 2986.60, writes: 0.00, response time: 1360.70ms (95%), errors: 0.00, reconnects:  0.00  
  13.   
  14. OLTP test statistics:  
  15.     queries performed:  
  16.         read:                            344750 //总select数量  
  17.         write:                           0  //总update、insert、delete语句数量  
  18.         other:                           0  //commit、unlock tables以及其他mutex的数量  
  19.         total:                           344750  
  20.     transactions:                        0      (0.00 per sec.) //通常需要关注的数字(TPS)  
  21.     read/write requests:                 344750 (2859.57 per sec.)  
  22.     other operations:                    0      (0.00 per sec.)  
  23.     ignored errors:                      0      (0.00 per sec.) //忽略的错误数  
  24.     reconnects:                          0      (0.00 per sec.)  
  25.   
  26. General statistics:  
  27.     total time:                          120.5600s  //即max-time指定的压测实际  
  28.     total number of events:              24625  //总的事件数,一般与transactions相同  
  29.     total time taken by event execution: 24055.2123s  
  30.     response time:  
  31.          min:                                  6.98ms  
  32.          avg:                                976.86ms   //95%的语句的平均响应时间  
  33.          max:                               8076.66ms  
  34.          approx.  95 percentile:            1954.62ms  
  35.   
  36. Threads fairness:  
  37.     events (avg/stddev):           123.1250/5.78  
  38.     execution time (avg/stddev):   120.2761/0.15  

> read / write

读写测试还是用oltp.lua,只需把--oltp-read-only等于off

  1. bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.10.10.10 --mysql-port=3306 --mysql-user=username --mysql-password=password --mysql-db=dbtest --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --oltp-dist-type=uniform --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --oltp-skip-trx=on --max-time=120 --num-threads=200 prepare  
  2.   
  3. bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.10.10.10 --mysql-port=3306 --mysql-user=username --mysql-password=password --mysql-db=dbtest --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --oltp-dist-type=uniform --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --oltp-skip-trx=on --max-time=120 --num-threads=200 run  
  4.   
  5. bin/sysbench --test=./share/tests/db/oltp.lua --mysql-host=10.10.10.10 --mysql-port=3306 --mysql-user=username --mysql-password=password --mysql-db=dbtest --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=10 --oltp-dist-type=uniform --rand-init=on --max-requests=0 --oltp-test-mode=nontrx --oltp-nontrx-mode=select --oltp-read-only=off --oltp-skip-trx=on --max-time=120 --num-threads=200 cleanup  

上面示例中的--oltp-test-mode=nontrx --oltp-nontrx-mode=select可以删掉

  1. [  10s] threads: 200, tps: 0.00, reads: 953.75, writes: 229.09, response time: 4942.39ms (95%), errors: 0.00, reconnects:  0.00  
  2. [  20s] threads: 200, tps: 0.00, reads: 757.20, writes: 212.30, response time: 7341.73ms (95%), errors: 0.00, reconnects:  0.00  
  3. [  30s] threads: 200, tps: 0.00, reads: 672.40, writes: 202.60, response time: 7363.74ms (95%), errors: 0.00, reconnects:  0.00  
  4. [  40s] threads: 200, tps: 0.00, reads: 745.70, writes: 212.60, response time: 6902.69ms (95%), errors: 0.00, reconnects:  0.00  
  5. [  50s] threads: 200, tps: 0.00, reads: 799.10, writes: 217.40, response time: 6528.87ms (95%), errors: 0.00, reconnects:  0.00  
  6. [  60s] threads: 200, tps: 0.00, reads: 728.40, writes: 203.50, response time: 7403.53ms (95%), errors: 0.00, reconnects:  0.00  
  7. [  70s] threads: 200, tps: 0.00, reads: 677.50, writes: 188.50, response time: 6372.47ms (95%), errors: 0.00, reconnects:  0.00  
  8. [  80s] threads: 200, tps: 0.00, reads: 643.90, writes: 187.40, response time: 6873.82ms (95%), errors: 0.00, reconnects:  0.00  
  9. [  90s] threads: 200, tps: 0.00, reads: 481.70, writes: 144.90, response time: 7727.32ms (95%), errors: 0.00, reconnects:  0.00  
  10. [ 100s] threads: 200, tps: 0.00, reads: 717.80, writes: 203.90, response time: 6542.57ms (95%), errors: 0.00, reconnects:  0.00  
  11. [ 110s] threads: 200, tps: 0.00, reads: 573.90, writes: 168.50, response time: 8539.83ms (95%), errors: 0.00, reconnects:  0.00  
  12. [ 120s] threads: 200, tps: 0.00, reads: 733.80, writes: 206.90, response time: 6212.38ms (95%), errors: 0.00, reconnects:  0.00  
  13. OLTP test statistics:  
  14.     queries performed:  
  15.         read:                            85148  
  16.         write:                           24328  
  17.         other:                           0  
  18.         total:                           109476  
  19.     transactions:                        0      (0.00 per sec.)  
  20.     read/write requests:                 109476 (903.54 per sec.)  
  21.     other operations:                    0      (0.00 per sec.)  
  22.     ignored errors:                      0      (0.00 per sec.)  
  23.     reconnects:                          0      (0.00 per sec.)  
  24.   
  25. General statistics:  
  26.     total time:                          121.1632s  
  27.     total number of events:              6082  
  28.     total time taken by event execution: 24151.8467s  
  29.     response time:  
  30.          min:                                 73.06ms  
  31.          avg:                               3971.04ms  
  32.          max:               &nb
    sp;              11926.46ms  
  33.          approx.  95 percentile:            7093.30ms  
  34.   
  35. Threads fairness:  
  36.     events (avg/stddev):           30.4100/2.20  
  37.     execution time (avg/stddev):   120.7592/0.12  

> update

  1. [  10s] threads: 200, tps: 0.00, reads: 0.00, writes: 441.94, response time: 1707.27ms (95%), errors: 0.00, reconnects:  0.00  
  2. [  20s] threads: 200, tps: 0.00, reads: 0.00, writes: 382.00, response time: 1481.88ms (95%), errors: 0.00, reconnects:  0.00  
  3. [  30s] threads: 200, tps: 0.00, reads: 0.00, writes: 317.10, response time: 1713.93ms (95%), errors: 0.00, reconnects:  0.00  
  4. [  40s] threads: 200, tps: 0.00, reads: 0.00, writes: 339.50, response time: 1493.01ms (95%), errors: 0.00, reconnects:  0.00  
  5. [  50s] threads: 200, tps: 0.00, reads: 0.00, writes: 284.90, response time: 2026.72ms (95%), errors: 0.00, reconnects:  0.00  
  6. [  60s] threads: 200, tps: 0.00, reads: 0.00, writes: 276.50, response time: 1896.98ms (95%), errors: 0.00, reconnects:  0.00  
  7. [  70s] threads: 200, tps: 0.00, reads: 0.00, writes: 214.60, response time: 1855.42ms (95%), errors: 0.00, reconnects:  0.00  
  8. [  80s] threads: 200, tps: 0.00, reads: 0.00, writes: 188.50, response time: 2508.15ms (95%), errors: 0.00, reconnects:  0.00  
  9. [  90s] threads: 200, tps: 0.00, reads: 0.00, writes: 233.60, response time: 1873.84ms (95%), errors: 0.00, reconnects:  0.00  
  10. [ 100s] threads: 200, tps: 0.00, reads: 0.00, writes: 250.80, response time: 1978.76ms (95%), errors: 0.00, reconnects:  0.00  
  11. [ 110s] threads: 200, tps: 0.00, reads: 0.00, writes: 230.20, response time: 2158.85ms (95%), errors: 0.00, reconnects:  0.00  
  12. [ 120s] threads: 200, tps: 0.00, reads: 0.00, writes: 244.70, response time: 2133.16ms (95%), errors: 0.00, reconnects:  0.00  
  13. OLTP test statistics:  
  14.     queries performed:  
  15.         read:                            0  
  16.         write:                           34246  
  17.         other:                           0  
  18.         total:                           34246  
  19.     transactions:                        0      (0.00 per sec.)  
  20.     read/write requests:                 34246  (281.98 per sec.)  
  21.     other operations:                    0      (0.00 per sec.)  
  22.     ignored errors:                      0      (0.00 per sec.)  
  23.     reconnects:                          0      (0.00 per sec.)  
  24.   
  25. General statistics:  
  26.     total time:                          121.4499s  
  27.     total number of events:              34246  
  28.     total time taken by event execution: 24193.7190s  
  29.     response time:  
  30.          min:                                  5.11ms  
  31.          avg:                                706.47ms  
  32.          max:                 &nbs
    p;             5795.96ms  
  33.          approx.  95 percentile:            1848.77ms  
  34.   
  35. Threads fairness:  
  36.     events (avg/stddev):           171.2300/8.06  
  37.     execution time (avg/stddev):   120.9686/0.47  

> error

  1. --mysql-ignore-errors=1062  
» 转载请注明来源:若我若鱼 » sysbench 对mysql进行基准测试

Leave a Reply

Your email address will not be published. Required fields are marked *

twenty − 8 =