如何用 Sysbench 实现简单负载

Sysbench 是数据库测试中常使用的工具。1.0 版本以后,它支持了更强大的自定义功能。可以让使用者方便的编写一些 lua 脚本来模拟负载。 写这篇文章的目的,一是本来就想研究下 Sysbench 自定义负载的用法,二是,因为看到了 MySQL 官方给出的 mysqlslap 工具,试用了一下,发现随随便便就 hang 死在那,在数据库性能测试中, 会让用户误认为是数据库有问题,坑了不少人,所以,想让大家少踩坑吧。

一个简单的例子

#!/usr/bin/env sysbench

require("oltp_common")

function prepare_statements()
end

function event()
    con:query("set autocommit = 1")
end

第一行 require 将 Sysbench 自带的基础库包含进来; 空的 prepare_statementoltp_common 的回调函数,必须要有; 具体单次负载如何执行就是后面的 event 函数里实现了。

把这段脚本保存为一个 lua 文件,比如叫 set.lua,然后用 sysbench 执行它就可以了。

sysbench --config-file=config --threads=100 set.lua --tables=1 --table_size=1000000 run

比如用上述命令。当然这里 --tables=1--table_size=1000000 对于这个负载都是没什么用的,不填也行,--threads 控制并发度。

$ cat config
time=120
db-driver=mysql
mysql-host=172.16.5.33
mysql-port=34000
mysql-user=root
mysql-db=sbtest
report-interval=10

config 文件里就是把不常调整的参数一次性写进去,避免命令行里一长串参数。这些都是必填项目,time 代表测试时长,report-interval 用来观测实时性能结果, 其他的都是如何连接数据库。

跑起来的样子基本就是:

[ 10s ] thds: 100 tps: 94574.34 qps: 94574.34 (r/w/o: 0.00/0.00/94574.34) lat (ms,95%): 3.68 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 100 tps: 77720.30 qps: 77720.30 (r/w/o: 0.00/0.00/77720.30) lat (ms,95%): 5.28 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 100 tps: 56080.10 qps: 56080.10 (r/w/o: 0.00/0.00/56080.10) lat (ms,95%): 9.22 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 100 tps: 93315.90 qps: 93315.90 (r/w/o: 0.00/0.00/93315.90) lat (ms,95%): 4.82 err/s: 0.00 reconn/s: 0.00
[ 50s ] thds: 100 tps: 97491.02 qps: 97491.02 (r/w/o: 0.00/0.00/97491.02) lat (ms,95%): 4.65 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 100 tps: 94034.27 qps: 94034.27 (r/w/o: 0.00/0.00/94034.27) lat (ms,95%): 4.91 err/s: 0.00 reconn/s: 0.00
[ 70s ] thds: 100 tps: 74707.37 qps: 74707.37 (r/w/o: 0.00/0.00/74707.37) lat (ms,95%): 6.79 err/s: 0.00 reconn/s: 0.00
[ 80s ] thds: 100 tps: 89485.10 qps: 89485.10 (r/w/o: 0.00/0.00/89485.10) lat (ms,95%): 5.18 err/s: 0.00 reconn/s: 0.00
[ 90s ] thds: 100 tps: 109296.44 qps: 109296.44 (r/w/o: 0.00/0.00/109296.44) lat (ms,95%): 2.91 err/s: 0.00 reconn/s: 0.00

最后,结束还会有个汇总报告。

SQL statistics:
    queries performed:
        read:                            0
        write:                           0
        other:                           10424012
        total:                           10424012
    transactions:                        10424012 (86855.65 per sec.)
    queries:                             10424012 (86855.65 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

Throughput:
    events/s (eps):                      86855.6517
    time elapsed:                        120.0154s
    total number of events:              10424012

Latency (ms):
         min:                                    0.09
         avg:                                    1.15
         max:                                 1527.74
         95th percentile:                        4.91
         sum:                             11994122.49

Threads fairness:
    events (avg/stddev):           104240.1200/600.21
    execution time (avg/stddev):   119.9412/0.01

Comments

comments powered by Disqus