Linux命令 sysbench


原文链接: Linux命令 sysbench

docker run --rm -it -v sshfs:/data -w /data tjakobsson/sysbench sysbench --test=fileio --file-num=64 prepare
docker run --rm -it -v sshfs:/data -w /data tjakobsson/sysbench sysbench --test=fileio --file-num=64 --file-test-mode=seqrewr run
docker run --rm -it -v sshfs:/data -w /data tjakobsson/sysbench sysbench --test=fileio cleanup

cpu性能

磁盘io性能

IO测试 ,切忌读写文件最好要大于当前内存

IO测试选项及参数介绍
--file-num=10 #创建多少个文件,这里是10个
--file-block-size=4k #单个IO块大小,这里是4k
--file-total-size=4g #创建的文件总大小,这里是4GB
--file-test-mode=seqwr #测试方式,这里是顺序写,可选参数( seqwr 顺序写, |seqrd 顺序读,| seqrewr 顺序读写,| rndwr 随机写,| rndrd 随机读,| rndrw随机读写 )
--file-io-mode=sync #文件操作模式,这里是(默认)同步,可选参数( sync 同步,| async 异步,| mmap )
--file-async-backlog=N #对应每个线程队列的异步操作数,默认为128
--file-extra-flags=STRING #additional flags to use on opening files {sync,dsync,direct} []
--file-fsync-freq=N #当请求数达到多少时执行fsync()刷新,默认100,0代表过程中不执行fsync()
--file-fsync-all=[on|off] #执行每一个写操作后执行fsync()刷新操作,默认关闭off
--file-fsync-end=[on|off] #测试结束执行fsync()操作,默认开启on
--file-fsync-mode=STRING #同步刷新方法,默认fsync {fsync, fdatasync}
--file-merged-requests=N #合并指定数量的IO请求,0代表不合并,默认0
--file-rw-ratio=N #读写比例,默认1.5

IO测试实例(分准备prepare,运行run,清理cleanup三个步骤)

创建20个文件,共计2G大小,
sysbench --test=fileio --num-threads=2 --file-total-size=2g --file-test-mode=rndrw --file-num=20 --file-block-size=4k --file-io-mode=sync prepare

开始fileio测试(使用两个线程--num-threads=2)
sysbench --test=fileio --num-threads=2 --file-total-size=2g --file-test-mode=rndrw --file-num=20 --file-block-size=4k --file-io-mode=sync run

测试完成执行cleanup
sysbench --test=fileio --num-threads=2 --file-total-size=2g --file-test-mode=rndrw --file-num=20 --file-block-size=4k --file-io-mode=sync cleanup

调度程序性能

内存分配及传输速度

内存测试

内存测试选项及参数介绍
--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

内存测试实例
#测试按4kB的块大小,顺序 写 200g所需时间
sysbench --test=memory --memory-block-size=4k --memory-total-size=200g --memory-oper=write --memory-access-mode=seq run

POSIX线程性能

线程以及mutex互斥锁测试

线程测试选项及参数介绍
--thread-yields=N #每个请求执行“lock/yield/unlock”循环的次数,默认1000
--thread-locks=N #每个线程的互斥锁,默认8个

线程测试实例
sysbench --test=threads --thread-yields=1000 --thread-locks=8 run

mutex互斥锁测试,选项及参数介绍
--mutex-num=N #数组互斥的总大小。默认是4096
--mutex-locks=N #每个线程互斥锁的数量。默认是50000
--mutex-loops=N #内部互斥锁的空循环数量。默认是10000

mutex互斥锁测试实例
sysbench --test=mutex --mutex-num=4096 --mutex-locks=50000 --mutex-loops=10000 run

数据库性能(OLTP基准测试)

1、cpu性能测试

sysbench --test=cpu --cpu-max-prime=20000 run

cpu测试主要是进行素数的加法运算,在上面的例子中,指定了最大的素数为 20000,自己可以根据机器cpu的性能来适当调整数值。

2、线程测试

sysbench --num-threads=4 --test=cpu --cpu-max-prime=200000 run
sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run

3、磁盘IO性能测试

sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw prepare
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw run
sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw cleanup

上述参数指定了最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读。
file IO性能测试

sysbench可以测试sync,async,mmap的素随机读,随机写,随机读写,顺序读,顺序写,顺序读写的IO速率

$ sysbench --test=fileio --file-total-size=10G prepare #准备测试文件

sync

$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=sync --file-test-mode=rndrw --file-extra-flags=direct run #sync模式下 随机读写
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=sync --file-test-mode=rndrd --file-extra-flags=direct run #sync模式下 随机读
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=sync --file-test-mode=rndwr --file-extra-flags=direct run #sync模式下 随机写
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=sync --file-test-mode=seqrd --file-extra-flags=direct run #sync模式下 顺序读
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=sync --file-test-mode=seqwr --file-extra-flags=direct run #sync模式下 顺序写
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=sync --file-test-mode=seqrewr --file-extra-flags=direct run #sync模式下 顺序读写

async

$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=async --file-test-mode=rndrw --file-extra-flags=direct run #async模式下 随机读写
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=async --file-test-mode=rndrd --file-extra-flags=direct run #async模式下 随机读
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=async --file-test-mode=rndwr --file-extra-flags=direct run #async模式下 随机写
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=async --file-test-mode=seqrd --file-extra-flags=direct run #async模式下 顺序读
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=async --file-test-mode=seqwr --file-extra-flags=direct run #async模式下 顺序写
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=async --file-test-mode=seqrewr --file-extra-flags=direct run #async模式下 顺序读写
###mmap
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=mmap --file-test-mode=rndrw --file-extra-flags=direct run #mmap模式下 随机读写
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=mmap --file-test-mode=rndrd --file-extra-flags=direct run #mmap模式下 随机读
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=mmap --file-test-mode=rndwr --file-extra-flags=direct run #mmap模式下 随机写
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=mmap --file-test-mode=seqrd --file-extra-flags=direct run #mmap模式下 顺序读
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=mmap --file-test-mode=seqwr --file-extra-flags=direct run #mmap模式下 顺序写
$ sysbench --test=fileio --file-total-size=10G --file-block-size=16384 --file-io-mode=mmap --file-test-mode=seqrewr --file-extra-flags=direct run #mmap模式下 顺序读写
$ sysbench --test=fileio --file-total-size=10G cleanup #清理测试文件

内存性能测试

使用sysbench可以测试读写内存的速率,有顺序和随机两种访问方式。

$ sysbench --test=memory --memory-block-size=8K --memory-total-size=1G --memory-access-mode=seq --memory-oper=read run #顺序访问模式下读内存 8k块大小 传输总共1G数据
$ sysbench --test=memory --memory-block-size=8K --memory-total-size=1G --memory-access-mode=seq --memory-oper=write run #顺序访问模式下写内存 8k块大小 传输总共1G数据

$ sysbench --test=memory --memory-block-size=16K --memory-total-size=1G --memory-access-mode=seq --memory-oper=read run #顺序访问模式下读内存 16k块大小 传输总共1G数据
$ sysbench --test=memory --memory-block-size=16K --memory-total-size=1G --memory-access-mode=seq --memory-oper=write run #顺序访问模式下读内存 16k块大小 传输总共1G数据

$ sysbench --test=memory --memory-block-size=8K --memory-total-size=10G --memory-access-mode=seq --memory-oper=read run #顺序访问模式下读内存 8k块大小 传输总共10G数据
$ sysbench --test=memory --memory-block-size=8K --memory-total-size=10G --memory-access-mode=seq --memory-oper=write run #顺序访问模式下写内存 8k块大小 传输总共10G数据

$ sysbench --test=memory --memory-block-size=16K --memory-total-size=10G --memory-access-mode=seq --memory-oper=read run #顺序访问模式下读内存 16k块大小 传输总共10G数据
$ sysbench --test=memory --memory-block-size=16K --memory-total-size=10G --memory-access-mode=seq --memory-oper=write run #顺序访问模式下写内存 16k块大小 传输总共10G数据

$ sysbench --test=memory --memory-block-size=8K --memory-total-size=1G --memory-access-mode=rnd --memory-oper=read run #随机访问模式下读内存 8k块大小 传输总共1G数据
$ sysbench --test=memory --memory-block-size=8K --memory-total-size=1G --memory-access-mode=rnd --memory-oper=write run #随机访问模式下写内存 8k块大小 传输总共1G数据

$ sysbench --test=memory --memory-block-size=16K --memory-total-size=1G --memory-access-mode=rnd --memory-oper=read run #随机访问模式下读内存 16k块大小 传输总共1G数据
$ sysbench --test=memory --memory-block-size=16K --memory-total-size=1G --memory-access-mode=rnd --memory-oper=write run #随机访问模式下写内存 16k块大小 传输总共1G数据

$ sysbench --test=memory --memory-block-size=8K --memory-total-size=10G --memory-access-mode=rnd --memory-oper=read run #随机访问模式下读内存 8k块大小 传输总共10G数据
$ sysbench --test=memory --memory-block-size=8K --memory-total-size=10G --memory-access-mode=rnd --memory-oper=write run #随机访问模式下写内存 8k块大小 传输总共10G数据

$ sysbench --test=memory --memory-block-size=16K --memory-total-size=10G --memory-access-mode=rnd --memory-oper=read run #随机访问模式下读内存 8k块大小 传输总共10G数据
$ sysbench --test=memory --memory-block-size=16K --memory-total-size=10G --memory-access-mode=rnd --memory-oper=write run #随机访问模式下写内存 8k块大小 传输总共10G数据

4、内存测试

sysbench --test=memory --memory-block-size=8k --memory-total-size=4G run
上述参数指定了本次测试整个过程是在内存中传输 4G 的数据量,每个 block 大小为 8K。

5、OLTP测试

sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=1000000
--mysql-socket=/tmp/mysql.sock --mysql-user=test --mysql-host=localhost
--mysql-password=test prepare

上述参数指定了本次测试的表存储引擎类型为 myisam,这里需要注意的是,官方网站上的参数有一处有误,即 --mysql-table-engine,官方网站上写的是 --mysql-table-type,这个应该是没有及时更新导致的。另外,指定了表最大记录数为 1000000,其他参数就很好理解了,主要是指定登录方式。测试 OLTP 时,可以自己先创建数据库 sbtest,或者自己用参数 --mysql-db 来指定其他数据库。--mysql-table-engine 还可以指定为 innodb 等 MySQL 支持的表存储引擎类型。

File-IO

sysbench --test=fileio --file-total-size=150G prepare sysbench --test=fileio --file-total-size=150G --file-test-mode=rndrw --init-rng=on --max-time=300 --max-requests=0 run ysbench --test=fileio --file-total-size=150G cleanup

对数据库压力测试的文件:

MySQL

fileio :文件I/O测试。
cpu :CPU性能测试。
memory :内存速率测试。
threads :线程子系统性能测试。
mutex :互斥锁性能测试。
mysql :MySQL驱动。
--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-ssl[=on|off] use SSL connections, if available in the client library [off]
--mysql-ssl-cipher=STRING use specific cipher for SSL connections []
--mysql-compression[=on|off] 是否使用压缩[off]。
--mysql-debug[=on|off] trace all client library calls [off]
--mysql-ignore-errors=[LIST,...] list of errors to ignore, or "all" [1213,1020,1205]
--mysql-dry-run[=on|off] Dry run, pretend that all MySQL client API calls are successful without executing them [off]

pgsql :PostgreSQ驱动。
--pgsql-host=[LIST,...] :PostgreSQL服务器地址[localhost]。
--pgsql-port=[LIST,...] :PostgreSQL服务器端口[5432]。
--pgsql-user=STRING :PostgreSQL服务器的用户名[sbtest]。
--pgsql-password=STRING :PostgreSQL用户名密码。
--pgsql-db=STRING :PostgreSQL数据库名称[sbtest]。

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]。

三、Sysbench压测MySQL

Sysbench压测MySQL流程:prepare(准备数据) -> run(运行测试) -> cleanup(清理数据)

下面是目前社区提供的lua脚步(安装sysbench默认自带)

/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

sysbench --db-driver=mysql --test=/usr/share/sysbench/oltp_insert.lua --table-size=1000000 --mysql-host=localhost --mysql-user=bench --mysql-password=bench --mysql-port=3306 --mysql-db=bench prepare
sysbench --db-driver=mysql --test=/usr/share/sysbench/oltp_insert.lua --table-size=1000000 --mysql-host=localhost --mysql-user=root --mysql-password= --mysql-port=3306 --mysql-db=test prepare

以oltp_read_only.lua为例压测MySQL:
$ sysbench /usr/share/sysbench/oltp_read_only.lua
--mysql-host=127.0.0.1
--mysql-port=3306
--mysql-user=bench
--mysql-password='bench'
--mysql-db=bench
--db-driver=mysql
--tables=10
--table-size=1000000
--report-interval=10
--threads=128
--time=120
prepare run cleanup

注意最后一行,一项测试开始前需要用prepare来准备好表和数据,run执行真正的压测,cleanup用来清除数据和表。

对run运行的测试结果解读:
主要结果参数说明:

tps是平均每秒钟事务提交次数,qps表示每秒查询次数(包括read和write),transactions 事务每秒。

sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=bench --mysql-user=bench --mysql-password=bench prepare
sysbench --test=oltp --oltp-table-size=1000000 --mysql-db=bench --mysql-user=bench --mysql-password=bench --max-time=60 --oltp-read-only=on --max-requests=0 --num-threads=8 run
sysbench --test=oltp --mysql-db=test --mysql-user=root --mysql-password=yourrootsqlpassword cleanup

create tables and load data

sysbench --db-driver=mysql --test=/usr/share/sysbench/oltp_insert.lua tests/include/oltp_legacy/oltp.lua --oltp-table-size=1000000  --mysql-host=localhost --mysql-user=bench --mysql-password=bench --mysql-port=3306 --mysql-db=bench prepare

run

sysbench --db-driver=mysql --test=/usr/share/sysbench/tests/include/oltp_legacy/oltp.lua --oltp-table-size=1000000 --mysql-db=demo --mysql-user=root --mysql-password=oracle --mysql-port=3306 --mysql-host=mysqlserver01 --time=60 --oltp-read-only=off --max-requests=0 --threads=8 run

sysbench --db-driver=mysql --mysql-db=test --mysql-port=3306 --mysql-user=bench --mysql-password=bench --test=oltp.lua --oltp_tables_count=20 --oltp-table-size=1000000 --rand-init=on prepare

FileIO 测试

--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映射)模式,默认为同步。

--file-async-backlog=N :打开文件时的选项,这是与API相关的参数。

--file-extra-flags=STRING :打开文件时的选项,这是与API相关的参数。

--file-fsync-freq=N :执行fsync函数的频率,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是清理测试产生的文件。例如进行16个文件、总大小2GB的fileio测试:
$ sysbench fileio
--file-num=16
--file-total-size=2G
prepare

接着就可以基于这些文件进行测试了,下面是16个线程下的随机读取性能:
$ sysbench fileio
--time=180
--events=100000000
--threads=16
--file-num=16
--file-total-size=2G
--file-test-mode=rndrd
--file-num=16
--file-extra-flags=direct
--file-fsync-freq=0
--file-block-size=16384
run

上述测试的最大随机数请求是100000000次,如果在180秒内不能完成,测试即结束。测试结束后可以看到如下的测试结果:

Running the test with following options:
Number of threads: 16
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,确保测试产生的文件都已经删除。
sysbench fileio
--file-num=16
--file-total-size=2G
cleanup

`