block_dump觀察Linux IO寫入的具體檔案
http://www.oenhan.com/block-dump-linux-io
很多情況下開發者調測程式需要在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寫一個,效率應該能提高很多。
相關文章
- Linux-檔案寫入和檔案同步Linux
- Linux C 檔案IOLinux
- Linux檔案IO操作Linux
- 玩家行為觀察(一):從抽象到具體抽象
- Python 檔案讀寫(Python IO)Python
- Perl IO:隨機讀寫檔案隨機
- Linux系統程式設計-檔案IOLinux程式設計
- PHP寫入檔案PHP
- Linux檢視日誌檔案寫入速度的4種方法Linux
- Linux系統程式設計之檔案IOLinux程式設計
- linux提取具體某一行的日誌檔案資訊出來Linux
- python 寫入CSV檔案Python
- 追加寫入json檔案JSON
- 檔案IO的學習
- 檔案IO操作
- Windows Ping伺服器列表,把Ping的通寫入OK檔案,Ping不通的寫入NO檔案Windows伺服器
- 讀取檔案流並寫入檔案流
- csv檔案的寫入和讀取
- python中如何使用scipy.io讀寫.mat檔案?Python
- 無法寫入檔案 Filesystem
- python---json檔案寫入PythonJSON
- 圖片寫入pdf檔案
- Java 例項 - 檔案寫入Java
- Qt寫入excel檔案window和Linux通用,支援超連結QTExcelLinux
- 小白觀察:Linux 遊戲如何走向主流Linux遊戲
- linux讀寫檔案 簡單版Linux
- Python檔案的讀寫以及解決報錯io.UnsupportedOperation: not readablePython
- Java 檔案 IO 操作Java
- Python IO檔案管理Python
- 從觀察者模式到手寫EventEmitter原始碼模式MIT原始碼
- Linux指令入門-檔案管理Linux
- golang寫入檔案時,覆蓋前檔案(將前檔案清空)Golang
- java資料list寫入檔案Java
- java如何追加寫入txt檔案Java
- python操作檔案寫入內容Python
- 04小白學nodejs 檔案寫入NodeJS
- 檔案IO操作的最佳實踐
- 將 java 專案部署到 linux 上的具體步驟JavaLinux
- iOS自定義log並寫入檔案iOS