2011-11-18 114 views
1

程序正在大量读取磁盘,但我不知道正在读取哪个文件,也不知道正在读取的代码中的哪个位置。Linux上C++应用程序的磁盘IO分析器

在linux上有没有什么工具可以监控这个?

相关的问题(窗口):Disk IO profiler for existing applications

+3

目录/ proc/PID/fd为您提供有关打开进程的文件的一些信息。这不是简介,所以不是答案,但可以帮助你进行研究。 –

+0

谢谢,我没有提到fd文件。干杯! – Barth

回答

5

所以,你可以使用: /proc/PID/fdlsof -p PID

知道哪些文件你的过程中使用。

例如,与lsof -p 27666(假设27666是a.out的程序的PID),你可以看到这一点:

./a.out 22531 me 9w REG 8,5 131072 528280 /home/me/tmp/test.db 
./a.out 22531 me 9r REG 8,5 131072 528280 /home/me/tmp/test2.db 
4

如果系统真的是忙IO,只看top,你会看到IO绑定进程通常停留在D状态。

strace -c myprog是我第一次尝试所有通用“我的应用程序在做什么/花费大多数时间”问题的最佳朋友。 Strace还可以附加到正在运行的进程,以便您可以在程序运行时观察它。
另一个好的技巧就是将它输出(与strace -o myprogrun.log)到一个日志文件中,然后使用现代的vim查看它,因为它可以非常好地突出显示日志。以这种方式查找事情要容易得多,因为默认的strace输出不是非常容易理解的。

要记住的重要事情是登录到另一个分区/磁盘组,而不是IO问题所在!由于strace可以产生大量输出,因此不要引发额外的IO问题。我喜欢在这种场合使用TmpFS或ZRAM RAM磁盘。

+0

我打算建议strace寻找从lsof或者/ proc//fd /中找到的文件描述符中的write()。非常快速和有效。 – Joel