mysql基准测试工具sysbench初探

语言: CN / TW / HK

sysbench是一个基于多线程的测试工具,是一款专业的数据库benchmarks工具,当然它也可以测试cpu、memory、disk,不过目前的重点是数据库基准测试。

通过sysbench测试,可以对数据库有更深刻的理解,从而进行性能调优,但不可能一步到位,需要进行迭代的测试,加上经验,从而得到更好的效果。

sysbench官方文档不是特别好理解,这是一大缺点。

安装和基本参数

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench

语法:

sysbench [options]... [testname] [command]

其中testname是built-in test的名字,比如fileio, memory, cpu,对于数据库可以直接找到/usr/share/sysbench/tests/include/oltp_legacy目录下的lua文件,里面有很多MySQL测试用例。

command和testname有关,主要包含prepare(准备测试用例),run(具体测试),cleanup(清理),help。比如:

sysbench oltp_read_only  help

options表示具体的参数,比如:

  • —threads:

    表示启动的线程数

  • —events:

    表示发送的请求数

  • —time:

    表示总的执行时间

  • —rate:

    每秒执行的总请求数 events (transactions)

  • —report-interval:

    定期汇总统计数据

测试

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua  --oltp-table-size=10000000 --db-driver=mysql --mysql-db=test --mysql-user= --mysql-password=  prepare

sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua  --oltp-table-size=10000000 --db-driver=mysql --mysql-db=test --mysql-user= --mysql-password= --time=60  --events=500000 --threads=10  run  --report-interval=5 >>sysbench.log

其中生成的测试表有1000万条记录,10个线程,另外-oltp-read-only=on表示只测试读,oltp是一个比较常见的测试,主要包含事务,数据库增删改查。

测试主要是参数优化前和优化后的数据对比,服务器配置是基本相同的。

结论

[ 5s ] thds: 10 tps: 1867.55 qps: 37383.21 (r/w/o: 26171.51/7474.60/3737.10) lat (ms,95%): 8.43
[ 10s ] thds: 10 tps: 1845.23 qps: 36899.85 (r/w/o: 25831.25/7378.13/3690.46) lat (ms,95%): 8.58
[ 15s ] thds: 10 tps: 1747.79 qps: 34956.77 (r/w/o: 24468.84/6992.35/3495.58) lat (ms,95%): 9.73
[ 20s ] thds: 10 tps: 1712.80 qps: 34255.44 (r/w/o: 23981.03/6848.81/3425.60) lat (ms,95%): 10.46
[ 25s ] thds: 10 tps: 1696.80 qps: 33930.40 (r/w/o: 23748.80/6788.20/3393.40) lat (ms,95%): 10.84

SQL statistics:
    queries performed:
        read: 1409366
        write: 402676
        other: 201338
        total: 2013380
    transactions: 100669 (1677.60 per sec.)
    queries: 2013380 (33552.05 per sec.)

[ 5s ] thds: 10 tps: 432.05 qps: 8663.55 (r/w/o: 6067.86/1729.59/866.10) lat (ms,95%): 66.84
[ 10s ] thds: 10 tps: 439.01 qps: 8782.22 (r/w/o: 6147.15/1757.04/878.02) lat (ms,95%): 58.92
[ 15s ] thds: 10 tps: 499.20 qps: 9980.78 (r/w/o: 6987.19/1995.20/998.40) lat (ms,95%): 54.83
[ 20s ] thds: 10 tps: 502.60 qps: 10061.66 (r/w/o: 7044.44/2012.01/1005.21) lat (ms,95%): 51.02
[ 25s ] thds: 10 tps: 514.80 qps: 10297.21 (r/w/o: 7208.60/2059.00/1029.60) lat (ms,95%): 50.11

SQL statistics:
    queries performed:
        read: 422352
        write: 120672
        other: 60336
        total: 603360
    transactions: 30168  (502.53 per sec.)
    queries: 603360 (10050.59 per sec.)

1:threads越大,参数调整后的数据库qps和tps表现就更好(3倍,并发线程数是10),虽然cpu压力变大(主要是在积极的干活,负载接近10)。

2:通过MySQLTuner观察buffer利用率,这是最重要的指标。

[OK] InnoDB Read buffer efficiency: 99.99% (2475662828 hits/ 2475882691 total)
[!!] InnoDB Write Log efficiency: 53.62% (23506385 hits/ 43841142 total)

[OK] InnoDB Read buffer efficiency: 99.75% (2084860001 hits/ 2090165590 total)
[!!] InnoDB Write Log efficiency: 48.16% (15492072 hits/ 32169426 total)

对于读buffer效率,看上去相差不大,但其实性能相差很大,而对于更新操作,大内存的优势就非常大了。

3:排序

对于排序来说,内存设置越大,磁盘I/O压力就越小。

Temporary tables created on disk: 0% (105 on disk / 780K total)

测试不是那么容易的,测试方法也是非常重要的,尤其对于实际的数据库应用(这是最难模拟的),基准测试就更难了,本文只是简单反映一些情况,但不可否认的是性能有了很大的提升,性能越高,并发性就越好。

分享到: