1.前言
Sysbench工具目前是很多互联网公司专门做数据库压测工具之一,相较于于其他的压测工具,它更受到众多互联网公司的青睐,因此,本次主要想要对Sysbench工具的使用一次比较全面的总结。
2.工具背景
sysbench是一个开源的、模块化的、跨平台的多线程性能测试工具,可以用来进行CPU、内存、磁盘I/O、线程、数据库的性能测试。目前支持的数据库有MySQL、Oracle和PostgreSQL。以下操作都将以支持MySQL数据库为例进行。
3.工具下载安装
该工具可以在github上进行下载,下载地址是:https://github.com/akopytov/sysbench/releases/tag/1.0.20 下载完了之后,就可以根据安装包中的安装文档一步步进行安装了(很简单)
4.安装出现的问题(如果没有请自动忽略)
我们在安装sysbench工具是可能会遇到如下问题:
错误:error while loading shared libraries: libmysqlclient.so.20
解决:
1 1.首先查看服务器上是否存在该文件 2 -->find / --name 'libmysqlclient*' 3 4 2.如果有的话,将这个文件拷贝到/usr/local/lib目录下(或者做一个软件) 5 --> ln -s 源文件路径 /usr/local/lib/libmysqlclient.so.20 6 7 3.进入/etc/ld.so.conf文件中添加一行 8 -->/usr/local/lib 9 10 4.执行ldconfig -v更新一下配置即可 11 -->/sbin/ldconfig -v
5.Sysbench使用
首先先要声明一下的是,目前网络上有很多旧版的sysbench,比如说0.4、0.5等等,但是目前sysbench工具最小的是1.0版本,因此,这里我建议再做压测的时候,都可以使用最新版本,因为里面修复了旧版本之前的版本,这里这要记录新版本1.0的使用。
5.1对数据库的压力测试(这里针对)
1.设置环境变量设置(根据自己实际情况来) host=192.168.31.201 port=3307 user=sysbench pass=123 db=sysbench tablenum=10 table_size=10000 threadnum=8 timerun=30 rootdir=~ ; bindir=$rootdir/apps/sysbench-1.0.20/src; luadir=$bindir/lua; 2.开始测试 2.0 -创建数据库 mysql -h${host} -P${port} -u${user} -p${pass} -e "create database if not exists ${db} " 2.1 针对oltp事务进行压测(prepare(装载数据)-->run(运行)-->cleanup(清除数据)) -->cd $luadir --> ../sysbench oltp_read_write.lua --mysql-user=${user} --mysql-password="${pass}" --mysql-host=$host --mysql-port=$port --mysql-db=${db} --table-size=${table_size} --tables=${tablenum} prepare --cd $luadir --> ../sysbench oltp_read_write.lua --threads=${threadnum} --mysql-user=${user} --mysql-password="${pass}" --mysql-host=$host --mysql-port=$port --mysql-db=${db} --report-interval=1 --table-size=${table_size} --tables=${tablenum} run -->cd $luadir --> ../sysbench oltp_read_write.lua --threads=${threadnum} --mysql-user=${user} --mysql-password="${pass}" --mysql-host=$host --mysql-port=$port --mysql-db=${db} --report-interval=1 --table-size=${table_size} --tables=${tablenum} cleanup
2.3测试结果如下
1 Threads started! 2 3 [ 1s ] thds: 8 tps: 221.41 qps: 4560.78 (r/w/o: 3211.39/898.59/450.79) lat (ms,95%): 42.61 err/s: 0.00 reconn/s: 0.00 4 [ 2s ] thds: 8 tps: 239.29 qps: 4763.76 (r/w/o: 3327.02/959.16/477.58) lat (ms,95%): 41.10 err/s: 0.00 reconn/s: 0.00 5 [ 3s ] thds: 8 tps: 243.98 qps: 4890.61 (r/w/o: 3433.73/967.92/488.96) lat (ms,95%): 38.94 err/s: 0.00 reconn/s: 0.00 6 [ 4s ] thds: 8 tps: 244.87 qps: 4866.44 (r/w/o: 3404.21/972.49/489.74) lat (ms,95%): 37.56 err/s: 0.00 reconn/s: 0.00 7 [ 5s ] thds: 8 tps: 242.14 qps: 4834.71 (r/w/o: 3378.89/972.54/483.27) lat (ms,95%): 41.10 err/s: 0.00 reconn/s: 0.00 8 [ 6s ] thds: 8 tps: 235.99 qps: 4752.88 (r/w/o: 3335.91/943.98/472.99) lat (ms,95%): 38.94 err/s: 0.00 reconn/s: 0.00 9 [ 7s ] thds: 8 tps: 212.99 qps: 4208.77 (r/w/o: 2933.84/849.95/424.98) lat (ms,95%): 50.11 err/s: 0.00 reconn/s: 0.00 10 [ 8s ] thds: 8 tps: 214.01 qps: 4308.17 (r/w/o: 3018.12/861.03/429.02) lat (ms,95%): 57.87 err/s: 0.00 reconn/s: 0.00 11 [ 9s ] thds: 8 tps: 180.01 qps: 3624.24 (r/w/o: 2543.17/721.05/360.02) lat (ms,95%): 82.96 err/s: 0.00 reconn/s: 0.00 12 [ 10s ] thds: 8 tps: 215.00 qps: 4270.92 (r/w/o: 2988.94/851.98/429.99) lat (ms,95%): 51.02 err/s: 0.00 reconn/s: 0.00 13 SQL statistics: 14 queries performed: 15 read: 31612 16 write: 9032 17 other: 4516 18 total: 45160 19 transactions: 2258 (225.05 per sec.) 20 queries: 45160 (4501.08 per sec.) 21 ignored errors: 0 (0.00 per sec.) 22 reconnects: 0 (0.00 per sec.) 23 24 General statistics: 25 total time: 10.0320s 26 total number of events: 2258 27 28 Latency (ms): 29 min: 14.15 30 avg: 35.51 31 max: 127.24 32 95th percentile: 48.34 33 sum: 80186.71 34 35 Threads fairness: 36 events (avg/stddev): 282.2500/1.92 37 execution time (avg/stddev): 10.0233/0.00
2.4 这里除了可以测试上述的oltp事务的混合读写(这个也是数据库经常用到的脚本)之外,还可以测是oltp事务的其它特性(例如:oltp_read_only.lua:只读 等等)
6.测试服务器的cpu性能
# 素数上限2万,默认10秒,2个线程 sysbench cpu --cpu-max-prime=20000 --threads=2 run
6.1测试结果
[root@node01 tmp]# sysbench cpu --cpu-max-prime=20000 --threads=2 run sysbench 1.1.0-bbee5d5 (using bundled LuaJIT 2.1.0-beta3) Running the test with following options: Number of threads: 2 //指定线程个数 Initializing random number generator from current time Prime numbers limit: 20000 //每个线程产生的素数上限均为2万个 Initializing worker threads... Threads started! CPU speed: events per second: 446.69 //所有线程每秒完成了446.69次event Throughput: events/s (eps): 446.6855 time elapsed: 10.0026s //共耗时10秒 total number of events: 4468 //在10秒内共完成了4468次event Latency (ms): min: 2.09 //完成1次event最少耗时2.09ms avg: 4.44 //完成所有events平均耗时4.44ms max: 24.57 //完成1次event最大耗时24.57毫秒 95th percentile: 13.22 //95%的events完成都在13.22ms完成 sum: 19842.20 //每个线程耗时10ms,2个线程总共耗时20ms Threads fairness: events (avg/stddev): 2234.0000/0.00 //平均每完成2234次event,标准差是0.00 execution time (avg/stddev): 9.9211/0.02 //每个线程平均耗时10秒,标准差为0.02event:表示完成了几轮素数计算stddev:标准差,在相同时间内,多个线程分别完成素数计算次数是否稳定,如果数值越低,那么多个线程的结果就越接近(即越稳定),该线程对单线程无意义。
7.测试磁盘iops
#一定要到你测试的磁盘目录下执行,否则可能测试系统盘了,因此如果我们想要做数据库下的磁盘的iops的话,那么我们一定要到有数据库的数据目录下进行测试(以下三步走)
sysbench fileio --file-total-size=1G --file-test-mode=rndrw --time=30 --max-requests=0 prepare sysbench fileio --file-total-size=1G --file-test-mode=rndrw --time=30 --max-requests=0 run sysbench fileio --file-total-size=1G --file-test-mode=rndrw --time=30 --max-requests=0 cleanup
##主要这里有些参数用的是默认值,比如 : --file-num用的是默认值128 ,因此如果用默认的128的话,那么可能测出的iops将达不到预想的结果
##这里面的参数都可以进行调整,以我们实际的情况为准,这个很重要!
测试结果如下
Threads started! File operations: reads/s: 5941.19 writes/s: 3960.78 fsyncs/s: 99.03 Throughput: read, MiB/s: 92.83 written, MiB/s: 61.89 General statistics: total time: 30.0054s total number of events: 300129 Latency (ms): min: 0.00 avg: 0.10 max: 8.27 95th percentile: 0.42 sum: 29799.22 Threads fairness: events (avg/stddev): 300129.0000/0.00 execution time (avg/stddev): 29.7992/0.00 ##这里用的默认的生成128个文件,其中read, MiB/s + written, MiB/s之和是我们磁盘io的总带宽,换算成iops的话,需要知道此事磁盘的一个block块的大小(比如说4k),那么此时的iops的结果为:(92.83+61.89)*1024/4=39608.32 表示磁盘每秒可混合读写30000次。
注意:这里有一个问题,如果生成的文件总和大小很大,且生成的文件数很多的话,那么可能测试结果就不是很精确了,因为,由于磁盘能力的显示,在快速读写文件同时,会发生大量的cpu上下文的切换和中断,因此在实际的生产中,最好要预估一下数据量和每天用户访问的次数等等。
8.总结:
首先,以上的三中压测都是比较简单的压缩,我们可以根据实际情况进行参数的调整和添加,其次是我们在生产中磁盘的iops,一般常用的工具是fio