Systemtap examples, DISK IO - 5 Monitoring Reads and Writes to a File

less than 1 minute read

背景

例子来自inodewatch.stp 脚本, 该脚本用以监控单个文件的读写, 需要使用vfs.read和vfs.write probe alias中的dev和ino变量对文件进行判断.  
dev是设备号, ino是文件的inode.  
dev和inode可以通过stat获得, 例如  
[root@db-172-16-3-150 oracle_fdw-0.9.9]# man stat  
STAT(1)                          User Commands                         STAT(1)  
NAME  
       stat - display file or file system status  
SYNOPSIS  
       stat [OPTION]... FILE...  
       %D     Device number in hex  
       %i     Inode number  
获得/etc/crontab文件的dev 和 inode  
[root@db-172-16-3-150 oracle_fdw-0.9.9]# stat -c '0x%D %i' /etc/crontab   
0x821 662584  
0x821分成两部分, 前2位(8)表示major, 后两位(21)是minor.  
662584是inode.  
  
脚本内容以及注解 :   
[root@db-172-16-3-150 network]# cd /usr/share/systemtap/testsuite/systemtap.examples/io  
[root@db-172-16-3-150 io]# cat inodewatch.stp  
#!/usr/bin/stap  
  
probe vfs.write, vfs.read  
{  
  # dev and ino are defined by vfs.write and vfs.read  
  if (dev == MKDEV($1,$2) # major/minor device  
      && ino == $3)  
    printf ("%s(%d) %s 0x%x/%u\n",  
      execname(), pid(), probefunc(), dev, ino)  
}  
// MKDEV($1,$2)用来创建kernel device, 用以和vfs.wirte, vfs.read的dev变量值匹配.  
// 当dev和ino都和用户输入的值匹配时, 输出记录.  
  
执行输出举例 :   
[root@db-172-16-3-150 io]# stap inodewatch.stp 0x8 0x21 662584  
// 使用cat命令查看/etc/crontab文件后, 可以看到stap的输出如下 :   
cat(17186) vfs_read 0x800021/662584  
cat(17186) vfs_read 0x800021/662584  

本文用到的几个probe alias原型(包含对应的call原型).

参照

http://blog.163.com/digoal@126/blog/static/1638770402013101885114320/

这几个函数的源码位置信息: (源码这里就不贴出来了)

参照

http://blog.163.com/digoal@126/blog/static/1638770402013101885114320/

参考

1. https://sourceware.org/systemtap/SystemTap_Beginners_Guide/mainsect-disk.html

2. https://sourceware.org/systemtap/examples/

3. /usr/share/systemtap/testsuite/systemtap.examples

4. systemtap-testsuite

5. /usr/share/systemtap/testsuite/systemtap.examples/index.txt

6. /usr/share/systemtap/testsuite/systemtap.examples/keyword-index.txt

7. /usr/share/systemtap/tapset

Flag Counter

digoal’s 大量PostgreSQL文章入口