我怎样才能logging在GNU / Linux中使用磁盘的进程或内核活动?

在特定的Debian服务器上,iostat(以及类似的)报告正在进行的磁盘写入的意外高容量(以字节为单位)。 我无法确定哪个进程正在执行这些写操作。

两个有趣的点:

  1. 试图closures系统服务一次一个都无济于事。 磁盘活动保持相当稳定和意外高。

  2. 尽pipe写作,似乎并没有消耗更多的整个磁盘空间。

这两个都让我觉得这个写作可能是内核正在做的事情,但是我并没有交换,所以我不清楚Linux可能会写什么。

可以试试看:

http://www.atcomputing.nl/Tools/atop/

但是想避免修补我的内核。

任何想法如何跟踪这个?

Solutions Collecting From Web of "我怎样才能logging在GNU / Linux中使用磁盘的进程或内核活动?"

iotop是好的(实际上很棒)。

如果你有一个从2.6.20之前的内核,你不能使用这些工具的大部分。

相反,你可以尝试下面的内容(几乎任何2.6内核IIRC都可以):

    
 sudo -s
 dmesg -c
 /etc/init.d/klogd停止
 echo 1> / proc / sys / vm / block_dump
 rm / tmp / disklog
观看“dmesg -c >> / tmp / disklog”
    CTRL-C当你完成数据的收集
 echo 0> / proc / sys / vm / block_dump
 /etc/init.d/klogd启动
退出(退出root shell)

 cat / tmp / disklog |  awk -F“[()\ t]”'/(READ | WRITE | dirtied)/ {activity [$ 1] ++} END {for(x in activity)print x,activity [x]}'  sort -nr -k2

dmesg -c行清除你的内核日志。 然后记录器被关闭,手动(使用手表)转储到磁盘(内存缓冲区很小,这就是为什么我们需要这样做)。 让它运行大约五分钟左右,然后按CTRL-c观察过程。 关闭日志并重新启动klogd后,使用awk的最后一点来分析结果。

如果使用的是比2.6.20更新的内核,那么这很容易,因为这是包含I / O记帐的第一个Linux内核版本。 如果你正在编译自己的内核,一定要包括:

CONFIG_TASKSTATS=y CONFIG_TASK_IO_ACCOUNTING=y 

Debian软件包中的内核已经包含了这些标志,所以不需要重新编译内核。 用于实时访问I / O记帐数据的标准实用程序是iotop(1)。 它提供了I / O调度程序管理的进程的完整列表,并显示每个进程统计信息的读取,写入和使用的总I / O带宽。

你可能想要调查Linux的iotop 。 有一些Solaris版本在浮动,但是有一个Debian软件包。

您可以使用UNIX命令lsof (列出打开的文件)。 打印出进程,进程ID,用户的任何打开的文件。

你也可以使用htop ,启用IO_RATR列。 Htop是顶级替代品。

Brendan Gregg的iosnoop脚本可以(启发式地)告诉你当前在最近的内核上使用磁盘( 例如iosnoop输出 )。

你可以尝试使用SystemTap ,它有很多的例子,如果我没有弄错,它显示了如何做这种事情。

我最近听说了一个Filemon克隆的Mortadelo,但是还没有检查出来:

http://gitorious.org/mortadelo