欢迎来到HugNew-拥抱变化,扫一扫右边二维码关注微信订阅号:Martin说 或 加QQ群:427697041互相交流,Stay hungry, Stay foolish.

sysbench使用详解

集群架构 Martin 3075℃ 1评论

简介

在对网站整体性能进行benchmark时,可以使用多种工具,比如大名鼎鼎的ab(Apache bench),http_load等工具。这里我们不关注他们的使用,如果你想了解,可以去这里
重点来说MySQL的基准测试如何进行,也有很多种工具来供我们选择,比如mysqlslap、sysbench、Super Smack等,其中mysqlslap的使用MySQL官网给出了介绍,Super Smack是服务器压力测试强有力的工具,那么sysbench便是我们进行MySQL基准测试的很漂亮的工具了。
sysbench是一款开源的多线程性能测试工具,可以执行CPU/内存/线程/IO/数据库等方面的性能测试。数据库目前支持MySQL/Oracle/PostgreSQL/Drizzle。
它主要包括以下几种方式的测试:
  • cpu性能
  • 磁盘io性能
  • 调度程序性能
  • 内存分配及传输速度
  • POSIX线程性能
  • 数据库性能(OLTP基准测试)

安装

依赖包安装

yum/apt-get install automake
yum/apt-get install libtool

库安装

如果你是centos用户,SysBench已经包含在基本库里,你可以直接使用命令 yum install sysbench安装。如果你是Ubuntu用户,你可以使用命令apt-get install sysbench安装

源码安装

现在官方把已经源码迁到github上去了,https://github.com/akopytov/sysbench。有0.4和0.5两个branch,0.5对lua脚本的支持对oltp测试显得更加灵活,在这对于0.4和0.5版本feature的比较不在过多描述,感兴趣的可以去官方查看相关资料。
tar zxvf sysbench-***.tar.gz
cd sysbench
./autogen.sh
./configure
make && make install
以上命令的编译SysBench默认需要Mysql库的支持,如果你机器已安装Mysql但没有指定位置(在PATH下找不到mysql_config),你必须在./configure得时候指定–with-mysql-includes和–with-mysql-libs。
当然你编译SysBench得时候通过使用–without-mysql命令不需要Mysql的支持。在这种情况下所有有关数据库的测试都不生效,但是其他的测试正常。

使用

通用语法

SysBench的通用语法如下:
sysbench [common-options] --test=name [test-options] command
下面是对command命令的简单描述及作用:
  • prepare:为测试执行准备工作,例如为fileis测试在磁盘上创建必要的文件,为OLTP测试准备测试数据
  • run: 执行完整的测试,必须指定–test选项
  • cleanup: 在测试运行结束移除prepare准备的临时数据
  • help:显示不同测试(根据–test选项)的帮助信息
你也可以使用sysbench help命令(而不用–test)去显示帮助信息

通用选项

Option(选项) Description(描述) Default value(默认值)
–num-threads The total number of worker threads to create #创建测试线程的数目 1
–max-requests Limit for total number of requests. 0 means unlimited #请求的最大数目,0表示不限制 10000
–max-time Limit for total execution time in seconds. 0 (default) means unlimited #最大执行时间,单位秒,0表示不限制 0
–thread-stack-size Size of stack for each thread #每个线程的堆栈大小 32K
–init-rng Specifies if random numbers generator should be initialized from timer beforethe test start #在测试开始之前指定是否需要初始化随机数发生器 off
–report-interval Periodically report intermediate statistics with a specified interval in seconds.Note that statistics produced by this option is per-interval rather than cumula

tive. 0 disables intermediate reports #没隔多久打印一次统计信息,注意的是统计信息统计的是间隔时间而不是累计时间的数据。单位秒,0表示关闭该功能

0
–test Name of the test mode to run #指定测试项目名称 Required
–debug Print more debug info #是否显示更多的调试信息 off
–validate Perform validation of test results where possible #在可能的情况下是否进行验证检查 off
–help Print help on general syntax or on a test mode specified with –test, and exit #帮助信息 off
–verbosity Verbosity level (0 – only critical messages, 5 – debug) #详细级别,0-严重信息,5-调试信息 4
–percentile SysBench measures execution times for all processed requests to display statistical information like minimal, average and maximum execution time. For most benchmarks it

is also useful to know a request execution time value matching some percentile (e.g. 9

5% percentile means we should drop 5% of the most long requests and choose the max

imal value from the remaining ones). This option allows to specify a percentile rank of que

ry execution times to count #统计信息里面显示所有请求执行结束需要的时间,比如最少时间、

平均时间和最大时间。对于大多数的基准测试它能很有效的道一个请求执行时间的百分比重(比如百分之95意味着我们应该除掉百分之5最长的求,选择剩余的最大请求)。该选项允许我们指定百分比范围

95

更多选项

sysbench  –test=fileio help

root@db2:~# sysbench  --test=fileio help
sysbench 0.4.12:  multi-threaded system evaluation benchmark

fileio options:
  --file-num=N              创建测试文件的数量。默认是128
  --file-block-size=N       测试时文件块的大小。默认是16384(16K)
  --file-total-size=SIZE    测试文件的总大小。默认是2G
  --file-test-mode=STRING   文件测试模式{seqwr(顺序写), seqrewr(顺序读写), seqrd(顺序读), rndrd(随机读), rndwr(随机写), rndrw(随机读写)}
  --file-io-mode=STRING     文件操作模式{sync(同步),async(异步),fastmmap(快速map映射),slowmmap(慢map映射)}。默认是sync
  --file-extra-flags=STRING 使用额外的标志来打开文件{sync,dsync,direct} 。默认为空
  --file-fsync-freq=N       执行fsync()的频率。(0 – 不使用fsync())。默认是100
  --file-fsync-all=[on|off] 每执行完一次写操作就执行一次fsync。默认是off
  --file-fsync-end=[on|off] 在测试结束时才执行fsync。默认是on
  --file-fsync-mode=STRING  使用哪种方法进行同步{fsync, fdatasync}。默认是fsync
  --file-merged-requests=N  如果可以,合并最多的IO请求数(0 – 表示不合并)。默认是0
  --file-rw-ratio=N         测试时的读写比例。默认是1.5

sysbench –test=cpu help

--cpu-max-prime=N  最大质数发生器数量。默认是10000

sysbench –test=memory help

root@db2:~# sysbench  --test=memory help
sysbench 0.4.12:  multi-threaded system evaluation benchmark

memory options:
  --memory-block-size=SIZE    测试时内存块大小。默认是1K
  --memory-total-size=SIZE    传输数据的总大小。默认是100G
  --memory-scope=STRING       内存访问范围{global,local}。默认是global
  --memory-hugetlb=[on|off]   从HugeTLB池内存分配。默认是off
  --memory-oper=STRING        内存操作类型。{read, write, none} 默认是write
  --memory-access-mode=STRING 存储器存取方式{seq,rnd} 默认是seq

sysbench –test=threads help

sysbench 0.4.12:  multi-threaded system evaluation benchmark

threads options:
  --thread-yields=N   每个请求产生多少个线程。默认是1000
  --thread-locks=N    每个线程的锁的数量。默认是8

sysbench –test=mutex help

root@db2:~# sysbench  --test=mutex help
sysbench 0.4.12:  multi-threaded system evaluation benchmark

mutex options:

  --mutex-num=N      数组互斥的总大小。默认是4096
  --mutex-locks=N    每个线程互斥锁的数量。默认是50000
  --mutex-loops=N    内部互斥锁的空循环数量。默认是10000

sysbench –test=oltp help

root@db2:~# sysbench --test=oltp help
sysbench 0.4.12:  multi-threaded system evaluation benchmark

oltp options:
  --oltp-test-mode=STRING    执行模式{simple,complex(advanced transactional),nontrx(non-transactional),sp}。默认是complex
  --oltp-reconnect-mode=STRING 重新连接模式{session(不使用重新连接。每个线程断开只在测试结束),transaction(在每次事务结束后重新连接),query(在每个SQL语句执行完重新连接),random(对于每个事务随机选择以上重新连接模式)}。默认是session
  --oltp-sp-name=STRING      存储过程的名称。默认为空
  --oltp-read-only=[on|off]  只读模式。Update,delete,insert语句不可执行。默认是off
  --oltp-skip-trx=[on|off]   省略begin/commit语句。默认是off
  --oltp-range-size=N        查询范围。默认是100
  --oltp-point-selects=N          number of point selects [10]
  --oltp-simple-ranges=N          number of simple ranges [1]
  --oltp-sum-ranges=N             number of sum ranges [1]
  --oltp-order-ranges=N           number of ordered ranges [1]
  --oltp-distinct-ranges=N        number of distinct ranges [1]
  --oltp-index-updates=N          number of index update [1]
  --oltp-non-index-updates=N      number of non-index updates [1]
  --oltp-nontrx-mode=STRING  查询类型对于非事务执行模式{select, update_key, update_nokey, insert, delete} [select]
  --oltp-auto-inc=[on|off]   AUTO_INCREMENT是否开启。默认是on
  --oltp-connect-delay=N     在多少微秒后连接数据库。默认是10000
  --oltp-user-delay-min=N    每个请求最短等待时间。单位是ms。默认是0
  --oltp-user-delay-max=N    每个请求最长等待时间。单位是ms。默认是0
  --oltp-table-name=STRING   测试时使用到的表名。默认是sbtest
  --oltp-table-size=N        测试表的记录数。默认是10000
  --oltp-dist-type=STRING    分布的随机数{uniform(均匀分布),Gaussian(高斯分布),special(空间分布)}。默认是special
  --oltp-dist-iter=N         产生数的迭代次数。默认是12
  --oltp-dist-pct=N          值的百分比被视为'special' (for special distribution)。默认是1
  --oltp-dist-res=N         ‘special’的百分比值。默认是75

General database options:
  --db-driver=STRING          指定数据库驱动程序('help' to get list of available drivers)
  --db-ps-mode=STRING         编制报表使用模式{auto, disable} [auto]
Compiled-in database drivers:
    mysql - MySQL driver
mysql options: 
 --mysql-host=[LIST,...]       数据库地址
 --mysql-port=N                端口号,默认3306
 --mysql-user=STRING           用户名 
 --mysql-password=STRING       密码 
 --mysql-db=STRING             测试数据库名 
 --mysql-table-engine=STRING   数据库存储引擎,默认innodb{myisam,innodb,bdb,heap,ndbcluster,federated}
 --mysql-socket=STRING         socket文件的位置
 --mysql-engine-trx=STRING     是否使用事务,与存储引擎选择有关,默认auto{yes,no,auto}
 --mysql-ssl=[on|off]          在客户端是否使用SSL连接,默认off
--myisam-max-rows=N            MyISAM表最大行数,默认1000000
 --mysql-create-options=STRING additional options passed to CREATE TABLE []

测试

CPU基准测试

CPU测试使用64位整数,测试计算质数直到某个最大值所需要的时间。
root@db2:~# sysbench --test=cpu --cpu-max-prime=2000 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 2000

Test execution summary:
    total time:                          3.7155s
    total number of events:              10000
    total time taken by event execution: 3.7041
    per-request statistics:
         min:                                  0.36ms
         avg:                                  0.37ms
         max:                                  2.53ms
         approx.  95 percentile:               0.37ms

Threads fairness:
    events (avg/stddev):           10000.0000/0.00
    execution time (avg/stddev):   3.7041/0.00

线程基准测试

测试线程调度器的性能。对于高负载情况下测试线程调度器的行为非常有用。

root@db2:~# sysbench  --test=threads --num-threads=500 --thread-yields=100 --thread-locks=4 run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 500

Doing thread subsystem performance test
Thread yields per test: 100 Locks used: 4
Threads started!
Done.

Test execution summary:
    total time:                          1.0644s
    total number of events:              10000
    total time taken by event execution: 501.3952
    per-request statistics:
         min:                                  0.05ms
         avg:                                 50.14ms
         max:                                587.05ms
         approx.  95 percentile:             190.28ms

Threads fairness:
    events (avg/stddev):           20.0000/4.72
    execution time (avg/stddev):   1.0028/0.01

文件IO基准测试

文件IO(fileio)基准测试可以测试系统在不同IO负载下的性能。这对于比较不同的硬盘驱动器,不同的RAID 卡,不同的RAID 模式,都很有帮助。可以根据测试结果调整IO子系统,文件IO基准测试模拟了很多InnoDB 的IO特性。
测试的第一步是准备(Prepare)阶段,生成测试用到的数据文件,生成的数据文件至少要比内存大。 如果文件中的数据能完全放入内存中,则操作系统 缓存大部分的数据,导致测试结果无法体现IO密集型的工作负载。

root@db2:~/io# sysbench --test=fileio --num-threads=16 --file-total-size=2G --file-test-mode=rndrw prepare
sysbench 0.4.12:  multi-threaded system evaluation benchmark

128 files, 16384Kb each, 2048Mb total
Creating files for the test...
root@db2:~/io# sysbench --test=fileio --num-threads=20 --file-total-size=2G --file-test-mode=rndrw run
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 20

Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Number of random requests for random IO: 10000
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Threads started!
Done.

Operations performed:  6010 Read, 3997 Write, 12803 Other = 22810 Total
Read 93.906Mb  Written 62.453Mb  Total transferred 156.36Mb  (6.6668Mb/sec)
  426.68 Requests/sec executed

Test execution summary:
    total time:                          23.4534s
    total number of events:              10007
    total time taken by event execution: 111.5569
    per-request statistics:
         min:                                  0.01ms
         avg:                                 11.15ms
         max:                                496.18ms
         approx.  95 percentile:              53.05ms

Threads fairness:
    events (avg/stddev):           500.3500/37.50
    execution time (avg/stddev):   5.5778/0.21

root@db2:~/io# sysbench --test=fileio --num-threads=20 --file-total-size=2G --file-test-mode=rndrw cleanup
sysbench 0.4.12:  multi-threaded system evaluation benchmark

Removing test files...

内存基准测试

内存测试测试了内存的连续读写性能

root@db2:~/io# sysbench --test=memory --memory-block-size=8k --memory-total-size=1G run
sysbench 0.4.12:  multi-threaded system evaluation benchmark
Operations performed: 1310720 (396525.32 ops/sec)
10240.00 MB transferred (3097.85 MB/sec)
Test execution summary:
total time:                          3.3055s
total number of events:              1310720
total time taken by event execution: 205.0560
per-request statistics:
min:                                  0.00ms
avg:                                  0.16ms
max:                               1066.04ms
approx.  95 percentile:               0.02ms
Threads fairness:
events (avg/stddev):           13107.2000/3870.38
execution time (avg/stddev):   2.0506/0.28

互斥锁基准测试

互斥锁是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制来保证共享数据操作的完整性。每个对象都对应于一个可称为” 互斥锁” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。

测试互斥锁的性能,方式是模拟所有线程在同一时刻并发运行,并都短暂请求互斥锁。

root@db2:~/io# sysbench –test=mutex –num-threads=100 –mutex-num=1000 –mutex-locks=100000 –mutex-loops=10000 run
Test execution summary:
total time:                          12.5606s
total number of events:              100
total time taken by event execution: 1164.4236
per-request statistics:
min:                               9551.87ms
avg:                              11644.24ms
max:                              12525.32ms
approx.  95 percentile:           12326.25ms
Threads fairness:
events (avg/stddev):           1.0000/0.00
execution time (avg/stddev):   11.6442/0.59

OLTP基准测试

完整过程分为3个阶段:prepare->run->cleanup,即分别为准备数据,测试,清理测试数据。

root@db2:~# sysbench --test=oltp --mysql-table-engine=innodb --mysql-host=192.168.x.x --mysql-db=rep_test --oltp-table-size=1000000 --mysql-user=root --mysql-password=123456 prepare
sysbench 0.4.12:  multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
Creating table 'sbtest'...
Creating 1000000 records in table 'sbtest'...
root@db2:~# sysbench --num-threads=16 --test=oltp --mysql-table-engine=innodb --mysql-host=192.168.x.x --mysql-db=rep_test --oltp-table-size=1000000 --mysql-user=root --mysql-password=123456 run    
sysbench 0.4.12:  multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
Running the test with following options:
Number of threads: 16

Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations,  1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 10000
Threads started!
Done.

OLTP test statistics:
    queries performed:
        read:                            140000
        write:                           50000
        other:                           20000
        total:                           210000
#—-事务数总计,每秒的事务处理量
    transactions:                        10000  (356.98 per sec.)
    deadlocks:                           0      (0.00 per sec.)
    read/write requests:                 190000 (6782.56 per sec.)
    other operations:                    20000  (713.95 per sec.)

Test execution summary:
    total time:                          28.0130s
    total number of events:              10000
    total time taken by event execution: 447.7731
    per-request statistics:
         min:                                  3.91ms
         avg:                                 44.78ms
         max:                                207.61ms
         approx.  95 percentile:              76.48ms

Threads fairness:
    events (avg/stddev):           625.0000/22.96
    execution time (avg/stddev):   27.9858/0.01

root@db2:~# sysbench --num-threads=16 --test=oltp --mysql-table-engine=innodb --mysql-host=192.168.x.x --mysql-db=rep_test --oltp-table-size=1000000 --mysql-user=root --mysql-password=123456 cleanup
sysbench 0.4.12:  multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
Dropping table 'sbtest'...
Done.

这是0.4版本,0.5版本与0.4版本不同。这里–test不再有oltp这个项目,而是换成了对应的lua脚本路径,默认在源码文件夹/源码/sysbench/tests/db下,oltp测试结合了lua脚本,不需要修改源码,通过自定义lua脚本就可以实现不同业务类型的测试。原理与0.4的相同,只是将oltp测试过程放在了oltp.lua脚本文件里,通过–test指定该脚本文件即可。如果我们想通过sysbench针对自己的现有业务系统做测试,也可自己编写lua脚本,只需测试时通过–test指定该脚本的位置即可。

官网地址:

https://launchpad.net/sysbench

https://github.com/akopytov/sysbench

转载请注明:HugNew » sysbench使用详解

喜欢 (2)or分享 (0)
发表我的评论
取消评论

表情
(1)个小伙伴在吐槽