• 一、使用方法:
  • 二、基本原理:
  • 三、总结

很多情况下开发者调测程序需要在Linux下获取具体的IO的状况,目前常用的IO观察工具用vmstat和iostat,具体功能上说当然是iostat更胜一筹,在IO统计上时间点上更具体精细。但二者都是在全局上看到IO,宏观上的数据对于判断IO到哪个文件上毫无帮助,这个时候block_dump的作用就显现出来了。

一、使用方法:

需要先停掉syslog功能,因为具体IO数据要通过printk输出,如果syslog存在,则会往message产生大量IO,干扰正常结果

1
2

suse:~ # service syslog stop
Shutting down syslog services done

然后启动block_dump

1
suse:~ # echo 1 > /proc/sys/vm/block_dump

先说效果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

suse:~ # dmesg | tail
dmesg(3414): dirtied inode 9594 (LC_MONETARY) on sda1
dmesg(3414): dirtied inode 9238 (LC_COLLATE) on sda1
dmesg(3414): dirtied inode 9241 (LC_TIME) on sda1
dmesg(3414): dirtied inode 9606 (LC_NUMERIC) on sda1
dmesg(3414): dirtied inode 9350 (LC_CTYPE) on sda1
kjournald(506): WRITE block 3683672 on sda1
kjournald(506): WRITE block 3683680 on sda1
kjournald(506): WRITE block 3683688 on sda1
kjournald(506): WRITE block 3683696 on sda1
kjournald(506): WRITE block 3683704 on sda1
kjournald(506): WRITE block 3683712 on sda1
kjournald(506): WRITE block 3683720 on sda1
kjournald(506): WRITE block 3683728 on sda1
kjournald(506): WRITE block 3683736 on sda1
kjournald(506): WRITE block 3683744 on sda1

通过dmesg信息可以看到IO正在写那些文件,有进程号,inode号,文件名和磁盘设备名;但每个文件写了多少呢,仅仅通过dirtied inode就看不出来了,还需要分析WRITE block,后面的数字并不是真正的块号,而是内核IO层获取的扇区号,除以8即为块号,然后根据debugfs工具的icheck和ncheck选项,就可以获取该文件系统块属于哪个具体文件,具体请google之。

二、基本原理:

block_dump的原理其实很简单,内核在IO层根据标志block_dump在IO提交给磁盘的关口卡主过关的每一个BIO,将它们的数据打出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

void submit_bio(int rw, struct bio *bio)
{
     int count = bio_sectors(bio);
     bio->bi_rw |= rw;
/*
* If it's a regular read/write or a barrier with data attached,
* go through the normal accounting stuff before submission.
*/
     if (bio_has_data(bio) && !(rw & REQ_DISCARD)) {
         if (rw & WRITE) {
         count_vm_events(PGPGOUT, count);
     } else {
         task_io_account_read(bio->bi_size);
         count_vm_events(PGPGIN, count);
     }
     if (unlikely(block_dump)) {
         char b[BDEVNAME_SIZE];
         printk(KERN_DEBUG "%s(%d): %s block %Lu on %s (%u sectors)n",
              current->comm, task_pid_nr(current),
              (rw & WRITE) ? "WRITE" : "READ",
              (unsigned long long)bio->bi_sector,
              bdevname(bio->bi_bdev, b),
              count);
        }
    }
    generic_make_request(bio);
}

具体WRITE block块号和文件系统块号之间的对应关系在submit_bh函数中决定

1
bio->bi_sector = bh->b_blocknr * (bh->b_size >> 9);

inode的block_dump实现是通过block_dump___mark_inode_dirty搞定的,这次把关口架在inode脏数据写回的路上,把每个过关的inode信息打出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

void __mark_inode_dirty(struct inode *inode, int flags)
{
if (unlikely(block_dump))
block_dump___mark_inode_dirty(inode);
}
static noinline void block_dump___mark_inode_dirty(struct inode *inode)
{
if (inode->i_ino || strcmp(inode->i_sb->s_id, "bdev")) {
struct dentry *dentry;
const char *name = "?";
dentry = d_find_alias(inode);
if (dentry) {
spin_lock(&dentry->d_lock);
name = (const char *) dentry->d_name.name;
}
printk(KERN_DEBUG
"%s(%d): dirtied inode %lu (%s) on %sn",
current->comm, task_pid_nr(current), inode->i_ino,
name, inode->i_sb->s_id);
if (dentry) {
spin_unlock(&dentry->d_lock);
dput(dentry);
}
}

三、总结

1.内核由很多合适的关口来截获获取的IO信息,不改动内核,也可以用jprobe抢劫很多东西。

2.debugfs在大量的block–>file转换过程总太慢,自己用ext2fs写一个,效率应该能提高很多。

—结束—

block_dump观察Linux IO写入的具体文件–OenHan

http://www.oenhan.com/block-dump-linux-io

[root@server-mysql log]# echo 5 > /proc/sys/vm/block_dump

[root@server-mysql log]# dmesg -c |grep mysqld
mysqld(11780): dirtied inode 1069049 (ib_logfile0) on sda3
mysqld(11780): dirtied inode 1069049 (ib_logfile0) on sda3
mysqld(11780): WRITE block 8236616 on sda3
mysqld(9674): dirtied inode 1069048 (ibdata1) on sda3
mysqld(9674): dirtied inode 1069048 (ibdata1) on sda3
mysqld(9674): WRITE block 8144896 on sda3
mysqld(9674): WRITE block 8144904 on sda3
mysqld(9674): WRITE block 8144912 on sda3
mysqld(9674): WRITE block 8144920 on sda3
mysqld(9674): WRITE block 8144928 on sda3
mysqld(9674): WRITE block 8144936 on sda3
mysqld(9674): WRITE block 8144944 on sda3
mysqld(9674): WRITE block 8144952 on sda3
mysqld(9674): dirtied inode 1071023 (kk.ibd) on sda3
mysqld(9674): dirtied inode 1071023 (kk.ibd) on sda3
mysqld(9663): WRITE block 32762104 on sda3
mysqld(9663): WRITE block 32762112 on sda3
mysqld(9663): WRITE block 32762120 on sda3
mysqld(9663): WRITE block 32762128 on sda3
mysqld(9663): WRITE block 16177376 on sda3
mysqld(9663): WRITE block 16177384 on sda3
mysqld(9663): WRITE block 16177392 on sda3
mysqld(9663): WRITE block 16177400 on sda3
mysqld(9658): WRITE block 8175616 on sda3

转载于:https://www.cnblogs.com/zengkefu/p/5639167.html

block_dump观察Linux IO写入的具体文件(mysqld)相关推荐

  1. Stream流、FiLe和IO流、IO流(字节流-拷贝文件_和_字符流-读取文本中的数据写入文本文件中)9-10-11

    package com.streamdemo; import java.util.ArrayList; import java.util.List; /*** 体验Stream流** 创建一个集合,存 ...

  2. linux缓存写入文件,实验5Linux文件操作之带缓存和非缓冲文件的读写

    <实验5Linux文件操作之带缓存和非缓冲文件的读写>由会员分享,可在线阅读,更多相关<实验5Linux文件操作之带缓存和非缓冲文件的读写(15页珍藏版)>请在人人文库网上搜索 ...

  3. linux e514写入错误,Linux上使用vim编辑文件保存时报错:E514: write error (file system full?)...

    今天在Linux上使用vim编辑文件保存时报如下错误 E514: write error (file system full?) 从错误看,是磁盘满了,于是使用df -hl查看磁盘使用情况 $ sud ...

  4. 实训|第十一天学习一下linux中的进程,文件查找,文件压缩与IO重定向

    [root@localhost~]#序言 在今后的工作中,运维工程师每天的例行事务就是使用free -m,top,uptime,df -h...每天都要检查一下服务器,看看是否出现异常.那么今天我们就 ...

  5. import java.io用什么写_问问各位大佬,使用了fiilewrite,为什么写入不到文件

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 问问各位大佬,使用了fiilewrite,为什么写入不到文件里呢 import java.io.BufferedReader; import java.i ...

  6. linux e514写入错误,Linux使用vim编辑文件保存时报E514:write error (file system full?)问题解决...

    发现问题 今天在Linux上使用vim编辑文件保存时报如下错误: E514: write error (file system full?) 从错误看,是磁盘满了,于是使用df -hl查看磁盘使用情况 ...

  7. linux编译 mb_string,一起来学学Linux C(一)文件写入

    一.前言 很久以前接触了VB,后来一直想学C,但是一直被Win API掐住手脚,也一直在用VB去实践WinAPI,所以对C也是一知半解,在后来又转到Linux下学习Java.Android,索性也就在 ...

  8. Linux过滤关键字写入另一个文件

    过滤关键字写入另一个文件 cat GW_20220829.log GW_20220830.log GW_20220831.log | grep "TcpConnector" > ...

  9. Linux操作系统~系统文件IO,什么是文件描述符fd?什么是vfs虚拟文件系统

    目录 1.open() (1).第二个参数flags-通过比特位传多组标记 2.文件描述符fd(open函数的返回值) (1).fd的本质 (2).vfs-虚拟文件系统(一切皆文件) (3).调用re ...

最新文章

  1. 基于嵌入式linux 的车载定位系统设计,基于嵌入式Linux的GPS车载定位导航系统设计...
  2. 类的继承私有成员问题
  3. idbconnection mysql_继承IDbConnection连接不同数据库
  4. redis高并发数据错乱_redis总结:1T以上海量数据+10万以上QPS高并发+99.99%高可用...
  5. java 用文件对话框打开文件
  6. SQL Server 本地数据库登录不上 解决方法
  7. ruby操作常用数据库 - 使用DBI[翻译 转帖]
  8. 在Word中如何进行半行输入
  9. MVC+angularjs
  10. 你知道手动探针台系统的用途及组成部分吗?
  11. 【51单片机】单片机仿真软件Proteus 8.7破解和汉化教程(附下载地址)
  12. 基于深度学习的13种通用图像分类模型及其实现
  13. 软件能力成熟度模型CMM
  14. python根据坐标画点并标记_python-如何使用colormap为matplotlib散点图中的特定点设置标记类型...
  15. Android Studio系统状态栏,设置setSmallIcon通知图标无效问题及解决方案
  16. Python(八)阶段小结
  17. Xenon's Attack on the Gangs(树规)
  18. 日志模块、正则表达式、时间模块
  19. pthread_cont_wait和pthread_cont_signal
  20. 区域性电子商务发展的四个机会

热门文章

  1. 2022-2028年中国老年旅游市场深度调研及开发战略研究报告
  2. Go 知识点(04)— 结构体字段转 json格式 tag 标签的作用
  3. 浅显易懂 Makefile 入门 (06)— 文件名操作函数(dir、notdir、suffix、basename、addsuffix、addperfix、join、wildcard)
  4. Python 标准库之 Queue
  5. pycharm debug后会出现 step over /step into/step into my code /force step into /step out 分别表示...
  6. 通过 DLPack 构建跨框架深度学习编译器
  7. 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库
  8. Pipe Utilization管道利用率
  9. 智能驾驶L2发展策略
  10. 深度人脸识别:CVPR2020论文要点