Systemtap examples, DISK IO - 5 Monitoring Reads and Writes to a File
背景
例子来自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