我可以使用 iotop 等工具来监控 I/O。它让我能够确定哪些进程执行了多少 I/O。
现在我想知道这些进程将所有数据写入哪些文件。我该怎么做?
例如“好吧,我知道 Tomcat 正在做大量的 I/O。它主要从哪些文件读取/写入哪些文件”?
答案1
我知道两种获取此类信息的方法。
手动使用
lsof
。
旧版lsof
可以显示进程或线程正在访问哪些文件,以及其他一些信息。 在 中iotop -o
,观察并记下TID
需要检查的进程或线程的 (Thread ID) 值。 然后关闭iotop
并运行lsof -p [pid/tid]
。 如果需要对输出进行排序,请将其通过管道传输到sort
。 例如,将按第七列 ( ) 的反向顺序(从大到小)lsof -p [pid or tid] | sort -n -k 7,7 -r
对 的输出进行排序。lsof
SIZE/OFF
使用
fatrace
。Linux
的这个新特性与类似inotify
,只是它不针对特定文件/目录。它显示基于正在访问的文件的聚合磁盘 I/O。根据您的发行版,您可能可以或可能无法以预编译的可执行文件形式访问这个漂亮的小程序。fatrace
据我所知,在其官方存储库中提供该特性的最老发行版是 Ubuntu 12.04。我正在使用的 Debian 7 没有该特性。
答案2
csysdig 可能是你最好的选择。它有一个很好的 ncurses 界面。 https://github.com/draios/sysdig/wiki/Csysdig-Overview