一、Sysbench介绍
SysBench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。它主要包括以下几种方式的测试:
1、cpu性能
2、磁盘io性能
3、调度程序性能
4、内存分配及传输速度
5、POSIX线程性能
6、数据库性能(OLTP基准测试)
Sysbench的oltp主要用于评估测试各种不同系统参数下的数据库负载情况。目前sysbench的数据库测试支持MySQL、PostgreSQL、Oracle。相比0.4版本,后续的版本oltp测试主要结合了lua脚本,不需要修改源码,通过自定义lua脚本就可以实现不同业务类型的测试。
二、Sysbench安装使用
如果没有什么特别需求,直接使用EPEL源安装Sysbench即可。
1 2 |
$ yum install epel-release $ yum install sysbench -y |
1 2 3 4 5 6 |
$ sysbench --version sysbench 1.0.5 $ sysbench --help Usage: sysbench [options]... [testname] [command] |
General options
--threads=N
创建测试线程的数量,默认为[1]。
--events=N
事件最大数量,默认为[0],不限制。
--time=N
最大执行时间,单位是s,默认是[0],不限制。
--forced-shutdown=STRING
超过max-time强制中断,默认是[of]f。
--thread-stack-size=SIZE
每个线程的堆栈大小,默认是[64k]。
--rate=N
average transactions rate. 0 for unlimited rate [0]。
--report-interval=N
报告中间统计信息间隔,0代表禁止,默认为[0]。
--report-checkpoints=[LIST,...]
转储完全统计信息并在指定时间点复位所有计数器,参数是逗号分隔值的列表,表示从必须执行报告检查点的测试开始所经过的时间(以秒为单位)。 默认情况下,报告检查点处于关闭状态[off]。
--debug[=on|off]
是否显示更多的调试信息,默认是[off]。
--validate[=on|off]
在可能情况下执行验证检查,默认是[off]。
--help[=on|off]
输出help信息,并退出。
--version[=on|off]
输出版本信息,并退出。
--config-file=FILENAME
配置文件。
--tx-rate=N
deprecated alias for –rate[0].
--max-requests=N
deprecated alias for –events[0].
--max-time=N
deprecated alias for –time[0].
--num-threads=N
deprecated alias for –threads[1].
Pseudo-Random Numbers Generator options
--rand-type=STRING
分布的随机数{uniform(均匀分布),Gaussian(高斯分布),special(空间分布)},默认是special。
--rand-spec-iter=N
产生数的迭代次数,默认是12。
--rand-spec-pct=N
值的百分比被视为’special’ (for special distribution),默认是1。
--rand-spec-res=N
‘special’的百分比值,默认是75。
--rand-seed=N
随机数发生器的种子,值为0时,将当前时间用作rng种子,默认值[0]。
--rand-pareto-h=N
参数h用于pareto分布[0.2]。
Log options
--verbosity=N
日志详细级别{5-调试, 0-仅重要消息},默认未[3]。
--percentile=N
在延迟统计数据中计算的百分点 (1-100),使用特殊值0来禁用百分比计算[95]。
--histogram[=on|off]
在报告中打印滞后时间直方图,默认未[off]。
Compiled-in database drivers
mysql
MySQL驱动。
pgsql
PostgreSQ驱动。
mysql options
--mysql-host=[LIST,...]
MySQL服务器地址[localhost]。
--mysql-port=[LIST,...]
MySQL服务器端口[3306]。
--mysql-socket=[LIST,...]
MySQL服务器的socket地址。
--mysql-user=STRING
MySQL服务器的用户名[sbtest]。
--mysql-password=STRING
MySQL用户名密码。
--mysql-db=STRING
MySQL数据库名称[sbtest]。
--mysql-compression[=on|off]
是否使用压缩[off]。
pgsql options
--pgsql-host=[LIST,...]
PostgreSQL服务器地址[localhost]。
--pgsql-port=[LIST,...]
PostgreSQL服务器端口[5432]。
--pgsql-user=STRING
PostgreSQL服务器的用户名[sbtest]。
--pgsql-password=STRING
PostgreSQL用户名密码。
--pgsql-db=STRING
PostgreSQL数据库名称[sbtest]。
Compiled-in tests
fileio
文件I/O测试。
cpu
CPU性能测试。
memory
内存速率测试。
threads
线程子系统性能测试。
mutex
互斥锁性能测试。
三、Sysbench压测MySQL
Sysbench压测MySQL流程:prepare(准备数据) -> run(运行测试) -> cleanup(清理数据)
下面是目前社区提供的lua脚步(安装sysbench默认自带)
1 2 3 4 5 6 7 8 9 10 11 12 |
/usr/share/sysbench/bulk_insert.lua /usr/share/sysbench/oltp_common.lua /usr/share/sysbench/oltp_delete.lua /usr/share/sysbench/oltp_insert.lua /usr/share/sysbench/oltp_point_select.lua /usr/share/sysbench/oltp_read_only.lua /usr/share/sysbench/oltp_read_write.lua /usr/share/sysbench/oltp_update_index.lua /usr/share/sysbench/oltp_update_non_index.lua /usr/share/sysbench/oltp_write_only.lua /usr/share/sysbench/select_random_points.lua /usr/share/sysbench/select_random_ranges.lua |
以oltp_read_only.lua为例压测MySQL:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ sysbench /usr/share/sysbench/oltp_read_only.lua \ --mysql-host=127.0.0.1 \ --mysql-port=3306 \ --mysql-user=root \ --mysql-password='000000' \ --mysql-db=sbtest \ --db-driver=mysql \ --tables=10 \ --table-size=1000000 \ --report-interval=10 \ --threads=128 \ --time=120 \ prepare/run/cleanup |
注意最后一行,一项测试开始前需要用prepare来准备好表和数据,run执行真正的压测,cleanup用来清除数据和表。
对run运行的测试结果解读:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
Threads started! [ 10s ] thds: 128 tps: 1783.19 qps: 28619.21 (r/w/o: 25040.86/0.00/3578.35) lat (ms,95%): 95.81 err/s: 0.00 reconn/s: 0.00 [ 20s ] thds: 128 tps: 1835.59 qps: 29366.45 (r/w/o: 25695.97/0.00/3670.48) lat (ms,95%): 89.16 err/s: 0.00 reconn/s: 0.00 [ 30s ] thds: 128 tps: 1817.55 qps: 29109.28 (r/w/o: 25473.28/0.00/3636.00) lat (ms,95%): 92.42 err/s: 0.00 reconn/s: 0.00 [ 40s ] thds: 128 tps: 1827.61 qps: 29219.50 (r/w/o: 25564.89/0.00/3654.61) lat (ms,95%): 90.78 err/s: 0.00 reconn/s: 0.00 [ 50s ] thds: 128 tps: 1851.99 qps: 29630.19 (r/w/o: 25927.10/0.00/3703.09) lat (ms,95%): 87.56 err/s: 0.00 reconn/s: 0.00 [ 60s ] thds: 128 tps: 1844.18 qps: 29522.42 (r/w/o: 25832.46/0.00/3689.97) lat (ms,95%): 92.42 err/s: 0.00 reconn/s: 0.00 [ 70s ] thds: 128 tps: 1851.41 qps: 29623.96 (r/w/o: 25921.34/0.00/3702.62) lat (ms,95%): 90.78 err/s: 0.00 reconn/s: 0.00 [ 80s ] thds: 128 tps: 1856.24 qps: 29691.77 (r/w/o: 25979.40/0.00/3712.37) lat (ms,95%): 89.16 err/s: 0.00 reconn/s: 0.00 [ 90s ] thds: 128 tps: 1853.41 qps: 29648.01 (r/w/o: 25942.60/0.00/3705.41) lat (ms,95%): 89.16 err/s: 0.00 reconn/s: 0.00 [ 100s ] thds: 128 tps: 1859.62 qps: 29761.45 (r/w/o: 26041.02/0.00/3720.43) lat (ms,95%): 87.56 err/s: 0.00 reconn/s: 0.00 [ 110s ] thds: 128 tps: 1848.24 qps: 29565.50 (r/w/o: 25869.01/0.00/3696.49) lat (ms,95%): 90.78 err/s: 0.00 reconn/s: 0.00 [ 120s ] thds: 128 tps: 1854.56 qps: 29673.29 (r/w/o: 25964.68/0.00/3708.61) lat (ms,95%): 89.16 err/s: 0.00 reconn/s: 0.00 SQL statistics: queries performed: read: 3093664 //总select数量; write: 0 //总update、insert、delete语句数量; other: 441952 //commit、unlock tables以及其他mutex的数量; total: 3535616 // transactions: 220976 (1840.26 per sec.) //TPS; queries: 3535616 (29444.16 per sec.) //QPS; ignored errors: 0 (0.00 per sec.) //忽略的错误数; reconnects: 0 (0.00 per sec.) General statistics: total time: 120.0767s //即time指定的压测实际; total number of events: 220976 //总的事件数,一般与transactions相同; Latency (ms): min: 2.12 //最小响应时间; avg: 69.53 //平均响应时间; max: 238.63 //最大响应时间; 95th percentile: 90.78 //95%的语句的平均响应时间; sum: 15364047.92 //总响应时间; Threads fairness: events (avg/stddev): 1726.3750/15.07 execution time (avg/stddev): 120.0316/0.02 |
我们一般关注的指标主要有:
- response time avg:平均响应时间(后面的95%的大小可以通过–percentile=98的方式去更改)。
- transactions:精确的说是这一项后面的TPS,但如果使用了–skip-trx=on,这项事务数为0,需要用total number of events去除以总时间,得到tps(其实还可以分为读tps和写tps)。
- queries:用它除以总时间,得到吞吐量QPS。
- 当然还有一些系统层面的cpu,io,mem相关指标。
四、Sysbench压测磁盘IO
在Sysbench后跟上对应的内置可测试项名称,然后跟上help即可获得帮助信息。
对于MySQL来说,一般用户可能更关心的就是磁盘性能和OLTP性能,因此上面测试了OLTP,下面就来测试一下FILEIO,对于磁盘的测试,sysbench提供了以下测试选项:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ sysbench fileio help sysbench 1.0.5 (using system LuaJIT 2.0.4) fileio options: --file-num=N number of files to create [128] --file-block-size=N block size to use in all IO operations [16384] --file-total-size=SIZE total size of files to create [2G] --file-test-mode=STRING test mode {seqwr, seqrewr, seqrd, rndrd, rndwr, rndrw} --file-io-mode=STRING file operations mode {sync,async,mmap} [sync] --file-async-backlog=N number of asynchronous operatons to queue per thread [128] --file-extra-flags=STRING additional flags to use on opening files {sync,dsync,direct} [] --file-fsync-freq=N do fsync() after this number of requests (0 - don't use fsync()) [100] --file-fsync-all[=on|off] do fsync() after each write operation [off] --file-fsync-end[=on|off] do fsync() at the end of test [on] --file-fsync-mode=STRING which method to use for synchronization {fsync, fdatasync} [fsync] --file-merged-requests=N merge at most this number of IO requests if possible (0 - don't merge) [0] --file-rw-ratio=N reads/writes ratio for combined test [1.5] |
参数说明:
--file-num=N
生产测试文件的数量,默认为128。
--file-block-size=N
测试期间的块大小,如果想知道磁盘针对InnoDB存储引擎进行的测试,可以将其设置为16384,即InnoDB存储引擎页大小,默认为16384。
--file-total-size=SIZE
每个文件的带下,默认为2G。
--file-test-mode=STRING
文件测试模式,包含seqwr(顺序写)、seqrewr(顺序读写)、seqrd(顺序读)、rndrd(随机读)、rndwr(随机写)和rndrw(随机读写)。
--file-io-mode=STRING
文件操作的模式,同步还是异步,或者是选择MMAP(map映射)模式,默认为同步(sync)。
--file-async-backlog=N
打开文件时的选项,这是与API相关的参数。
--file-extra-flags=STRING
打开文件时的选项,这是与API相关的参数。可选有sync,dsync,direct。
--file-fsync-freq=N
执行fsync函数的频率,fsync主要是同步磁盘文件,因为可能有系统和磁盘缓冲的关系。默认为100,如果为0表示不使用fsync。
--file-fsync-all[=on|off]
每执行完一次写操作,就执行一次fsync,默认未off。
--file-fsync-end[=on|off]
在测试结束时,执行fsync,默认为on。
--file-fsync-mode=STRING
文件同步函数的选择,同样是和API相关的参数,由于多个操作对fdatasync支持的不同,因此不建议使用fdatasync。默认为fsync。
--file-merged-requests=N
尽可能合并此数量的io请求(0-不合并),默认为[0]。
--file-rw-ratio=N
测试时的读写比例,默认是2:1。
Sysbench的fileio测试需要经过prepare、run和cleanup三个阶段。prepare是准备阶段,生产需要的测试文件,run是实际测试阶段,cleanup是清理测试产生的文件。例如进行4个文件、总大小2GB的fileio测试:
1 2 3 4 |
$ sysbench fileio \ --file-num=4 \ --file-total-size=2G \ prepare |
接着就可以基于这些文件进行测试了,下面是1个线程下的随机读取性能:
1 2 3 4 5 6 7 8 9 10 |
$ sysbench fileio \ --time=180 \ --events=100000000 \ --threads=1 \ --file-num=4 \ --file-total-size=2G \ --file-io-mode=sync \ --file-test-mode=rndrd \ --file-block-size=16384 \ run |
上述测试的最大随机数请求是100000000次,如果在180秒内不能完成,测试即结束。测试结束后可以看到如下的测试结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
Running the test with following options: Number of threads: 1 Initializing random number generator from current time Extra file open flags: 3 16 files, 128MiB each 2GiB total file size Block size 16KiB Number of IO requests: 100000000 Read/Write ratio for combined random IO test: 1.50 Calling fsync() at the end of test, Enabled. Using synchronous I/O mode Doing random read test Initializing worker threads... Threads started! File operations: reads/s: 261.96 //磁盘IOPS; writes/s: 0.00 fsyncs/s: 0.00 Throughput: read, MiB/s: 4.09 //磁盘每秒速率; written, MiB/s: 0.00 General statistics: total time: 180.1626s total number of events: 47196 Latency (ms): min: 0.07 avg: 61.03 max: 8221.04 95th percentile: 46.63 sum: 2880341.60 Threads fairness: events (avg/stddev): 2949.7500/618.72 execution time (avg/stddev): 180.0213/0.05 |
测试结束后,记得要执行cleanup,确保测试产生的文件都已经删除。
1 2 3 4 |
sysbench fileio \ --file-num=16 \ --file-total-size=2G \ cleanup |
参照随机读配置,可以接着测试随机写、随机读写、顺序写、顺序读等所有这些模式。
五、Sysbench压测内存
同样的方式,查看压测内存可用选项:
1 2 3 4 5 6 7 8 9 10 |
$ sysbench memory help sysbench 1.0.9 (using system LuaJIT 2.0.4) memory options: --memory-block-size=SIZE size of memory block for test [1K] --memory-total-size=SIZE total size of data to transfer [100G] --memory-scope=STRING memory access scope {global,local} [global] --memory-hugetlb[=on|off] allocate memory from HugeTLB pool [off] --memory-oper=STRING type of memory operations {read, write, none} [write] --memory-access-mode=STRING memory access mode {seq,rnd} [seq] |
参数说明:
--memory-block-size=SIZE
测试内存块的大小,默认为1K。
--memory-total-size=SIZE
数据传输的总大小,默认为100G。
--memory-scope=STRING
内存访问的范围,包括全局和本地范围,默认为global。
--memory-hugetlb=[on|off]
是否从HugeTLB池分配内存的开关,默认为off。
--memory-oper=STRING
内存操作的类型,包括read, write, none,默认为write。
--memory-access-mode=STRING
内存访问模式,包括seq,rnd两种模式,默认为seq。
六、Sysbench压测CPU
同样的方式,查看压测CPU可用选项:
1 2 3 4 5 |
$ sysbench cpu help sysbench 1.0.9 (using system LuaJIT 2.0.4) cpu options: --cpu-max-prime=N upper limit for primes generator [10000] |
就一个选项用来指定最大的素数,具体参数可以根据CPU的性能来设置,默认为10000。
<参考>