43.2. 使用 SystemTap 跟踪每个文件的 I/O 时间

您可以使用 iotime.stp SystemTap 脚本监控每个进程从文件读取或写入到任何文件所需的时间。这有助于您确定系统上载入哪些文件。

先决条件

流程

  • 运行 iotime.stp 脚本:

    # stap --example iotime.stp

    脚本会在每次系统调用打开、关闭、读取以及写入文件时进行跟踪。对于每一个系统调用访问的文件,它会计算出任何读取或写入到完成并跟踪数据量(以字节为单位)的微秒数,以字节为单位,读取或写入文件。

    输出包含:

  • 微秒中的时间戳
  • 进程 ID 和进程名称
  • accessiotime 标志
  • 已访问的文件

    如果某个进程能够读取或写入任何数据,一对 access 和 iotime 行应同时出现。access 行指的是给定进程开始访问文件的时间。访问行的末尾将显示读取或写入的数据量。iotime 行显示进程执行读和写操作所使用的时间,以微秒为单位。

iotime.stp 脚本的输出类似如下:

[...]
825946 3364 (NetworkManager) access /sys/class/net/eth0/carrier read: 8190 write: 0
825955 3364 (NetworkManager) iotime /sys/class/net/eth0/carrier time: 9
[...]
117061 2460 (pcscd) access /dev/bus/usb/003/001 read: 43 write: 0
117065 2460 (pcscd) iotime /dev/bus/usb/003/001 time: 7
[...]
3973737 2886 (sendmail) access /proc/loadavg read: 4096 write: 0
3973744 2886 (sendmail) iotime /proc/loadavg time: 11
[...]