如何用sysbench做好IO性能测试
sysbench 是一个非常经典的综合性能测试工具,通常都用它来做数据库的性能压测,但也可以用来做CPU,IO的性能测试。而对于IO测试,不是很推荐sysbench,倒不是说它有错误,工具本身没有任何问题,它的测试方法导致测试的数据会让人有些困惑:性能数据到底是不是这样呢,跟云厂商承诺的性能有关系嘛。一般我们都用FIO来进行性能测试,云厂商都推荐用FIO进行性能测试,通过FIO性能测试,都能轻易达到云厂商承诺的性能。
插曲:关于sysbench的版本,现在主要有0.4.12和1.0.版本。截止2006年sysbench好长时间没有发展,2017年之前都是用旧版本0.4.12(所以网上一搜一大堆文章都是0.4.的教程),然后作者估计修了几个bug,变成0.5版本,然后就跟过去做了告别,从2017重新开发了一个新版本sysbench 1.0.*,这里讲述的性能测试都是用了最新版。
1. sysbench fileio测试
言归正传,sysbench怎么做IO的性能测试呢,sysbench fileio help
,参数如下:
#/usr/local/sysbench_1/bin/sysbench fileio help
sysbench 1.0.9 (using bundled LuaJIT 2.1.0-beta2)
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]
sysbench的性能测试都需要做prepare
,run
,cleanup
这三步,准备数据,跑测试,删除数据。那下面就开始实战:
客户用2C4G的vm,挂载120G的SSD云盘做了性能测试,测试命令如下:
cd /mnt/vdb #一定要到你测试的磁盘目录下执行,否则可能测试系统盘了
sysbench fileio --file-total-size=15G --file-test-mode=rndrw --time=300 --max-requests=0 prepare
sysbench fileio --file-total-size=15G --file-test-mode=rndrw --time=300 --max-requests=0 run
sysbench fileio --file-total-size=15G --file-test-mode=rndrw --time=300 --max-requests=0 cleanup
结果如下:
File operations:
reads/s: 2183.76
writes/s: 1455.84
fsyncs/s: 4658.67
Throughput:
read, MiB/s: 34.12
written, MiB/s: 22.75
General statistics:
total time: 300.0030s
total number of events: 2489528
Latency (ms):
min: 0.00
avg: 0.12
max: 204.04
95th percentile: 0.35
sum: 298857.30
Threads fairness:
events (avg/stddev): 2489528.0000/0.00
execution time (avg/stddev): 298.8573/0.00
随机读写性能好像不咋地,换算IOPS为(34.12+22.75)*1024/16.384=3554.375,与宣称的5400IOPS有很大差距。眼尖的人肯定发现只有2个核,去遍历128个文件,好像会降低效率,于是定制file-num去做了系列测试,测试结果如下:
file-num | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
---|---|---|---|---|---|---|---|---|
read(MB/s) | 57.51 | 57.3 | 57.36 | 57.33 | 55.12 | 47.72 | 41.11 | 34.12 |
write(MB/s) | 38.34 | 38.2 | 38.24 | 38.22 | 36.75 | 31.81 | 27.4 | 22.75 |
明显可以看到,默认测试方法会导致性能下降,文件数设置为1达到最大性能。
那file-num=128与file-num=1的区别是测试文件从128个变成1个,但是总文件大小都是15G,都是随机读写,按理性能应该是一致的,区别是会在多个文件之间切换读写,那么可能会导致中断增加和上下文切换开销增大。通过vmstat命令得到了验证:
file-num=128的vmstat输出是这样的:
file-num=1的vmstat输出是这样的:
从上面两个图可以看出file-num=1的时候上下文切换只有8500左右比file-num=128的时候24800小多了,in(中断)也少太多了。减少了中断和上下文切换开销,吞吐能力显著提升了。
再做了一个实验,同样磁盘大小,改成挂载到8C的vm下,改成8线程进行测试,得到如下数据:
file-num | 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
---|---|---|---|---|---|---|---|---|
read(MB/s) | 253.08 | 209.86 | 193.38 | 159.73 | 117.98 | 86.78 | 67.39 | 51.98 |
write(MB/s) | 168.72 | 139.9 | 128.92 | 106.49 | 78.66 | 57.85 | 44.93 | 34.65 |
可以得出同样的结论,file-num=1可以得到最好的性能,理由如上。
2. 与fio测试的比较
单进程下,file-num=1换算到IOPS为(57.51+38.34)*1024/16.384=5990.625,这好像超过我们的IOPS设置限定了。通过fio是怎么测得这个IOPS的呢:
fio -direct=1 -iodepth=128 -rw=randrw -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=iotest -name=randrw_test
通过阅读源代码,发现很多不同:
- 一个是通过libaio,一个是通过pwrite/pread。libaio的性能是非常强劲的,详情可以参考文章。
即使ioengine=psync,这个engine的读写方法是pread和pwrite,但是整个实现也是不一致的。 - fio测试的时候direct=1,就是每次都写入磁盘,而sysbench默认file-fsync-freq=100,也就是完成100次操作才会有一个fsync操作,这种操作涉及系统缓存。
3. 深入一步
上节认为操作系统干扰以及io读写方式的差异,造成了测试数据的不一致。深入去研究了下源代码,其实sysbench的作者是提倡用libaio,代码里面大量地运用了宏定义,如:
/* 异步写的截取代码 */
#ifdef HAVE_LIBAIO
else if (file_io_mode == FILE_IO_MODE_ASYNC)
{
/* Use asynchronous write */
io_prep_pwrite(&iocb, fd, buf, count, offset);
if (file_submit_or_wait(&iocb, FILE_OP_TYPE_WRITE, count, thread_id))
return 0;
return count;
}
#endif
那怎么启用这个宏呢,默认就是启用这个宏的。
启用这个宏后,执行sysbench fileio help
,会发现有这一项:--file-async-backlog=N number of asynchronous operatons to queue per thread [128]
,说明HAVE_LIBAIO
这个宏确实生效了。
既然sysbench默认有libaio后,那整个测试方法需要调整:
# --file-extra-flags=direct 文件读写模式改成direct
# --file-io-mode=async 确保libaio起效
# --file-fsync-freq=0 不需要执行fsync
sysbench fileio --file-total-size=15G --file-test-mode=rndrw --time=300 --max-requests=0 --file-io-mode=async --file-extra-flags=direct --file-num=1 --file-rw-ratio=1 --file-fsync-freq=0 run
得到测试结果如下:
对于FIO命令也进行了调整,把bs调整成16k,其他不变,还是达到上限5400。测试结果如下:
可以看到sysbench测试的效果与fio的测试效果完全一致!
不过个人还是推荐FIO来做IO的性能测试。
原文链接
本文为云栖社区原创内容,未经允许不得转载。
如何用sysbench做好IO性能测试的更多相关文章
- Oracle IO性能测试
Oracle IO性能测试 前言 最近发生了迁移测试库后(单节点迁移RAC)因为IO性能问题导致迁移后性能非常差的问题. 原本想在创建ASM磁盘组之前用Orion做测试,但是忘了做就没做结果出了这档子 ...
- sysbench——服务器cpu性能测试
一.前言 最近在工作中需要测试cpu占用率.内存占用率,我想要寻找一种合适的能提高cpu占用率的工具及方法.先尝试了使用 echo "scale=5000; 4*a(1)" | b ...
- sysbench安装及性能测试
现在的压力测试工具各种各样,只要上手好几款功能强大点的而且比较大众化的压力测试工具即可,以下跟大家交流下sysbench的安装和压力测试 sysbench支持以下几种测试模式: 1.CPU运算性能 2 ...
- (转)Linux 磁盘IO性能测试
Linux 如何测试 IO 性能(磁盘读写速度) 这几天做MySQL性能测试,偌大一个公司,找几台性能测试机器都很纠结,终于协调到两台,IO的性能如何还不知道.数据库属于IO密集型的应用,所以还是先评 ...
- 如何用JAVA的IO流下载落网音乐?
一直以来都特别喜欢落网的音乐,最近用JAVA写了一个小程序,可以根据期刊和歌曲编号去下载音乐.本程序仅供学习使用. 目前只写了一个初步的代码: public class DownloadMusic { ...
- 如何用jmeter进行数据库性能测试
由于业务需要,需要进行数据库性能测试,记录过程进行学习 测试前期准备: 1.测试点准备及需求点 a.性能测试目的 b.jmeter测试数据库基本脚本 get c.数据库性能监控工具选择 d.服务器性 ...
- Fio IO性能测试
fio-2.1.2-1.el5.rf.x86_64 介绍 fio different types of I/O engines (sync, mmap, libaio, posixaio, SG v3 ...
- linux sysbench (一): CPU性能测试详解
网上sysbench教材众多,但没有一篇中文教材对cpu测试参数和结果进行详解. 本文旨在能够让读者对sysbench的cpu有一定了解. 小慢哥的原创文章,欢迎转载 1.sysbench基础知识 s ...
- fio 文件系统io 性能测试安装使用
备注: 使用的是yum 进行的安装,大家可以使用源码编译安装(centos 7) 安装 yum install -y fio 命令行参数 fio-2.2.8 fio [options] [job op ...
随机推荐
- 基于.net的Socket异步编程总结
最近在为公司的分布式服务框架做支持异步调用的开发,这种新特性的上线需要进行各种严格的测试.在并发性能测试时,性能一直非常差,而且非常的不稳定.经过不断的分析调优,发现Socket通信和多线程异步回调存 ...
- UI框架
一,框架构成:目录分别有bin,lib,page,report,test_case,(百度网盘) 1.bin>run.py 2.lib>HTMLTestRunner.py lib>l ...
- XP Sp3 开机就要激活,否则无法登录windows桌面
参考网页:https://www.reddit.com/r/sysadmin/comments/5m9240/activating_windows_xp_in_2017_still_possible/ ...
- Reveal : Xcode辅助界面调试工具
Reveal简介: Reveal是一款iOS界面调试工具,辅助Xcode进行界面调试,使用它可以在iOS开发的时候动态的查看和修改应用程序的界面. 软件下载 首先去官网下载Reveal,下载地址:ht ...
- 数位DP -启示录
http://poj.org/problem?id=3208 一个魔鬼数为包含连续三个666的的数字,给个n(n<5e7)求第n个魔鬼数. 预处理f[i][j],f[i][3]表示由前i位数字构 ...
- Java内存模型锦集
[内存操作与内存屏障] 内存模型操作: lock(锁定) : 作用与主内存的变量, 它把一个变量标识为一条线程独占的状态 unlock(解锁) : 作用于主内存变量, 它把一个处于锁定状态的变量释放出 ...
- python从入门到实践-7章用户输入和while循环
#!/user/bin/env python# -*- coding:utf-8 -*- # input() 可以让程序暂停工作# int(input('please input something: ...
- 安卓开发学习笔记(四):Android Stuidio无法实现隐式Intent是为什么?
一.首先检查我们的代码: FirstActivity.java(主活动程序当中的代码):Button3监听器后面的代码就是我们隐式Intent的业务逻辑所在了,大家可以往下面看看,大概在代码的第57行 ...
- 【安富莱二代示波器教程】第6章 示波器设计—双通道ADC驱动
第6章 示波器设计—双通道ADC驱动 本章节为大家讲解示波器的ADC驱动,采用STM32自带ADC实现.关于STM32F429的ADC,可以说处处有地雷,不小心就踩上了,如果简单的使用, ...
- 【转载】CSS3 文字溶解效果
代码如下: <!DOCTYPE html> <html > <head> <meta charset="UTF-8"> <ti ...