sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的数据库负载情况。
| 主要测试方式 | |||||
|---|---|---|---|---|---|
| cpu性能 | 磁盘io性能 | 调度程序性能 | 内存分配及传输速度 | POSIX线程性能 | 数据库性能(OLTP基准测试) |
| 找范围内最大素数{时间越短越好} | 不同场景下IOPS{越大越好} | 线程并发执行,循环响应信号量花费的时间{越少越好} | 以不同块大小传输一定数量的数据吞吐量大小{越大越好} | 并发线程同时申请互斥锁循环一定次数花费的时间{越少越好} | qps、tps越高越好 |
目前sysbench主要支持 MySQL,pgsql,oracle 这3种数据库。
安装测试环境为:RHEL7.2 MariaDB5.5.44
安装sysbench-0.5
源码地址https://github.com/BoobooWei/sysbench/archive/master.zip
[root@localhost ~]# unzip sysbench-master.zip |
测试
MySQL数据库测试
sysbench 0.5通过一系列LUA脚本来替换之前的oltp,来模拟更接近真实的基准测试环境。这些测试脚本包含:insert.lua、oltp.lua、parallel_prepare.lua、select_random_points.lua、update_index.lua、delete.luaoltp_simple.lua、select.lua、select_random_ranges.lua、update_non_index.lua,脚本使用方式基本类似。
sysbench 0.5默认使用sbtest库,但是需要自己手工先创建好,也可以使用–mysql-db指定,其他非默认项指定选项:
–mysql-host
–mysql-port
–mysql-socket
–mysql-user
–mysql-password
–mysql-db
–mysql-ssl
prepare
生成表并插入数据,可使用parallel_prepare.lua脚本来并行准备数据。
-–db-driver 服务器类型 mysql | drizzle,默认为mysql
-–mysql-table-engine 表存数引擎
-–myisam-max-rows MyISAM表MAX_ROWS选项(用于大表)
–-oltp-table-count 生成表数量[sbtest1、sbtest2…]
-–oltp-table-size 生成表的行数
-–oltp-secondary ID列生成二级索引而不是主键
–-oltp-auto-inc设置ID列是否自增 on | off,默认为on –oltp-read-only=on
–test=sysbench-0.5/sysbench/tests目录下测试脚本
sysbench \ |
[root@localhost sysbench]# sysbench --test=/root/sysbench-master/sysbench/tests/db/oltp.lua --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=uplooking --oltp-table-size=10000 --num-threads=8 --max-time=10 --mysql-db=sbtest --max-requests=0 --oltp-test-mode=complex --report-interval=1 --mysql-table-engine=innodb prepare |
如果是多表呢并增加表的大小,情况又会如何呢?
[root@localhost sysbench]# sysbench --test=/root/sysbench-master/sysbench/tests/db/oltp.lua --mysql-host=localhost --mysql-port=3306 --mysql-user=root --mysql-password=uplooking --oltp-tables-count=10 --oltp-table-size=100000 --num-threads=128 --max-time=60 --mysql-db=sbtest --max-requests=0 --oltp-test-mode=complex --report-interval=1 --mysql-table-engine=innodb prepare |
CPU测试
使用64位整数,测试计算素数直到某个最大值所需要的时间
sysbench --test=cpu --cpu-max-prime=2000 run
查看CPU信息方法,查看物理cpu个数
grep "physical id" /proc/cpuinfo | sort -u | wc -l 查看核心数量
grep "core id" /proc/cpuinfo | sort -u | wc -l 查看线程数量
grep "processor" /proc/cpuinfo | sort -u | wc -l
在sysbench的测试中,–num-threads取值为”线程数量”即可
线程(thread)测试
测试线程调度器的性能。对于高负载情况下测试线程调度器的行为非常有用
sysbench --test=threads --num-threads=64 --thread-yields=100 --thread-locks=2 run
文件IO性能测试
生成需要的测试文件,文件总大小5G,16个并发线程。执行完后会在当前目录下生成一堆小文件
sysbench --test=fileio --num-threads=16 --file-total-size=5G prepare
执行测试,指定随机读写模式:
- seqwr顺序写入
- seqrewr顺序重写
- seqrd顺序读取
- rndrd随机读取
- rndwr随机写入
- rndrw混合随机读/写
sysbench --test=fileio --num-threads=16 --init-rng=on --file-total-size=5G --file-test-mode=rndrw run
除测试文件
sysbench --test=fileio --num-threads=16 --file-total-size=5G cleanup
内存测试
内存测试测试了内存的连续读写性能。
sysbench --test=memory --num-threads=16 --memory-block-size=8192 --memory-total-size=1G run
互斥锁(Mutex)测试
测试互斥锁的性能,方式是模拟所有线程在同一时刻并发运行,并都短暂请求互斥锁X。
sysbench --test=mutex --num-threads=16 --mutex-num=1024 --mutex-locks=10000 --mutex-loops=5000 run
安装sysbench-0.4
源码在线下载地址:http://101.96.10.46/downloads.mysql.com/source/sysbench-0.4.12.10.tar.gz
源码步骤
数据库rpm包安装则直接编译
如果数据库是rpm包安装则直接执行以下步骤,否则在configure的时候需要指定mysql数据库的库libs和includes路径
- tar zxf sysbench-0.4.8.tar.gz
- cd sysbench-0.4.8
- ./configure && make && make install
- strip /usr/local/bin/sysbench
数据库为源码编译
数据库源码编译后路径如下:
数据目录 /usr/local/mysql
includes目录 /usr/local/mysql/include
libs目录 /usr/local/mysql/lib
执行以下步骤:
- tar zxf sysbench-0.4.8.tar.gz
- cd sysbench-0.4.8
- ./configure –with-mysql-includes=/usr/local/mysql/include –with-mysql-libs=/usr/local/mysql/lib && make && make install
- strip /usr/local/bin/sysbench
rpm包安装步骤
依赖包:
mariadb-devel-5.5.44-2.el7.x86_64
postgresql-libs.x86_64 0:9.2.13-1.el7_1
[root@localhost ~]# rpm -q mariadb-devel |
| 主要测试方式 | |||||
|---|---|---|---|---|---|
| cpu性能 | 磁盘io性能 | 调度程序性能 | 内存分配及传输速度 | POSIX线程性能 | 数据库性能(OLTP基准测试) |
| 找范围内最大素数{时间越短越好} | 不同场景下IOPS{越大越好} | 线程并发执行,循环响应信号量花费的时间{越少越好} | 以不同块大小传输一定数量的数据吞吐量大小{越大越好} | 并发线程同时申请互斥锁循环一定次数花费的时间{越少越好} | qps、tps越高越好 |
开始测试
编译成功之后,就要开始测试各种性能了,测试的方法官网网站上也提到一些,但涉及到 OLTP 测试的部分却不够准确。在这里我大致提一下:
cpu性能测试
进行素数的加法运算:指定最大的素数为 20000,记录测试结果(可以根据机器cpu的性能来适当调整数值)
sysbench –test=cpu –cpu-max-prime=20000 run
[root@localhost ~]# sysbench --test=cpu --cpu-max-prime=20000 run |
线程测试
测试64个线程
sysbench –test=threads –num-threads=64 –thread-yields=100 –thread-locks=2 run
sysbench 0.4.12: multi-threaded system evaluation benchmark |
磁盘IO性能测试
最大创建16个线程,创建的文件总大小为3G,文件读写模式为随机读
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 #删除测试文件
[root@localhost ~]# sysbench --test=fileio --num-threads=16 --file-total-size=3G --file-test-mode=rndrw prepare |
内存测试
测试过程是在内存中传输 4G 的数据量,每个 block 大小为 8K。
sysbench –test=memory –memory-block-size=8k –memory-total-size=4G run
OLTP测试
测试的表存储引擎类型为innodb,表最大记录数为 1000000,
测试 OLTP 时,先创建数据库 sbtest,或者自己用参数 –mysql-db 来指定其他数据库。
–test=oltp 制定测试类型为OLTP
–db-driver=mysql 测试的数据库类型为mysql
–mysql-table-engine 指定创建的测试表sbtest为 innodb 储引擎类型
–mysql-host=localhost –mysql-user=root –mysql-password=uplooking 分别为服务器ip,用户名和密码
–oltp-table-size=10000 创建的测试表的大小为1万行
–num-threads=128 线程数量为128
[root@localhost ~]# sysbench --test=oltp --db-driver=mysql --mysql-host=localhost --mysql-user=root --mysql-password=uplooking --mysql-db=sbtest --mysql-table-engine=innodb --oltp-table-size=10000 --num-threads=128 prepare |
50.00 per sec 为每秒事务量,1195.09 per sec 每秒的读写请求数,total time: 200.0198s 总的用时