热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

fio的使用

FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的IO引擎,包括:sync,mmap,libaio,pos

FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet,guasi, solarisaio 等等。
fio 官网地址:http://freecode.com/projects/fio

 

FIO用法:

随机读:

fio -filename=/dev/sdb1 -direct=1 -iodepth1 -thread -rw=randread -ioengine=psync -bs=16k -size=200G -numjobs=10-runtime=1000 -group_reporting -name=mytest

 

说明:

filename=/dev/sdb1       测试文件名称,通常选择需要测试的盘的data目录。

direct=1                 测试过程绕过机器自带的buffer。使测试结果更真实。

rw=randwrite             测试随机写的I/O

rw=randrw                测试随机写和读的I/O

bs=16k                   单次io的块文件大小为16k

bsrange=512-2048         同上,提定数据块的大小范围

size=5g   本次的测试文件大小为5g,以每次4k的io进行测试。

numjobs=30               本次的测试线程为30.

runtime=1000             测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。

ioengine=psync           io引擎使用pync方式

rwmixwrite=30            在混合读写的模式下,写占30%

group_reporting          关于显示结果的,汇总每个进程的信息。

 

这个工具最大的特点是使用简单,支持的文件操作非常多, 可以覆盖到我们能见到的文件使用方式:
sync:Basic read(2) or write(2) I/O. fseek(2) is used to position the I/O location.
psync:Basic pread(2) or pwrite(2) I/O.
vsync: Basic readv(2) or writev(2) I/O. Will emulate queuing by coalescing adjacents IOs into a single submission.
libaio: Linux native asynchronous I/O.
posixaio: glibc POSIX asynchronous I/O using aio_read(3) and aio_write(3).
mmap: File is memory mapped with mmap(2) and data copied using memcpy(3).
splice: splice(2) is used to transfer the data and vmsplice(2) to transfer data from user-space to the kernel.
syslet-rw: Use the syslet system calls to make regular read/write asynchronous.
sg:SCSI generic sg v3 I/O.
net : Transfer over the network. filename must be set appropriately to `host/port’ regardless of data direction. If receiving,
only the port argument is used.
netsplice: Like net, but uses splice(2) and vmsplice(2) to map data and send/receive.
guasi The GUASI I/O engine is the Generic Userspace Asynchronous Syscall Interface approach to asycnronous I/O.


此外

lockmem=1g               只使用1g内存进行测试。

zero_buffers             用0初始化系统buffer。

nrfiles=8                每个进程生成文件的数量。

 

顺序读:

fio -filename=/dev/sdb1 -direct=1 -iodepth1 -thread -rw=read -ioengine=psync -bs=16k -size=200G -numjobs=30 -runtime=1000-group_reporting -name=mytest

 

随机写:

fio -filename=/dev/sdb1 -direct=1 -iodepth1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=200G -numjobs=30-runtime=1000 -group_reporting -name=mytest

 

顺序写:

fio -filename=/dev/sdb1 -direct=1 -iodepth1 -thread -rw=write -ioengine=psync -bs=16k -size=200G -numjobs=30-runtime=1000 -group_reporting -name=mytest

 

混合随机读写:

fio -filename=/dev/sdb1 -direct=1 -iodepth1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=200G-numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop

Fio 输出内容的解释

翻译原文来源

https://tobert.github.io/post/2014-04-17-fio-output-explained.html


fio,又称为Flexible IO Tester,是Jens Axboe编写的应用程序。Jens是Linux Kernel中block IO subsystem的维护者。fio从多个方面来看类似于更古老的ffsb工具,但他们之间似乎没有任何关系。作为一个强大的工具,fio可以产生足够多的任意类型的负载 (arbitrary load)。作为权衡,fio不容易学习,这就是这篇文章的目的。


  • config
  • raw output

config

以下是一个50/50读写的垃圾处理IO (Trashing IO)负载,对于多个盘进行的读写。

5分钟,磁盘垃圾处理测试,50/50读写在每个盘上产生相同数量的随机读和写IO,为每个盘产生测试数据。

[plain] view plain copy
  1. # a 5 minute disk thrashing benchmark  
  2. # generates equal amounts of random read and write IO on every drive  
  3. # will generate metrics for each drive  
  4. [global]  
  5. ioengine=libaio  
  6. direct=1  
  7. unified_rw_reporting=1  
  8. rw=randrw  
  9. time_based=1  
  10. runtime=300s  
  11.   
  12. # Seagate 7200RPM SAS 512G ST9500430SS (sdb)  
  13. [/dev/disk/by-path/pci-0000:03:00.0-sas-0x5000c5000d7f96d9-lun-0]  
  14. write_lat_log=7200RPMSAS-0x5000c5000d7f96d9  
  15.   
  16. # Seagate 7200RPM Enterprise SATA 1TB ST31000340NS (sdg)  
  17. [/dev/disk/by-id/wwn-0x5000c500151229dd]  
  18. write_lat_log=7200RPMEnterpriseSATA-0x5000c500151229dd  
  19.   
  20. # Samsung 840 Pro 128GB (on a 3G SATA port) (sdd)  
  21. [/dev/disk/by-id/ata-Samsung_SSD_840_PRO_Series_S1ANNSADB05219A]  
  22. write_lat_log=SSDSATA-S1ANNSADB05219A  
  23.   
  24. # 2x SAS drives with GPT partition & MDRAID0 (sdi1 + sdc1)  
  25. # Seagate 7200RPM SAS 512G ST9500430SS  
  26. [/dev/disk/by-id/md-uuid-6bb71ed6:e4410fc9:b27af0b7:0afe758d]  
  27. write_lat_log=7200RPMSAS-MDRAID0  

raw output

以上链接可打开上述fio配置的原始输出。


接下来按照每个部分分析输出内容。这里显示的数据是Samsung 840 Pro SSD,其他盘的数据稍后再深入研究。

对于每一个部分的描述在输出文字下面。


[plain] view plain copy
  1. read : io=10240MB, bw=63317KB/s, iops=15829, runt=165607msec  


第一行很容易读懂。fio做了10GB的IO,速率63.317MB/s,总IOPS 15829 (默认4k block size),运行了2分钟45秒。


你看到的第一个延迟(Latency)数据是slat,或称为submission latency。这个值和他的名字很相像,代表“盘需要多久将IO提交到kernel做处理?”。

[html] view plain copy
  1. slat (usec): min=3max=335avg= 9.73, stdev= 5.76  


我起初认为submission latency对于性能调试没有用,但是下面的数据让我改变了观点。269usec或1/4 ms看起来是噪音(noise),需要关注一下。我还没有做任何调试,所以我猜测改变scheduler以告诉kernel这不是机械硬盘会有效果。

以下是从其他盘上得到的更多例子。

[plain] view plain copy
  1. slat (usec): min=3, max=335, avg= 9.73, stdev= 5.76 (SATA SSD)  
  2. slat (usec): min=5, max=68,  avg=26.21, stdev= 5.97 (SAS 7200)  
  3. slat (usec): min=5, max=63,  avg=25.86, stdev= 6.12 (SATA 7200)  
  4. slat (usec): min=3, max=269, avg= 9.78, stdev= 2.85 (SATA SSD)  
  5. slat (usec): min=6, max=66,  avg=27.74, stdev= 6.12 (MDRAID0/SAS)  
  6.   
  7. clat (usec): min=1, max=18600, avg=51.29, stdev=16.79  

接下来是completion latency。这是命令提交到kernel到IO做完之间的时间,不包括submission latency。在老版本的fio中,这是估计应用级延迟的最好指标。


lat (usec): min=44, max=18627, avg=61.33, stdev=17.91

在我看来,'lat'是一个新的指标,在man或者文档中都没有描述。分析C代码,似乎这个值是从IO结构体创建时刻开始,直到紧接着clat完成,这个算法最好地表现出了应用程序的行为。


[html] view plain copy
  1. clat percentiles (usec):  
  2.      |  1.00th=[   42],  5.00th=[   45], 10.00th=[   45], 20.00th=[   46],  
  3.      | 30.00th=[   47], 40.00th=[   47], 50.00th=[   49], 60.00th=[   51],  
  4.      | 70.00th=[   53], 80.00th=[   56], 90.00th=[   60], 95.00th=[   67],  
  5.      | 99.00th=[   78], 99.50th=[   81], 99.90th=[   94], 99.95th=[  101],  
  6.      | 99.99th=[  112]  

Completion latency百分数的解释一目了然,可能是输出信息中最有用的部分。我看了代码,这不是slat+clat,而是用了单独的结构体记录。

这个列表可以在config文件中配置。在精简输出模式下有20个这样的格式,%f=%d; %f=%d;... 解析这样的输出格式会很有趣。


作为比较,这里列出一个7200RPM SAS硬盘运行完全相同的负载的统一部分数据。

Seagate 7200RPM SAS 512G ST9500430SS

[plain] view plain copy
  1. clat percentiles (usec):  
  2.      |  1.00th=[ 3952],  5.00th=[ 5792], 10.00th=[ 7200], 20.00th=[ 8896],  
  3.      | 30.00th=[10304], 40.00th=[11456], 50.00th=[12608], 60.00th=[13760],  
  4.      | 70.00th=[15168], 80.00th=[16768], 90.00th=[18816], 95.00th=[20608],  
  5.      | 99.00th=[23424], 99.50th=[24192], 99.90th=[26752], 99.95th=[28032],  
  6.      | 99.99th=[30080]  
  7.   
  8.     bw (KB  /s): min=52536, max=75504, per=67.14%, avg=63316.81, stdev=4057.09  

带宽(bandwidth)的意思显而易见,而per=part就不是很好理解。文档上说这个值是指在单个盘上跑多个负载,可以用来看每个进程消耗了多少IO。对于我这样把fio跑在多个盘的情况,这个值意义不大。但由于SSD和机械硬盘混合使用,这个值挺有趣。

下面是另一个SAS硬盘,占测试的所有4个盘总IO的0.36%。

[plain] view plain copy
  1. bw (KB  /s): min=   71, max=  251, per=0.36%, avg=154.84, stdev=18.29  
  2.   
  3. lat (usec) :   2= 0.01%,   4=0.01%,  10=0.01%,   20=0.01%, 50=51.41%  
  4. lat (usec) : 100=48.53%, 250=0.06%, 500=0.01%, 1000=0.01%  
  5. lat (msec) :   2= 0.01%,   4=0.01%,  10=0.01%,   20=0.01%  




latency分布部分我看了几遍才理解。这是一组数据。与三行使用一样的单位不同,第三行使用了毫秒(ms),使得文本宽度可控。把第三行读成2000, 4000, 10000, 20000微秒(us)就更清晰了。

这组数据表示latency的分布,说明了51.41%的request延迟小于50微秒,48.53%的延迟小于100微秒(但是大于50微秒),以此类推。


[plain] view plain copy
  1. lat (msec) : 4=1.07%, 10=27.04%, 20=65.43%, 50=6.46%, 100=0.01%  


如果想用快速脚本解析这些繁琐的数据,你可能需要知道,最后一部分会省略那些没有数据的项。例如,我使用的SAS盘没有IO可以在1毫秒中完成,所以只有一行。


[plain] view plain copy
  1. cpu          : usr=5.32%, sys=21.95%, ctx=2829095, majf=0, minf=21  


这是用户/系统CPU占用率,进程上下文切换(context switch)次数,主要和次要(major and minor)页面错误数量(page faults)。由于测试是配置成使用直接IO,page faults数量应该极少。


[plain] view plain copy
  1. IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%  


Fio有一个iodepth设置,用来控制同一时刻发送给OS多少个IO。这完全是纯应用层面的行为,和盘的IO queue不是一回事。这里iodepth设成1,所以IO depth在全部时间都是1。


[plain] view plain copy
  1. submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%  
  2. complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%  

submit和complete代表同一时间段内fio发送上去和已完成的IO数量。对于产生这个输出的垃圾回收测试用例来说,iodepth是默认值1,所以100%的IO在同一时刻发送1次,放在1-4栏位里。通常来说,只有iodepth大于1才需要关注这一部分数据。

我会找时间测试多种调度策略,这些数据会变得更有趣。


[plain] view plain copy
  1. issued    : total=r=2621440/w=0/d=0, short=r=0/w=0/d=0  


发送的IO数量。这里出现了奇怪的现象,因为这是50/50的读写负载,照道理应该有相同数量的write。我猜测把unified_rw_reporting打开是的fio把所有的IO都认为是read。

如果你在直接IO测试是看到了IO值很低,那么可能是出问题了。我在Linux kernel中找到参考说这种现象发生在文件末尾EOL或可能是设备的尾端。


[plain] view plain copy
  1. latency   : target=0, window=0, percentile=100.00%, depth=1  


Fio可以配置一个延迟目标值,这个值可以调节吞吐量直到达到预设的延迟目标。我还没有太多深入了解这部分。在基于时间或和容量的测试中,这行通常看起来一样。四个值分别代表预设的latency_target, latency_window, latency_percentile和iodepth。




[plain] view plain copy
  1. Run status group 0 (all jobs):  


Fio支持把不同的测试聚合。例如,我可以用一个配置文件混合包含SSD和HDD,但是设置分组(group)把IO单独汇总。我现在还没涉及这个功能,但未来会用到。




[plain] view plain copy
  1. MIXED: io=12497MB, aggrb=42653KB/s, minb=277KB/s, maxb=41711KB/s, mint=300000msec, maxt=300012msec  




最后,汇总输出吞吐量和时间。io=表示总共完成的IO数量。在基于时间的测试中这是一个变量,在基于容量的测试中,这个值能匹配size参数。aggrb是所有进程/设备的汇总带宽。minb/maxb表示测量到的最小/最大带宽。mint/maxt表示测试的最短和最长耗时。和io=参数类似,时间值对于基于时间的测试应该能匹配runtime参数,对于基于容量的测试是一个变量。


由于我设置了unified_rw_reporting参数运行测试,所以只看到MIXED一行。如果禁用这个参数,对于读和写会有单独的行。

够简单吧?我未来的几周会花更多的时间研究fio,我会发布更多关于配置,输出和图表代码的例子。


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 寻求更强大的身份和访问管理(IAM)平台的企业正在转向云,并接受身份即服务(IDaaS)的灵活性。要为IAM选择正确的场外解决方案,业务管理人员和IT专业人员必须在实施之前评估安全 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
  • C++ STL复习(13)容器适配器
    STL提供了3种容器适配器,分别为stack栈适配器、queue队列适配器以及priority_queue优先权队列适配器。不同场景下,由于不同的序列式 ... [详细]
  • 由于同源策略的限制,满足同源的脚本才可以获取资源。虽然这样有助于保障网络安全,但另一方面也限制了资源的使用。那么如何实现跨域呢,以下是实现跨域的一些方法。 ... [详细]
author-avatar
性感然小猫儿丿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有