如何检查应用程序写入了哪些文件?

如何检查应用程序写入了哪些文件?

在我的系统上,sar报告平均磁盘写入速度约为 5MB/s。使用dstat我发现它不是那么永久,但有 30-50MB/s 的峰值,然后是睡眠。

使用iotop我发现大部分写作都是由一个应用程序完成的(但我不知道它有多确定)。

使用strace并且fatrace我看到该应用程序打开,在不同的目录中创建文件,然后关闭/删除它们。文件很多,但我没看到strace太多文字。我尝试查找更多信息/proc/pid/fd以查看是否有任何文件不断增加(日志等),但我找不到任何文件。所以我的结论是,所有写入都是通过应用程序创建的小临时文件完成的。

如何检查每个文件写入了多少内容?我想要一份包含写入每个文件的字节数的报告。

有什么办法可以做到吗?我考虑过重写系统调用,例如openwrite来监视每个文件的更改,或者使用systemtap但我希望有更简单的方法。

答案1

布伦丹·格雷格的iosnoop(他的一部分perf-tools)将为您提供有关应用程序 I/O 的详细信息;例如:

# ./iosnoop
Tracing block I/O... Ctrl-C to end.
COMM             PID    TYPE DEV      BLOCK        BYTES     LATms
supervise        1809   W    202,1    17039968     4096       1.32
supervise        1809   W    202,1    17039976     4096       1.30
tar              14794  RM   202,1    8457608      4096       7.53
tar              14794  RM   202,1    8470336      4096      14.90
tar              14794  RM   202,1    8470368      4096       0.27
tar              14794  RM   202,1    8470784      4096       7.74
tar              14794  RM   202,1    8470360      4096       0.25
tar              14794  RM   202,1    8469968      4096       0.24
tar              14794  RM   202,1    8470240      4096       0.24
[...]

(示例取自他的博文)。

您可以使用它来跟踪系统的所有 I/O(如上所述),或将其限制为单个进程、设备...

答案2

你可以尝试一下(通常从内核 2.6 开始inotify打包)。inotify tools它将监视文件系统的一部分并通知您创建/删除文件或目录等事件。

一个简单的用法是:

inotifywait -m -r /tmp/

然后,当文件系统活动发生时,您将看到:

#=> I'm creating /tmp/b
/tmp/ CREATE,ISDIR b
/tmp/ OPEN,ISDIR b
/tmp/ ACCESS,ISDIR b
/tmp/ CLOSE_NOWRITE,CLOSE,ISDIR b

man inotifywaitman inotifywatch了解更多信息。

请注意,在宽文件系统上使用 inotify 会消耗大量资源......

如果您将其与stat(例如查看所有者)和/或lsof(显示所有当前打开的文件以及通过哪个进程)结合起来,您可能会有更多提示来知道应该归咎于谁。

编辑:inotify和 的组合示例stat

inotifywait -m -r /tmp --format "%w%f" -e modify | while read newfile
do
  echo $newfile $(stat -c "%s" $newfile) bytes
done

这将输出类似:

/tmp/oaoa 24 bytes
/tmp/oaoa 24 bytes
/tmp/.com.google.Chrome.iLdh1J 0 bytes
/tmp/.com.google.Chrome.iLdh1J 1472 bytes

相关内容