iostat的深入理解
问题背景
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的深入理解的更多相关文章
- 深入理解iostat
前言 iostat算是比较重要的查看块设备运行状态的工具,相信大多数使用Linux的同学都用过这个工具,或者听说过这个工具.但是对于这个工具,引起的误解也是最多的,大多数人对这个工具处于朦朦胧胧的状态 ...
- 理解 IO_WAIT 并且了解利用包括 top htop iotop iostat 工具来查看 IO 性能
今天继续拜读「深入浅出计算机组成原理」专栏,觉得讲 IO_WAIT 这篇很有意思,正好可以结合前面的一篇讲物理硬件存速度的一块儿看. 现在我们看硬盘厂商出品的性能报告,通常会看到两个指标,一个是响应时 ...
- [转载]深入理解iostat
深入理解iostat 前言 iostat算是比较重要的查看块设备运行状态的工具,相信大多数使用Linux的同学都用过这个工具,或者听说过这个工具.但是对于这个工具,引起的误解也是最多的,大多数人对这个 ...
- iostat命令学习
iostat命令主要用于监控linux系统下cup和磁盘IO的统计信息 可以通过iostat --help获得该命令的帮助信息 [oracle@std ~]$ iostat --help Usage: ...
- linux命令分享(四):iostat
简介 iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间 ...
- Linux的IO性能监控工具iostat详解
Linux系统出现了性能问题,一般我们可以通过top.iostat.free.vmstat等命令来查看初步定位问题.其中iostat可以提供更丰富的IO性能状态数据. . 基本使用 $iostat - ...
- Linux iostat字段解析
iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息.用户可以通过指定统计的次数和时间来获得 ...
- 【转】Linux IO实时监控iostat命令详解
转自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858810.html 简介 iostat主要用于监控系统设备的IO负载情况,iosta ...
- iostat监控磁盘io
1.安装#yum install sysstat 2.启动#/etc/init.d/sysstat start 3.自启动#checkfig sysstat 4.基本使用#iostat -k 2每两秒 ...
随机推荐
- EL表达式取整数或者取固定小数位数的简单实现
EL表达式取整数或者取固定小数位数的简单实现 例如${8/7} ,${6/7} ,${12/7 } 在页面的显示结果分别为: 1.1428571428571428 0.8571428571428571 ...
- javaScript解决Form的嵌套
HTML是不允许FORM嵌套的,用一个简单的JAVASCRIPT就可以解决问题了 <script language=javascript> function process(v){ if( ...
- Linux文件查找命令find,xargs详述
目录: 一.find 命令格式 1.find命令的一般形式为: 2.find命令的参数: 3.find命令选项: 4.使用exec或ok来执行shell命令: 二.find命令的例子: 1.查找当前用 ...
- iOS 全屏布局
edgesForExtendedLayout属性用于替代wantsFullScreenLayout,控制页面显示的范围,默认值是UIRectEdgeAll automaticallyAdjustsSc ...
- iOS xcode设置
Xcode build search paths c/c++ 头文件引用问题include <> 引用编译器的类库路径下的头文件include “” 引用工程目录的相对路径的头文件 inc ...
- 配置Linux系统网卡连接网络
本实验需要两台虚拟机来完成,环境如下: 主机名称 操作系统 ip地址 本地主机 RHEL7_64 192.168.157.134 -> 192.168.129.127 远程主机 CentOS 6 ...
- android 使用静态变量传递数据
使用静态变量传递数据之通用方式. 测试应用:当前页面点击button传递数据到一个新的页面显示在textview中. 首先在,mainActivity.xml文件中加入一个button按钮 <B ...
- Html 全屏切换效果
来源 http://www.imooc.com/learn/374 pageswitch.js (function ($) { var defaults = { 'container': '#cont ...
- hdu4185解题报告
这里我居然能自己想想到怎么建图匹配,很是不容易... 题意:这里有一片油田,但是不是纯净的,有的地方是水,现在有一个捞石油的机器,但是这个机器捞的范围是固定的,是2*1的一个矩形大小,那么对于整个油田 ...
- js调用高德API获取所在当前城市
可以在js代码中直接调用API接口,获取所处当前城市信息,代码如下: <script type="text/javascript"> function getCurre ...