Sysbench介绍与使用

   最近用sysbench进行了较多的性能测试,也总结一下它的特点和用法和需要注意的事项。sysbench是一个多线程性能测试工具,可以进行CPU/内存/IO/数据库等性能测试。不过我绝大多数的时候都是用它来对数据库(MySQL)进行oltp测试。它能测哪些东西,怎么测让我从它的命令帮助来回答。

~/zbs$ sysbench --help
Missing required command argument.
Usage:
  sysbench [general-options]... --test=<test-name> [test-options]... command
        上面就大概的用法,--test=指定我们需要测什么类型,那么--test有哪几种类型呢?fileio/cpu/memory/threads/mutex,不好意思前面这几个我都没测过,我主要是用它来测数据库的性能,但为什么没有数据库这个选项呢,这是我是用了最新的版本0.5,它与0.4的版本最大区别在于支持多表测试,执行实时打印统计信息,支持自定义lua脚本来设置测试行为。

Compiled-in tests:
  fileio - File I/O test
  cpu - CPU performance test
  memory - Memory functions speed test
  threads - Threads subsystem performance test
  mutex - Mutex performance test
        如果你用sysbench0.4大概会看到如下,请注意oltp这个选项就是测数据库用的。

Compiled-in tests:
  fileio - File I/O test
  cpu - CPU performance test
  memory - Memory functions speed test
  threads - Threads subsystem performance test
  mutex - Mutex performance test
  oltp - OLTP test
        看完了测试模式之后,那么它有一些什么主要的其他控制参数呢?首先说这个每个测试模式自己特有的参数怎么擦看 sysbench --test=<test-mode> help,比如我这里(请注意,由于sysbench0.5的--test选项对数据库的测试不再使用oltp这个选项而是通过指定lua脚本,因此利用前面这个命令查看不到下面的结果,所以如果要查看还是通过0.4的吧,如果谁找到了方式在0.5版本里查看oltp的参数也请告诉一下。另外虽然0.5与0.4版本不同但是参数还是基本上保持兼容的):

~$ sysbench --test=oltp help
sysbench 0.4.12:  multi-threaded system evaluation benchmark

oltp options:
  --oltp-test-mode=STRING         test type to use {simple,complex,nontrx,sp} [complex]
  --oltp-reconnect-mode=STRING    reconnect mode {session,transaction,query,random} [session]
  --oltp-sp-name=STRING           name of store procedure to call in SP test mode []
  --oltp-read-only=[on|off]       generate only 'read' queries (do not modify database) [off]
  --oltp-skip-trx=[on|off]        skip BEGIN/COMMIT statements [off]
  --oltp-range-size=N             range size for range queries [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       mode for non-transactional test {select, update_key, update_nokey, insert, delete} [select]
  --oltp-auto-inc=[on|off]        whether AUTO_INCREMENT (or equivalent) should be used on id column [on]
  --oltp-connect-delay=N          time in microseconds to sleep after connection to database [10000]
  --oltp-user-delay-min=N         minimum time in microseconds to sleep after each request [0]
  --oltp-user-delay-max=N         maximum time in microseconds to sleep after each request [0]
  --oltp-table-name=STRING        name of test table [sbtest]
  --oltp-table-size=N             number of records in test table [10000]
  --oltp-dist-type=STRING         random numbers distribution {uniform,gaussian,special} [special]
  --oltp-dist-iter=N              number of iterations used for numbers generation [12]
  --oltp-dist-pct=N               percentage of values to be treated as 'special' (for special distribution) [1]
  --oltp-dist-res=N               percentage of 'special' values to use (for special distribution) [75]

General database options:

  --db-driver=STRING  specifies database driver to use ('help' to get list of available drivers)
  --db-ps-mode=STRING prepared statements usage mode {auto, disable} [auto]


Compiled-in database drivers:
  mysql - MySQL driver

mysql options:
  --mysql-host=[LIST,...]       MySQL server host [localhost]
  --mysql-port=N                MySQL server port [3306]
  --mysql-socket=STRING         MySQL socket
  --mysql-user=STRING           MySQL user [sbtest]
  --mysql-password=STRING       MySQL password []
  --mysql-db=STRING             MySQL database name [sbtest]
  --mysql-table-engine=STRING   storage engine to use for the test table {myisam,innodb,bdb,heap,ndbcluster,federated} [innodb]
  --mysql-engine-trx=STRING     whether storage engine used is transactional or not {yes,no,auto} [auto]
  --mysql-ssl=[on|off]          use SSL connections, if available in the client library [off]
  --myisam-max-rows=N           max-rows parameter for MyISAM tables [1000000]
  --mysql-create-options=STRING additional options passed to CREATE TABLE []
        上面有这么多参数,相信都能基本看懂吧,我等下举例的时候会讲到里面的参数代表什么含义。然后知道怎么查看具体某个测试模式的用法之后再来看general-options,通用参数,下面看看0.5的参数(相对0.4的增加了不少,有些参数的名称也变了,怎么辨别---对某个参数解释一模一样):

General options:
  --num-threads=N             number of threads to use [1]
  --max-requests=N            limit for total number of requests [10000]
  --max-time=N                limit for total execution time in seconds [0]
  --forced-shutdown=STRING    amount of time to wait after --max-time before forcing shutdown [off]
  --thread-stack-size=SIZE    size of stack per thread [64K]
  --tx-rate=N                 target transaction rate (tps) [0]
  --report-interval=N         periodically report intermediate statistics with a specified interval in seconds. 0 disables intermediate reports [0]
  --report-checkpoints=[LIST,...]dump full statistics and reset all counters at specified points in time. The argument is a list of comma-separated values representing the amount of time in seconds elapsed from start of test when report checkpoint(s) must be performed. Report checkpoints are off by default. []
  --test=STRING               test to run
  --debug=[on|off]            print more debugging info [off]
  --validate=[on|off]         perform validation checks where possible [off]
  --help=[on|off]             print help and exit
  --version=[on|off]          print version and exit [off]
  --rand-init=[on|off]        initialize random number generator [off]
  --rand-type=STRING          random numbers distribution {uniform,gaussian,special,pareto} [special]
  --rand-spec-iter=N          number of iterations used for numbers generation [12]
  --rand-spec-pct=N           percentage of values to be treated as 'special' (for special distribution) [1] 整个表中多少数据被认为是热点数据
  --rand-spec-res=N           percentage of 'special' values to use (for special distribution) [75] 多少请求的数据是来自热点数据
  --rand-seed=N               seed for random number generator, ignored when 0 [0]
  --rand-pareto-h=N           parameter h for pareto distibution [0.2]
        这里也不打算解释每个选项的含义,第一很多估计用不到,第二后面会举例子讲解。有了通用参数+具体某个测试模式的参数之后,那么对于跑一次sysbench还差点什么呢?那就是sysbench的command。command分3个prepare,run,cleanup。prepare是一个准备过程,比如测oltp需要load数据到表里,run是真正的测试过程,cleanup是清除过程,比如run完了之后会需要清理一些测试过程中遗留下来的东西等等。

        对于sysbench测试的命令组成部分都介绍完了,那么下面就来举一个我测试oltp的实际例子。

sysbench --test=/home/zbs/sysbench-0.5/sysbench/tests/db/parallel_prepare.lua  --oltp_tables_count=1  --oltp-table-size=$records --rand-init=on --num-threads=$thds --oltp-read-only=off --report-interval=10 --rand-type=special --rand-spec-pct=5 --mysql-table-engine=$type --max-time=8000 --mysql-host=$host --mysql-port=$port  --mysql-user=test --mysql-password=test --mysql-db=test1 --max-requests=0  prepare  >$log 2>&1   
  
sysbench --test=/home/zbs/sysbench-0.5/sysbench/tests/db/oltp.lua  --oltp_tables_count=1  --oltp-table-size=$records --rand-init=on --num-threads=$thds --oltp-read-only=off --report-interval=10 --rand-type=special --rand-spec-pct=5  --mysql-table-engine=$type --max-time=8000 --mysql-host=$host --mysql-port=$port  --mysql-user=test --mysql-password=test --mysql-db=test1 --max-requests=0   run  >$log 2>&1

sysbench --test=/home/zbs/sysbench-0.5/sysbench/tests/db/oltp.lua  --oltp_tables_count=1  --oltp-table-size=$records --rand-init=on --num-threads=$thds --oltp-read-only=off --report-interval=10 --rand-type=special --rand-spec-pct=5  --mysql-table-engine=$type --max-time=8000 --mysql-host=$host --mysql-port=$port  --mysql-user=test --mysql-password=test --mysql-db=test1 --max-requests=0   cleanup  >$log 2>&1

        三者的参数都是用一模一样的,只是最后的sysbench command不同,prepare、run、cleanup组成了一个完整的sysbench测试。这里需要注意每个命令用的参数一模一样,但是很多参数对具体某个命令是不起作用的,比如在prepare的时候--max-time(这个命令运行多长时间)不起作用,因为它最终一定要把准备工作做好。下面说具体参数含义。

--test:指定测试模式对应的lua文件,这个装好sysbench就有且这是0.5新增,0.4只需直接--test=oltp即可。
--oltp_table_count=1:指定测试过程中表的个数,0.5新增,0.4整个测试过程只有一个表。
--oltp-table-size=:指定表的大小,如果指定1000,那么它会往表里初始化1000条数据
--rand-init=on:是否随机初始化数据,如果不随机化那么初始好的数据每行内容除了主键不同外其他完全相同。
--num-threads=:测试过程中并发线程数,看测试要求来定并发压力。
--otlp-read-only=off:知否只读测试
 --report-interval=10:每隔多久打印一次统计信息,单位秒,0.5新增
 --rand-type=special:数据分布模式,special表示存在热点数据,uniform表示非热点数据模式,还有其他几个选项。
 --rand-spec-pct=5:这个与上面那个选项相关,具体关于请求数分布模式见这篇文章。
 --mysql-table-engine=$type:表的存储引擎类型,innodb/myisam/tokudb/这些都可以。
 --max-time=8000:这个命令跑多长时间,单位秒,与之相反的是指定请求数--max-requests
 --mysql-host=$host --mysql-port=$port  --mysql-user=test --mysql-password=test --mysql-db=test1  这几个表示被测试的MySQL实例信息,因为需要连数据库
 --max-requests:刚说了,可以两者形式指定命令运行多长时间。
        这里需要注意的几点,一个不管怎么oltp的应用多少会存在热点数据,所以除非测试特殊性否则尽量不用uniform这种非热点数据模式,热点数据比例就需要你自己定。另线程数也不宜太大除非压力测试,一般100以内。初始化数据方式最好随机--rand-init=on。表的数量这个参数感觉意义不大,因为测试过程中每个表的结构一模一样。

       sysbench基本使用方法和对于oltp测试的实际例子都说完了,那么sysbench的优缺点有哪些呢?

       根据我的使用心得,sysbench支持的测试对象较多,提供可调参数也较多,但是它有一个巨大的缺陷---表结构太简单:

| sbtest1 | CREATE TABLE `sbtest1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `k` int(10) unsigned NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k_1` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=300000001 DEFAULT CHARSET=utf8 MAX_ROWS=1000000 |
        仅仅三个字段,所以很多时候它并不能模拟实际线上的一些应用。但是它还是有很多用处的。第一,利用它做对比测试还不错,因为两个东西都用它测至少测试标准是一样的。第二,测产品稳定性、抗压性,假如你做了一个存储引擎,或是对MySQL打了补丁,那么利用sysbench跑上几天甚至几星期看是否会挂掉。总之一句话:取其所长。


参考资料:

1. sysbench手册页 SysBench manual



你可能感兴趣的:(Sysbench介绍与使用)