1. 啥叫 fio
fio is an I/O tool meant to be used both for benchmark and stress/hardware verification. It has support for 19 different types of I/O engines (sync, mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio, and more), I/O priorities (for newer Linux kernels), rate I/O, forked or threaded jobs, and much more. It can work on block devices as well as files. fio accepts job descriptions in a simple-to-understand text format. Several example job files are included. fio displays all sorts of I/O performance information, including complete IO latencies and percentiles. Fio is in wide use in many places, for both benchmarking, QA, and verification purposes. It supports Linux, FreeBSD, NetBSD, OpenBSD, OS X, OpenSolaris, AIX, HP-UX, Android, and Windows.
FIO是一个开源的I/O压力测试工具,主要是用来测试磁盘的IO性能,也可测试cpu,nic的IO性能。它可以支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, network, syslet, guasi, solarisaio, I/Opriorities (针对新的Linux内核), rate I/O, forked or threaded jobs等。
2. 什么时候需要使用 fio
这不废话么,当你需要了解你的硬件性能,以便指导你软件开发的时候,就用到啦。
举个栗子: MySQL ,我想设置 InnoDB 的 innodb_io_capacity
参数,就需要知道磁盘的 IOPS,这时候你就需要 fio 了。
3. 下载
戳这儿:https://bluestop.org/fio/,根据你自己电脑的位数,选择合适的版本下载。
4. 安装
双击下载好的 fio-3.12-x64.msi
,一路安装即可。
安装结束后,打开终端,输入 fio -version
,若显示版本号,则安装成功。
5. 使用
可以使用fio -help查看每个参数。
filename=/dev/emcpowerb 支持文件系统或者裸设备,-filename=/dev/sda2或-filename=/dev/sdb
direct=1 测试过程绕过机器自带的buffer,使测试结果更真实
rw=randwread 测试随机读的I/O
rw=randwrite 测试随机写的I/O
rw=randrw 测试随机混合写和读的I/O
rw=read 测试顺序读的I/O
rw=write 测试顺序写的I/O
rw=rw 测试顺序混合写和读的I/O
bs=4k 单次io的块文件大小为4k
bsrange=512-2048 同上,提定数据块的大小范围
size=5g 本次的测试文件大小为5g,以每次4k的io进行测试
numjobs=30 本次的测试线程为30
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止
ioengine=psync I/O引擎,现在fio支持19种ioengine。默认值是sync同步阻塞I/O,libaio是Linux的native异步I/O。关于同步异步,阻塞和非阻塞模型可以参考文章“使用异步 I/O 大大提高应用程序的性能”。[http://www.ibm.com/developerworks/cn/linux/l-async/]
iodepth 如果ioengine采用异步方式,该参数表示一批提交保持的io单元数。该参数可参考文章“Fio压测工具和io队列深度理解和误区”。[http://blog.yufeng.info/archives/2104]
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息
此外
lockmem=1g 只使用1g内存进行测试
zero_buffers 用0初始化系统buffer
nrfiles=8 每个进程生成文件的数量
下面的语句是我用来测试磁盘 随机读写 的命令:
fio -filename=E: -direct=1 -iodepth=1 -thread -rw=randrw -ioengine=windowsaio -bs=16k -size=5g -numjobs=10 -runtime=1000 -group_reporting -name=mytest
5.1. 实践-机械硬盘(希捷 ST500LM021-1KJ152 500G 7200转/分)
测试进行了16min(从这里也可以看出机械硬盘的I/O性能确实很差,当然测试时间还受 CPU 性能和内存影响)
可知,机械硬盘的随机 IPOS 为 95,果然很小啊。
5.2. 实践-固态硬盘(三星 SSD 970 EVO 250GB)
由于固态硬盘用作了C盘,所以 -filename 设为 c:。
测试很快完成:
可知,固态硬盘的随机 IPOS 为 12.5k,是机械硬盘的1000倍。(当然我的机械硬盘是公司笔记本上的,性能会比较差。机械硬盘的随机 IOPS 一般是几百。)