很多情況下開發(fā)者調測程序需要在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層獲取的扇區(qū)號,除以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寫一個,效率應該能提高很多。 |
|