博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
block_dump观察Linux IO写入的具体文件(mysqld)
阅读量:5938 次
发布时间:2019-06-19

本文共 4374 字,大约阅读时间需要 14 分钟。

 

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

一、使用方法:

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

 

 

然后启动block_dump

 

 

先说效果:

 

 

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

二、基本原理:

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

 

 

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

 

 

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

 

 

三、总结

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

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

—结束—

 

 

[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

 

转载地址:http://qnvtx.baihongyu.com/

你可能感兴趣的文章
git常用命令
查看>>
[Android学习笔记]EditText的使用
查看>>
《活出生命的意义》读后感
查看>>
第四次作业
查看>>
第二次软件综合实验专题作业——结对编程 1759103 李思佳 、 1759107 陶彦婷
查看>>
TCP协议三次握手过程分析
查看>>
std::lexicographical_compare
查看>>
Java设计模式:代理模式(一)
查看>>
直线栅格化(基于 Bresenham 算法)
查看>>
python IDLE 如何实现清屏
查看>>
三维系统应用实例——截图
查看>>
MVC4 + EF为Model添加单独的验证属性
查看>>
C# Dictionary 的几种遍历方法
查看>>
jsvascript === 和==的区别
查看>>
解决Ubuntu(乌班图)vi/vim模式下粘贴的代码内容会多出的空格的问题
查看>>
用递归的方式实现阶乘
查看>>
对局匹配
查看>>
浅析python 中__name__ = '__main__' 的作用
查看>>
(转)intellij idea svn 修改文件后,父文件夹也标注修改
查看>>
70. Climbing Stairs
查看>>