mysql压测工具sysbench

SysBench是一个跨平台且支持多线程的模块化基准测试工具,用于评估系统在运行高负载的数据库时相关核心参数的性能表现。它目的是为了绕过复杂的数据库基准设置,甚至在没有安装数据库的前提下,快速了解数据库系统的性能。

sysbench主要支持以下几种测试模式:

  • CPU运算性能
  • 磁盘IO性能
  • 调度程序性能
  • 内存分配及传输速度
  • POSIX线程性能
  • 数据库性能(OLTP基准测试)

目前sysbench主要支持 MySQL,Drizzle,PgSQL,Oracle等几种数据库。

1、sysbench安装:

二进制包安装

  • Debian/Ubuntu
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.deb.sh | sudo bash
sudo apt-get -y install sysbench
  • RHEL/CentOS:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
sudo yum -y install sysbench
  • Fedora:
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash	
sudo dnf -y install sysbench

源码安装

  • RHEL/CentOS

1、安装依赖:

$ yum -y install gcc gcc-c++ make automake libtool pkgconfig libaio-devel vim-common
$ yum -y install zlib zlib-devel openssl openssl-devel mysql mysql-devel

2、编译安装sysbench:

$ git clone https://github.com/akopytov/sysbench.git
$ cd sysbench
$ ./autogen.sh
$ ./configure --prefix=/opt/sysbench # Add --with-pgsql to build with PostgreSQL support
$ make
$ sudo make install

2、OLTP场景测试:

2.1、数据初始化:

$ sysbench \
    /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
    --db-driver=mysql \
    --mysql-host=1.1.1.1 \
    --mysql-port=3306 \
    --mysql-user=root \
    --mysql-password=xxxx \
    --mysql-db=sysbench \
    --oltp_tables_count=10 \
    --oltp-table-size=100000 \
    --rand-init=on \
    prepare

sysbench 1.0.6 (using bundled LuaJIT 2.1.0-beta2)

Creating table 'sbtest1'...
Inserting 100000 records into 'sbtest1'
Creating secondary indexes on 'sbtest1'...
Creating table 'sbtest2'...
Inserting 100000 records into 'sbtest2'
Creating secondary indexes on 'sbtest2'...
Creating table 'sbtest3'...
Inserting 100000 records into 'sbtest3'
Creating secondary indexes on 'sbtest3'...
Creating table 'sbtest4'...
Inserting 100000 records into 'sbtest4'
Creating secondary indexes on 'sbtest4'...
Creating table 'sbtest5'...
Inserting 100000 records into 'sbtest5'
Creating secondary indexes on 'sbtest5'...
Creating table 'sbtest6'...
Inserting 100000 records into 'sbtest6'
Creating secondary indexes on 'sbtest6'...
Creating table 'sbtest7'...
Inserting 100000 records into 'sbtest7'
Creating secondary indexes on 'sbtest7'...
Creating table 'sbtest8'...
Inserting 100000 records into 'sbtest8'
Creating secondary indexes on 'sbtest8'...
Creating table 'sbtest9'...
Inserting 100000 records into 'sbtest9'
Creating secondary indexes on 'sbtest9'...
Creating table 'sbtest10'...
Inserting 100000 records into 'sbtest10'
Creating secondary indexes on 'sbtest10'...

命令行参数解读:

参数 说明
oltp_legacy/oltp.lua 调用的脚本进行oltp模式测试
–db-driver 指定使用的数据库的驱动程序
–mysql-host 压测的mysql的服务器IP地址
–mysql-user 提供给sysbench的mysql用户名
–mysql-port mysql实例的端口号
–mysql-password 上述mysql用户的密码
–mysql-db 压测的database name(需要提前创建)
–oltp_tables_count 指定生成测试表的数量
–oltp-table-size 指定每个测试表填充数据量(行)
–rand-init 每个测试表都是用随机数据来填充的(默认为off)

真实测试场景中,数据表建议不低于10个,单表数据量不低于500万行,当然了,要视服务器硬件配置而定。如果是配备了SSD或者PCIE SSD这种高IOPS设备的话,则建议单表数据量最少不低于1亿行。

2.2、OLTP测试:

$ sysbench \
      /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
      --db-driver=mysql \
      --mysql-host=1.1.1.1 \
      --mysql-port=3306 \
      --mysql-user=root \
      --mysql-password=xxxx \
      --mysql-db=sysbench \
      --oltp_tables_count=10 \
      --oltp-table-size=10000000 \
      --threads=8 \
      --oltp-read-only=off \
      --report-interval=10 \
      --rand-type=uniform \
      --time=60 \
      --events=0 \
      --percentile=99 \
      run
  
sysbench 1.0.6 (using bundled LuaJIT 2.1.0-beta2)

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


Initializing worker threads...

Threads started!

[ 10s ] thds: 8 tps: 441.99 qps: 8855.05 (r/w/o: 6199.09/456.69/2199.27) lat (ms,99%): 28.67 err/s: 0.00 reconn/s: 0.00
[ 20s ] thds: 8 tps: 434.81 qps: 8696.19 (r/w/o: 6087.33/447.91/2160.95) lat (ms,99%): 29.72 err/s: 0.00 reconn/s: 0.00
[ 30s ] thds: 8 tps: 444.20 qps: 8884.03 (r/w/o: 6218.82/457.30/2207.91) lat (ms,99%): 27.66 err/s: 0.00 reconn/s: 0.00
[ 40s ] thds: 8 tps: 438.49 qps: 8770.52 (r/w/o: 6140.01/452.79/2177.73) lat (ms,99%): 30.26 err/s: 0.10 reconn/s: 0.00
[ 50s ] thds: 8 tps: 418.48 qps: 8368.70 (r/w/o: 5857.82/430.68/2080.20) lat (ms,99%): 30.81 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 8 tps: 417.33 qps: 8348.20 (r/w/o: 5843.72/431.33/2073.15) lat (ms,99%): 36.89 err/s: 0.00 reconn/s: 0.00
SQL statistics:
    queries performed:
        read:                            363482
        write:                           26770
        other:                           129006
        total:                           519258
    transactions:                        25962  (432.60 per sec.)
    queries:                             519258 (8652.21 per sec.)
    ignored errors:                      1      (0.02 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          60.0126s
    total number of events:              25962

Latency (ms):
         min:                                  5.54
         avg:                                 18.49
         max:                                218.13
         99th percentile:                     30.26
         sum:                             479982.91

Threads fairness:
    events (avg/stddev):           3245.2500/12.65
    execution time (avg/stddev):   59.9979/0.00

命令行参数解读:

参数 说明
–threads 发起N个并发连接
–oltp-read-only=off 不要进行只读测试,采用读写混合模式测试
–report-interval=10 每10秒输出一次测试进度报告
–rand-type=uniform 表示随机类型为固定模式,其他几个可选随机模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累托)
–time 压测时长为N秒
–events=0 表示总请求数为 0,因为上面已经定义了总执行时长,所以总请求数可以设定为 0;也可以只设定总请求数,不设定最大执行时长
–percentile=99 表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值

测试结果解读:

Threads started!
# 每10秒钟报告一次测试结果,tps、qps,每秒读、每秒写、99%以上的响应时长统计
[ 60s ] thds: 8 tps: 417.33 qps: 8348.20 (r/w/o: 5843.72/431.33/2073.15) lat (ms,99%): 36.89 err/s: 0.00 reconn/s: 0.00
SQL statistics:
    queries performed:
        read:                            363482     # 读总数
        write:                           26770      # 写总数
        other:                           129006     # 其他操作总数(SELECT、INSERT、UPDATE、DELETE之外的操作,例如COMMIT等)
        total:                           519258     # 全部总数
    transactions:                        25962  (432.60 per sec.)   # 总事务数(每秒事务数)
    queries:                             519258 (8652.21 per sec.)  # 读写总数(每秒读写次数)
    ignored errors:                      1      (0.02 per sec.)     # 忽略的错误数
    reconnects:                          0      (0.00 per sec.)

General statistics:     ## 一些统计信息
    total time:                          60.0126s   ## 总耗时
    total number of events:              25962      ## 事务总数

Latency (ms):   ## 响应统计
         min:                                  5.54     ## 最小耗时
         avg:                                 18.49     ## 平均耗时
         max:                                218.13     ## 最长耗时
         99th percentile:                     30.26     ## 超过99%平均耗时
         sum:                             479982.91

Threads fairness:   ## 
    events (avg/stddev):           3245.2500/12.65
    execution time (avg/stddev):   59.9979/0.00

2.3、测试数据的清理:

$ sysbench \
    /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
    --db-driver=mysql \
    --mysql-host=1.1.1.1 \
    --mysql-port=3306 \
    --mysql-user=root \
    --mysql-password=xxxx \
    --mysql-db=sysbench \
    --oltp_tables_count=10 \
    cleanup
sysbench 1.0.6 (using bundled LuaJIT 2.1.0-beta2)

Dropping table 'sbtest1'...
Dropping table 'sbtest2'...
Dropping table 'sbtest3'...
Dropping table 'sbtest4'...
Dropping table 'sbtest5'...
Dropping table 'sbtest6'...
Dropping table 'sbtest7'...
Dropping table 'sbtest8'...
Dropping table 'sbtest9'...
Dropping table 'sbtest10'...

参考资料:

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload CAPTCHA.