在我的系统上,sar
报告平均磁盘写入速度约为 5MB/s。使用dstat
我发现它不是那么永久,但有 30-50MB/s 的峰值,然后是睡眠。
使用iotop
我发现大部分写作都是由一个应用程序完成的(但我不知道它有多确定)。
使用strace
并且fatrace
我看到该应用程序打开,在不同的目录中创建文件,然后关闭/删除它们。文件很多,但我没看到strace
太多文字。我尝试查找更多信息/proc/pid/fd
以查看是否有任何文件不断增加(日志等),但我找不到任何文件。所以我的结论是,所有写入都是通过应用程序创建的小临时文件完成的。
如何检查每个文件写入了多少内容?我想要一份包含写入每个文件的字节数的报告。
有什么办法可以做到吗?我考虑过重写系统调用,例如open
和write
来监视每个文件的更改,或者使用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 inotifywait
并man 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