翻译原文来源

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,为每个盘产生测试数据。

# a 5 minute disk thrashing benchmark
# generates equal amounts of random read and write IO on every drive
# will generate metrics for each drive
[global]
ioengine=libaio
direct=1
unified_rw_reporting=1
rw=randrw
time_based=1
runtime=300s<strong># Seagate 7200RPM SAS 512G ST9500430SS (sdb)</strong>
[/dev/disk/by-path/pci-0000:03:00.0-sas-0x5000c5000d7f96d9-lun-0]
write_lat_log=7200RPMSAS-0x5000c5000d7f96d9<strong># Seagate 7200RPM Enterprise SATA 1TB ST31000340NS (sdg)</strong>
[/dev/disk/by-id/wwn-0x5000c500151229dd]
write_lat_log=7200RPMEnterpriseSATA-0x5000c500151229dd<strong># Samsung 840 Pro 128GB (on a 3G SATA port) (sdd)</strong>
[/dev/disk/by-id/ata-Samsung_SSD_840_PRO_Series_S1ANNSADB05219A]
write_lat_log=SSDSATA-S1ANNSADB05219A# 2x SAS drives with GPT partition & MDRAID0 (sdi1 + sdc1)
<strong># Seagate 7200RPM SAS 512G ST9500430SS</strong>
[/dev/disk/by-id/md-uuid-6bb71ed6:e4410fc9:b27af0b7:0afe758d]
write_lat_log=7200RPMSAS-MDRAID0

raw output

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

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

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

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做处理?”。

slat (usec): min=3, max=335, avg= 9.73, stdev= 5.76

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

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

 slat (usec): min=3, max=335, avg= 9.73, stdev= 5.76 (SATA SSD)slat (usec): min=5, max=68,  avg=26.21, stdev= 5.97 (SAS 7200)slat (usec): min=5, max=63,  avg=25.86, stdev= 6.12 (SATA 7200)slat (usec): min=3, max=269, avg= 9.78, stdev= 2.85 (SATA SSD)slat (usec): min=6, max=66,  avg=27.74, stdev= 6.12 (MDRAID0/SAS)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完成,这个算法最好地表现出了应用程序的行为。

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

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

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

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

Seagate 7200RPM SAS 512G ST9500430SS

clat percentiles (usec):|  1.00th=[ 3952],  5.00th=[ 5792], 10.00th=[ 7200], 20.00th=[ 8896],| 30.00th=[10304], 40.00th=[11456], 50.00th=[12608], 60.00th=[13760],| 70.00th=[15168], 80.00th=[16768], 90.00th=[18816], 95.00th=[20608],| 99.00th=[23424], 99.50th=[24192], 99.90th=[26752], 99.95th=[28032],| 99.99th=[30080]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%。

    bw (KB  /s): min=   71, max=  251, per=0.36%, avg=154.84, stdev=18.29lat (usec) :   2= 0.01%,   4=0.01%,  10=0.01%,   20=0.01%, 50=51.41%lat (usec) : 100=48.53%, 250=0.06%, 500=0.01%, 1000=0.01%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微秒),以此类推。

lat (msec) : 4=1.07%, 10=27.04%, 20=65.43%, 50=6.46%, 100=0.01%

如果想用快速脚本解析这些繁琐的数据,你可能需要知道,最后一部分会省略那些没有数据的项。例如,我使用的SAS盘没有IO可以在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数量应该极少。

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。

     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%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才需要关注这一部分数据。

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

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或可能是设备的尾端。

latency   : target=0, window=0, percentile=100.00%, depth=1

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

Run status group 0 (all jobs):

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

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,我会发布更多关于配置,输出和图表代码的例子。

Fio 输出内容的解释相关推荐

  1. gprof 输出内容解释

    gprof输出内容示例 Each sample counts as 0.01 seconds .% cumulative self self total time seconds seconds ca ...

  2. gprof输出内容解释

    gprof输出内容示例 Each sample counts as 0.01 seconds.   %   cumulative   self              self     total  ...

  3. MFC匿名管道原理详解、函数总结、调用实例(用MFC的匿名管道读取CMD输出内容)(C++语言)

    本博客主要总结MFC中匿名管道的原理和具体调用实例,以及调用匿名管道三个核心函数各个参数用法详解,具体的如下所述. 博主在做项目时,遇到一个问题.用程序调用一个进程,然后读取进程输出信息.但是,博主用 ...

  4. linux将屏幕输出到文件,Linux命令执行的屏幕输出内容重定向到日志文件

    摘要: 作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 快速mark一下这个命令细节,免得以后使用又忘记了 大家都知道可以用echo来输出内容到 ...

  5. JavaScript知识笔记(一)——入门、语句、注释、变量、函数、输出内容、对话框、窗口

    JavaScript可以提供漂亮的网页.令用户满意的上网体验. 1.增强页面动态效果(如:下拉菜单.图片轮播.信息滚动等) 2.实现页面与用户之间的实时.动态交互(如:用户注册.登陆验证等) 引用Ja ...

  6. 使用feof()判断文件结束时会多输出内容的原因

    这是原来的代码: #include <stdio.h> int main() {     FILE * fp;     int ch;     fp = fopen("d:\\a ...

  7. HAproxy增加日志记录功能和自定义日志输出内容、格式

    http://blog.51cto.com/eric1/1854574 一.增加haproxy日志记录功能   1.1 由于数据分析的需要,我们必须打开haproxy日志,记录相关信息. 在配置前,我 ...

  8. securecrt导出linux日志文件,secureCRT保存屏幕输出内容

    1.有时执行一个mysql语句,屏幕打印行过多,需要设置翻动最大行数 打开Options Session Options–>Terminal–>Emulation,在Scrollback输 ...

  9. php 读取文件自身内容,与读取文件输出内容

    一,读取文件 先解释一下,什么是读取文件本身,什么叫读取文件输入内容.举个例子test.php里面的内容<?php echo "test"; ?> 1,读取文件本身就是 ...

  10. [转]netstat输出内容详解

    netstat 输出内容详解 1.列出所有 tcp与udp 端口 netstat  -anput Active Internet connections (servers and establishe ...

最新文章

  1. 不是我散漫了,是病了——书于平安夜
  2. 时间周期 java_周期和持续时间 / Period and Duration
  3. 学长的求职经验 记录【就业创业信息网、求职流程、求职小细节】
  4. 查看/修改Linux时区和时间
  5. C语言_选择结构的程序设计
  6. 积分matlab实现
  7. 51单片机项目教程c语言版,51单片机项目教程(C语言版)
  8. vue生产环境使用localhost请求端口号不是自己设置的?来试试这个
  9. 前端测试之用户体验测试
  10. Flash游戏开发技术分析(上)
  11. 黑苹果虚拟机安装教程
  12. 2018 抖音热门歌曲大全
  13. 人工智能:爬山法、随机重启爬山法、模拟退火算法、遗传算法、启发式搜索方法解决八数码和八皇后问题
  14. linux主进程退出时,结束子进程
  15. Linux下一种 ELF 文件的代码签名验证机制
  16. 触摸传递 Touch Delivery
  17. 长尾效应解析以及长尾效应在电商中的应用
  18. 职能与职位的区别_使安全职能与战略,目标和使命保持一致
  19. 校验和(Checksum)算法-概述
  20. Mysql中按某一字段去重,并查询去重后的所有字段

热门文章

  1. C语言笔记——0814排序算法
  2. RealSR真实场景超分
  3. 【微服务|openfeign】@FeignClient详解
  4. C语言RR调度算法,RR(轮转调度算法)
  5. 百度之星程序设计大赛初题目
  6. 精雕细琢工作流的状态管理
  7. 接口自动化测试之HttpRunner测试框架介绍和快速入门
  8. SK中模型选择模块的使用
  9. 看图说话实战教程 | 第四节 | 模型评估
  10. HarmonyOS应用开发02-程序框架UIAbility、启动模式与路由跳转