利用blktrace分析磁盘I/O

2023-10-27

blktrace对于分析block I/O是个非常好的工具,本篇文章记录了如何使用blktrace。

blktrace原理

blktrace是对通用块层(block layer)的I/O跟踪机制,它能抓取详细的I/O请求(request),发送到用户空间。

blktrace主要由3部分组成:

  • 内核部分
  • 记录内核到用户空间的I/O追踪信息的程序
  • 分析、展示I/O追踪信息的程序

主要在block layer实现,抓取的数据通过debugfs来传递。每个被跟踪的设备都有一个在debugfs挂载目录的文件。debugfs挂载目录默认是:/sys/kernel/debug

用官方的一张图来直观的展现:

一个I/O请求进入block layer之后,可能会经历下面的过程:

  • Remap: 可能被DM(Device Mapper)或MD(Multiple Device, Software RAID) remap到其它设备
  • Split: 可能会因为I/O请求与扇区边界未对齐、或者size太大而被分拆(split)成多个物理I/O
  • Merge: 可能会因为与其它I/O请求的物理位置相邻而合并(merge)成一个I/O
  • 被I/O Scheduler依照调度策略发送给driver
  • 被driver提交给硬件,经过HBA、电缆(光纤、网线等)、交换机(SAN或网络)、最后到达存储设备,设备完成I/O请求之后再把结果发回。

blktrace使用

  • 安装blktrace包

    yum install blktrace
  • 追踪指定设备的I/O

    [root@k8s-slave9 longterm_io] # blktrace -d /dev/sde
    ^C=== sde ===
       CPU  0:                   38 events,        2 KiB data
       CPU  1:                    1 events,        1 KiB data
       CPU  2:                  232 events,       11 KiB data
       CPU  3:                    2 events,        1 KiB data
       CPU  4:                   41 events,        2 KiB data
       ...
       Total:                   567 events (dropped 0),       27 KiB data

    -d <dev> 指定具体的设备名

    上面是抓取一段时间后,Ctrl+C中止的。也可以指定时间:-w <seconds>
    blktrace执行完之后,会生产很多文件,每个CPU都会有一个文件,文件名组成:<设备名>.blktrace.<CPU id>,如下:

    [root@k8s-slave9 longterm_io] # ls
    sde.blktrace.0   sde.blktrace.12  sde.blktrace.16  sde.blktrace.2   sde.blktrace.23  sde.blktrace.27  sde.blktrace.30  sde.blktrace.34  sde.blktrace.38  sde.blktrace.6
    ...

    抓取IO信息,完成了第一步,我们要分析这些I/O,就需要下面的工具。

blkparse分析数据

    • 解析IO追踪信息

      blkparse是一个会把不同CPU的I/O trace文件合并,并解析、格式化输出为对用户可读友好IO信息的工具。

      先把上面生成的所有CPU I/O trace文件合并成一个文件:

      [root@k8s-slave9 longterm_io] # blkparse -i sde -d sde.blktrace.bin
      Input file sde.blktrace.0 added
      Input file sde.blktrace.1 added
      Input file sde.blktrace.2 added
      Input file sde.blktrace.3 added
      Input file sde.blktrace.4 added
      ...
      -----------------------------第一个IO开始
        8,64  35        1     0.000000000 28378  A   W 470236984 + 40 <- (8,65) 470234936
         8,64  35        2     0.000000670 28378  Q   W 470236984 + 40 [kworker /u82 :1]
         8,64  35        3     0.000005125 28378  G   W 470236984 + 40 [kworker /u82 :1]
         8,64  35        4     0.000005443 28378  P   N [kworker
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用blktrace分析磁盘I/O 的相关文章

  • expected an indented block

    Python中没有分号 xff0c 用严格的缩进来表示上下级从属关系 导致excepted an indented block这个错误的原因一般有两个 xff1a 1 冒号后面是要写上一定的内容的 xff08 新手容易遗忘这一点 xff09
  • 利用blktrace分析磁盘I/O

    blktrace对于分析block I O是个非常好的工具 本篇文章记录了如何使用blktrace blktrace原理 blktrace是对通用块层 block layer 的I O跟踪机制 它能抓取详细的I O请求 request 发送
  • VM中某块盘无法使用

    现象 VM中有一块盘 进入mount点后 ls显示错误 root es10 data2 ls ls cannot open directory Input output error 跟踪分析 查看磁盘 root es10 lsblk gre
  • sgdisk基本用法

    sgdisk基本用法 简介 sgdisk是Linux下操作GPT分区的工具 就像fdisk是操作MBR分区的工具 关于GPT和MBR的区别请参考 http www anchor com au blog 2012 10 the differe
  • Block头部解析

    Block解析介绍了Block的各个组成部分 魔法数 块大小 块头部 交易个数 交易 本文将详细介绍块魔法数和块头部的各个组成部分 魔法数 魔法数是比特币客户端解析Block数据时的识别码 比特币正式网络的魔法数是0xD9B4BEF9 不同
  • Ruby 中的块和过程

    我已经开始学习 Ruby 读了一些教程 甚至买了一本书 Programming Ruby 1 9 The Pragmatic Programmers Guide 我遇到了一些我以前在任何课程中都没有见过的新东西 我知道的其他语言 我是一名
  • 为什么 Hash#select 和 Hash#reject 将键传递给一元块?

    我的理解是Hash select and Hash reject每个都传递一个键及其值的数组 key value 作为每次迭代的单个块参数 您可以使用隐式破坏性赋值直接在块内单独选取它们 a 1 b 2 select k v k a gt
  • 为什么带有 splat 参数的 Ruby 过程/块的行为与方法和 lambda 不同?

    为什么带有 splat 参数的 Ruby 2 0 过程 块的行为与方法和 lambda 不同 def foo ids args p ids end foo 1 2 3 gt 1 2 3 bar lambda do ids args p id
  • 如何在闭包中调用函数

    在模特的课堂上Location 我得到当前城市的名称 var currentLatitude Double var currentLongitude Double var currentLocation String var current
  • Solr - 具有许多子约束的块连接父查询

    该问题适用于以下嵌套文档
  • 使用RestKit,使用块加载对象,何时以及如何取消请求?

    RKObjectManager sharedManager loadObjectsAtResourcePath app site pattern usingBlock RKObjectLoader loader loader setObje
  • Magento 静态块。去除包装

    当我创建静态块时 magento 将内容包装为 p 标签 这对于 DOM 来说非常糟糕 有可能以某种方式将其删除 我想这是一些 JavaScript 但我不知道是哪一个 其实我之前的回答是错误的 您需要默认关闭静态块所见即所得编辑器 Go
  • 完成块?嵌入同步工作流中的异步流程

    潜伏已久 第一次发海报 我对 Objective C 比较陌生 所以如果我问的问题相当简单 我很抱歉 我的谷歌和堆栈溢出让我失望了 所以我想有人可以提供帮助 我有一个同步进程 比如说 连续执行三个函数 称之为 A gt B gt C 其中执
  • 将数据从块传递到视图

    我发现您可以通过将数据设置到 xml 文件来将数据设置到块视图 有没有办法在不访问 xml 文件的情况下设置它 还有一个问题 如何将数据从控制器传递到块 用于将数据从块传递到视图 在块中使用 this gt setVariableName
  • 解释 Powershell { } 脚本块中的变量

    我有一个 shell 脚本 它应该在后台启动 exe strPath get location block strPath storage bin storage exe args start job scriptblock block a
  • 如何在C#中动态阻止网站?

    我想从用 C 编写的 Windows 服务动态阻止某些 URL 我不想通过写入主机文件来做到这一点 例如我想阻止该网址http example com 在所有浏览器中 但也会阻止http example com another早上 7 点到
  • Erlang 中的 begin...end 有何用途?

    我刚刚踩了一个begin end在 Erlang 的文档中 here http www erlang org doc reference manual expressions html id79819 但它没有给出一些例子来说明它是如何有用
  • C# 如何杀死阻塞的线程?

    我有一个线程 void threadCode object o doStuffHere o Blocking call Sometimes hangs 我这样称呼它 Thread t new Thread new ThreadStart d
  • C 中每个块复制一个文件块

    我试图将文件分成 x 个大小为 y 以字节为单位 的块 以便我可以单独复制每个块 我怎样才能做到这一点 尝试使用fread http www manpagez com man 3 fread char buffer ysize fread
  • Eigen 库:在函数中返回矩阵块作为左值

    我试图将矩阵块作为函数的左值返回 假设我的函数如下所示 Block

随机推荐