问题背景

iostat -xdm 1 通常用来查看机器磁盘IO的性能。

我们一般会有个经验值,比如,ioutil要小于80%, svctm要小于2ms。

前几天碰到一个奇怪的现象:有一台SSD机器,磁盘的iops在1万多,吞吐量在100多M,看来压力并不大,但是ioutil一直在90%以上。SSD的磁盘怎么会只能承受这么点压力?

下面是当时tsar的数据:

针对这个问题的结论

  • ioutil是繁忙度的一个度量(非空闲时间)。对于后面有多块磁盘支撑的虚拟设备意义不大。所以对于SSD,并不能说ioutil到了100%了,磁盘就到达最大极限性能了。
官方文档的描述
Percentage of elapsed time during which I/O requests were issued to the device (bandwidth utilization for the device).
Device saturation occurs when this value is close to 100% for devices serving requests serially.
But for devices serving requests in parallel, such as RAID arrays and modern SSDs,
this number does not reflect their performance limits.
  • await是平均IO响应时间,包括在驱动请求队列里的等待和设备的IO响应时间(ms)。

  • svctm是一个推断值。计算方法: svctm = ioutil/IOPS = ioutil/(rs+ws)

比如,在1s内,60%的使用率,有300的IOPS,那么平均服务时间svctm = 600ms/300 = 2ms

在未来某个版本的iostat会被删除,官方文档是这样描述原因的。

官方文档的描述
The average service time (svctm field) value is meaningless,
as I/O statistics are calculated at block level,
and we don’t know when the disk driver starts to process a request.
For this reason, this field will be removed in a future sysstat version.

Linux内核IO协议栈结构

Linux整体IO体系可以分为七层,它们分别是:

  • VFS层:虚拟文件系统层。由于内核要跟多种文件系统打交道,而每一种文件系统所实现的数据结构和相关方法都可能不尽相同,所以,内核抽象了这一层,专门用来适配各种文件系统,并对外提供统一操作接口。

  • 文件系统层:不同的文件系统实现自己的操作过程,提供自己特有的特征。

  • 页缓存层:负责针对page的缓存。

  • 通用块层:由于绝大多数情况的io操作是跟块设备打交道,所以Linux在此提供了一个类似vfs层的块设备操作抽象层。下层对接各种不同属性的块设备,对上提供统一的Block IO请求标准。

  • IO调度层:因为绝大多数的块设备都是类似磁盘这样的设备,所以有必要根据这类设备的特点以及应用的不同特点来设置一些不同的调度算法和队列。以便在不同的应用环境下有针对性的提高磁盘的读写效率,这里就是大名鼎鼎的Linux电梯所起作用的地方。针对机械硬盘的各种调度方法就是在这实现的。

  • 块设备驱动层:驱动层对外提供相对比较高级的设备操作接口,往往是C语言的,而下层对接设备本身的操作方法和规范。

  • 块设备层:这层就是具体的物理设备了,定义了各种真对设备操作方法和规范。

简图

还有一张更详细的图,图上已有出处:

iostat是怎么计算的?

  • /proc/diskstats 内核进行了多少IO,IO的耗时统计,都是会记录在/proc/diskstats。
$cat /proc/diskstats | grep -w sdb
8 16 sdb 5599308471 607 262844839314 1688433460 18293450260 0 402591421472 167371198 4 3337033295 1847117638

格式:

前3列定位一个设备。这个文件是每毫秒更新一次。

  • /sys/block/${device_name}/stat

这个文件记录的内容实际上和/proc/diskstats 完全一样的,只不过,这个文件只针对某个设备,或是分区,因此,只有一行内容,也比/proc/diskstats 少前3列,不用单独定位一个设备。

$cat /sys/block/sdb/stat
5599363483 607 262845774770 1688449447 18294010908 0 402598669112 167535796 0 3337131224 1847298025

f1: read_IOs, 读次数

f2: read_merges, 合并读次数。比如,两个地址连续的IO,真正下发到设备,会合并成一个IO

f3: read_sectors, 读扇区的次数

f4: read_ticks, 读花费的毫秒数

f5: write_IOs, 写次数

f6: write_merges, 合并写次数

f7: write_sectors, 写扇区次数

f8: write_ticks, 写操作花费的毫秒数

f9: in_flight, 正在处理的IO请求数,The number of I/Os currently in flight. It does not include I/O requests that are in the queue but not yet issued to the device driver.

f10: io_ticks, IO操作花费的毫秒数,每次队列中有IO,就增加。This value counts the time during which the device has had I/O requests queued.

f11: time_in_queue, The number of I/Os in progress (field 9) times the number of milliseconds spent doing I/O since the last update of this field.

iostat的深入理解的更多相关文章

  1. 深入理解iostat

    前言 iostat算是比较重要的查看块设备运行状态的工具,相信大多数使用Linux的同学都用过这个工具,或者听说过这个工具.但是对于这个工具,引起的误解也是最多的,大多数人对这个工具处于朦朦胧胧的状态 ...

  2. 理解 IO_WAIT 并且了解利用包括 top htop iotop iostat 工具来查看 IO 性能

    今天继续拜读「深入浅出计算机组成原理」专栏,觉得讲 IO_WAIT 这篇很有意思,正好可以结合前面的一篇讲物理硬件存速度的一块儿看. 现在我们看硬盘厂商出品的性能报告,通常会看到两个指标,一个是响应时 ...

  3. [转载]深入理解iostat

    深入理解iostat 前言 iostat算是比较重要的查看块设备运行状态的工具,相信大多数使用Linux的同学都用过这个工具,或者听说过这个工具.但是对于这个工具,引起的误解也是最多的,大多数人对这个 ...

  4. iostat命令学习

    iostat命令主要用于监控linux系统下cup和磁盘IO的统计信息 可以通过iostat --help获得该命令的帮助信息 [oracle@std ~]$ iostat --help Usage: ...

  5. linux命令分享(四):iostat

    简介 iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间 ...

  6. Linux的IO性能监控工具iostat详解

    Linux系统出现了性能问题,一般我们可以通过top.iostat.free.vmstat等命令来查看初步定位问题.其中iostat可以提供更丰富的IO性能状态数据. . 基本使用 $iostat - ...

  7. Linux iostat字段解析

    iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间来获得 ...

  8. 【转】Linux IO实时监控iostat命令详解

    转自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858810.html 简介 iostat主要用于监控系统设备的IO负载情况,iosta ...

  9. iostat监控磁盘io

    1.安装#yum install sysstat 2.启动#/etc/init.d/sysstat start 3.自启动#checkfig sysstat 4.基本使用#iostat -k 2每两秒 ...

随机推荐

  1. Junit单元测试学习笔记三

    一.     高级 Fixture 上一篇文章中我们介绍了两个 Fixture 标注,分别是 @Before 和 @After ,我们来看看他们是否适合完成如下功能:有一个类是负责对大文件(超过 50 ...

  2. @RequestBody 的正确使用办法

    1.以前一直以为在SpringMVC环境中,@RequestBody接收的是一个Json对象,一直在调试代码都没有成功,后来发现,其实 @RequestBody接收的是一个Json对象的字符串,而不是 ...

  3. 物联网操作系统Hello China V1.76(PC串口版)版本发布

    作为向ARM平台移植的基线版本,经过三个多月的努力,Hello China V1.76终于完成并发布.相对原来发布的V1.75版本,该版本主要做了如下修改: 彻底去掉了原来版本源代码中的C++特性,采 ...

  4. C++不能显式调用构造函数,会生成匿名对象,这点与Java完全不一样!

    Java可以直接调用同名构造函数,仅仅起初始化的功能,并不构造新的对象,但是C++里面没有.看一下这段代码: class A { public: A() { printf("A() \n&q ...

  5. BASM遵循的规则

    任何情况下,在寄存器的使用上,BASM遵循如下的规则: ASM 语句执行过程中,必须保存EDI.ESI.ESP.EBP.EBX 的值(5个寄存器,意思是可以用,但最后得恢复成原模原样). ASM ...

  6. Jenkins的配置

    原文:http://www.cnblogs.com/itech/archive/2011/11/04/2236230.html 1  修改jenkins的根目录,默认地在C:\Documents an ...

  7. Linear Regression

    大学时候学物理实验的时候接触过线性回归,现在忘记了...还得重新拾起来.学习不扎实耽误了多少时光... sigh Suppose that you time a program as a functi ...

  8. BackgroundWorker组件学习

    今天看到别人的博客中提到了BackgroundWorker组件.在现在的系统中有见到过这个组件,由于实际应用的系统中逻辑比较复杂所以也没深入去看.今天凑巧看到了一个关于BackgroundWorker ...

  9. Lua的元表(metatable)

    metatable允许我们改变table的行为 > Lua中的每一个表都可以有metatable(后面我们将看到userdata也有Metatable) > Lua默认创建一个不带meta ...

  10. 【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

    原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例   部分代码参考http ...