http://blog.yufeng.info/archives/751

我们在Linux上总是要保存数据的,数据要么保存在文件系统里(如ext3),要么就在裸设备里面。我们在使用这些数据的时候都是通过文件这个抽象来访问的,操作系统会把我们需要的数据给我们,我们通常无需和块设备打交道。

从下图我们可以很清楚的看到:

我们会发现IO是个层次很深的子系统,有很复杂的数据流动线路。

至于操作系统如何去存储和获取这些数据对我们完全是黑盒子的,这通常不是问题。但是如果我们的IO很密集,我们就需要搞清楚IO具体是如何运作的,免的滥用IO和导致设计问题。

这时候你就需要blktrace这样的工具。

blktrace is a block layer IO tracing mechanism which provides detailed information about request queue operations up to user space.

它的作者Jens Axboe, 是内核IO模块的维护者,目前就职于FusionIO, 是个很nice的家伙,同时他还是著名IO评测工具fio的作者。

相关的文档:
users guide: http://pdfedit.petricek.net/bt/file_download.php?file_id=17&type=bug

HP的人写的指南:http://www.gelato.org/pdf/apr2006/gelato_ICE06apr_blktrace_brunelle_hp.pdf

CU上的小伙子写的: http://linux.chinaunix.net/bbs/viewthread.php?tid=1115851&extra=&ordertype=2

目前blktrace在大部分的Linux发行版都支持的,我们可以轻松的安装使用:

$ sudo yum install blktrace

$ sudo  blktrace /dev/sda5 -o - | blkparse -i -   

  ,                 0.000000000       C   W  +  []
, 0.000040884 A W + <- (,)
, 0.000041214 Q W + [(null)]
, 0.000045947 G W + [(null)]
, 0.000046707 P N [(null)]
, 0.000047073 I W + [(null)]
, 0.000048282 A W + <- (,)
, 0.000048357 Q W + [(null)]
, 0.000049137 M W + [(null)]
, 0.000050167 A W + <- (,)
, 0.000050241 Q W + [(null)]
, 0.000050417 M W + [(null)]
, 0.000050984 A W + <- (,)
, 0.000051047 Q W + [(null)]
, 0.000051258 M W + [(null)]
, 0.000051829 U N [(null)]
, 0.000052699 D W + [(null)]
, 0.000108292 C W + []
, 0.000127791 A W + <- (,)
, 0.000128001 Q W + [(null)]
, 0.000128874 G W + [(null)]
, 0.000129373 P N [(null)]
, 0.000129706 I W + [(null)]
, 0.000130551 U N [(null)]
, 0.000131330 D W + [(null)]
, 0.000172705 C W + []
, 1266874889.709337223 A W + <- (,)
, 1266874889.709338011 Q W + [kjournald]
, 1266874889.709343974 G W + [kjournald]
, 1266874889.709346653 P N [kjournald]
, 1266874889.709347728 I W + [kjournald]
, 1266874889.709350795 U N [kjournald]
, 1266874889.709355396 D W + [kjournald]
, 0.504685570 A W + <- (,)
, 0.504686212 Q W + [kjournald]
, 0.504690614 G W + [kjournald]
, 0.504691826 P N [kjournald]
, 0.504692896 I W + [kjournald]
, 0.504694268 A W + <- (,)
, 0.504694448 Q W + [kjournald]
, 0.504695115 M W + [kjournald]
, 0.504696227 A W + <- (,)
, 0.504696357 Q W + [kjournald]
, 0.504696615 M W + [kjournald]
, 0.504697422 A W + <- (,)
, 0.504697565 Q W + [kjournald]
, 0.504697787 M W + [kjournald]
, 0.504698549 A W + <- (,)
, 0.504698677 Q W + [kjournald]
, 0.504698939 M W + [kjournald]
, 0.504699954 U N [kjournald]
, 0.504704050 D W + [kjournald]
, 0.504810390 C W + []
, 0.504842324 A W + <- (,)
, 0.504842594 Q W + [kjournald]
, 0.504844133 G W + [kjournald]
, 0.504845233 P N [kjournald]
, 0.504845703 I W + [kjournald]
, 0.504846958 U N [kjournald]
, 0.504848547 D W + [kjournald]
, 0.504879109 C W + []
CPU2 (,):
Reads Queued: , 0KiB Writes Queued: , 24KiB
Read Dispatches: , 0KiB Write Dispatches: , 24KiB
Reads Requeued: Writes Requeued:
Reads Completed: , 0KiB Writes Completed: , 48KiB
Read Merges: , 0KiB Write Merges: , 12KiB
Read depth: Write depth:
IO unplugs: Timer unplugs:
CPU13 (,):
Reads Queued: , 0KiB Writes Queued: , 4KiB
Read Dispatches: , 0KiB Write Dispatches: , 4KiB
Reads Requeued: Writes Requeued:
Reads Completed: , 0KiB Writes Completed: , 0KiB
Read Merges: , 0KiB Write Merges: , 0KiB
Read depth: Write depth:
IO unplugs: Timer unplugs:
CPU21 (,):
Reads Queued: , 0KiB Writes Queued: , 20KiB
Read Dispatches: , 0KiB Write Dispatches: , 20KiB
Reads Requeued: Writes Requeued:
Reads Completed: , 0KiB Writes Completed: , 0KiB
Read Merges: , 0KiB Write Merges: , 16KiB
Read depth: Write depth:
IO unplugs: Timer unplugs: Total (,):
Reads Queued: , 0KiB Writes Queued: , 48KiB
Read Dispatches: , 0KiB Write Dispatches: , 48KiB
Reads Requeued: Writes Requeued:
Reads Completed: , 0KiB Writes Completed: , 48KiB
Read Merges: , 0KiB Write Merges: , 28KiB
IO unplugs: Timer unplugs: Throughput (R/W): 0KiB/s / 95KiB/s
Events (,): entries
Skips: forward ( - 0.0%)

利用这些信息我们可以很清楚的知道我们IO设备在做什么,花了多少时间,透过它了解我们系统的运作。如何解读这些信息我们可以看手册有详细的解释:

$ man blkparse

同时如果你觉得这些信息太原始,类似btt, seekwatcher这样的工具在blktrace的信息的基础上更深入的挖掘了系统的行为,使用起来也更简单。

我们在实际工作的过程中用blktrace定位了很多问题,比如fsync的延时问题和IO调度器的问题,确实是很实用的一个工具。

祝大家玩的开心。

blktrace 深度了解linux系统的IO运作的更多相关文章

  1. Linux系统 磁盘IO过高排查总结

    最近做的一个电商网站因为磁盘 I/O 过高导致访问速度奇慢,问题存在两个月有余未得到解决办法.此次排查原因的经验可以作下次问题的参考. 1.会看懂 top 系统命令出来的各项参数.此次是无意中发现 u ...

  2. Linux系统:保证数据安全落盘

    在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据.但是我们都知道,linux系统的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer来加速 ...

  3. [转]linux 系统监控、诊断工具之 IO wait

    1.问题: 最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端.本机都没问题,但是没想到上了第二份日志之后,问题来了: 集群中的某台机器 top 看到负载巨高,集群中的机器 ...

  4. Linux系统编程--文件IO操作

    Linux思想即,Linux系统下一切皆文件. 一.对文件操作的几个函数 1.打开文件open函数 int open(const char *path, int oflags); int open(c ...

  5. Linux系统编程@终端IO

    Linux系统中终端设备种类  终端是一种字符型设备,有多种类型,通常使用tty 来简称各种类型的终端设备.终端特殊设备文件一般有以下几种: 串行端口终端(/dev/ttySn ) ,伪终端(/dev ...

  6. linux:关于Linux系统中 CPU Memory IO Network的性能监测

    我们知道:系统优化是一项复杂.繁琐.长期的工作.通常监测的子系统有以下这些:CPUMemoryIO Network 下面是常用的监测工具 Linux 系统包括很多子系统(包括刚刚介绍的CPU,Memo ...

  7. Linux系统IO分析工具之iotstat常用参数介绍

    Linux系统IO分析工具之iotstat常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 1>.安装iostat [root@flume115 ~]# yum - ...

  8. Linux系统IO分析工具之iotop常用参数介绍

      Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...

  9. 操作系统复习——如何查看一个进程的详细信息,如何追踪一个进程的执行过程 ,如何在 Linux 系统下查看 CPU、内存、磁盘、IO、网卡情况?epoll和select区别?

    1. 如何查看一个进程的详细信息,如何追踪一个进程的执行过程 通过pstree命令(根据pid)进行查询进程内部当前运行了多少线程:# pstree -p 19135(进程号) 使用top命令查看(可 ...

随机推荐

  1. ES6 Generator 学习笔记一

    Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. Generator 函数有多种理解角度.从语法上,首先可以把它理解成,Generator 函数是一个状态机 ...

  2. Python中的import

    模块(module):用来从逻辑(实现一个功能)上组织Python代码(变量.函数.类),本质就是*.py文件.文件是物理上组织方式"module_name.py",模块是逻辑上组 ...

  3. 第十五篇 make中的隐式规则概述

      前面我们讲到了makefile的依赖拆分的知识,现在可以引申出这样一个问题,如果同一个目标的不同命令拆分的写到不同地方会发生什么?下面我们给出程序和执行结果:   可见后面的命令会覆盖前面的命令, ...

  4. 【opencv基础】Rect类的神奇用法

    前言 最近看github上源码发现对两个cv::Rect使用相与(&)操作,猛地感觉自己蒙啦,Rect类还有这种神奇用法?!翻看opencv官网Rect类,果然如此! opencv中Rect类 ...

  5. [Boolan-C++学习笔记]第二周整理

    1.对于String类型的类(含有指针) 其中的指针成员能够灵活的申请存储空间,但指针操作又带来内存泄漏的风险,变更指针的操作需要尤为谨慎. 要点在于写好BigThree 构造函数 { 完成成员初始化 ...

  6. stardog 基本试用(社区版)

    stardog 是一个知识图谱的实现,实现了sparql 以及graphql 协议,使用起来也比较简单,官方文档挺全 下载 社区版,注册之后会有邮件通知,里面会包含license 以及软件包 下载地址 ...

  7. 序列化效率比拼——谁是最后的赢家avaScriptSerializer方式、DataContract方式、Newtonsoft.Json

    前言:作为开发人员,对象的序列化恐怕难以避免.楼主也是很早以前就接触过序列化,可是理解都不太深刻,对于用哪种方式去做序列化更是随波逐流——项目中原来用的什么方式照着用就好了.可是这么多年自己对于这东西 ...

  8. MSMQ-发送消息到远程专用队列path格式

    在工作组模式下,远程访问专用队列.在网上找到一篇文章,翻译了一下. 最后结论,直接使用多元素格式名方式,利用IP地址直接对单个或多个目标发送消息      MessageQueue rmQ = new ...

  9. juc包下的集合类

    import java.util.Iterator;import java.util.concurrent.CopyOnWriteArrayList; /** * 集合在多线程中同步的方式: * 1. ...

  10. FastAdmin 使用 Git 更新的新用法 (2019-02-28)

    FastAdmin 使用 Git 更新的新用法 2019-02-28 新流程 增加一个 fastadmin 的远程仓库. 在项目的开发或主分支. 如果有代码更新将代码提交 commit. git pu ...