如何在GNU/Linux中记录使用磁盘的进程或内核活动?

14 linux io gnu disk

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

两个有趣的观点:

  1. 试图一次关闭一个系统服务无济于事.磁盘活动保持相当稳定且意外地高.

  2. 尽管写了,但似乎并没有消耗更多的磁盘空间.

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

可以试试看:

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

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

有关如何追踪此问题的任何想法?

Mik*_*age 16

iotop很好(很棒,实际上).

如果您有2.6.20之前的内核,则无法使用大多数这些工具.

相反,您可以尝试以下(这几乎适用于任何2.6内核IIRC):

    
sudo -s
dmesg -c
/etc/init.d/klogd stop
echo 1 > /proc/sys/vm/block_dump
rm /tmp/disklog
watch "dmesg -c >> /tmp/disklog"
   CTRL-C when you're done collecting data
echo 0 > /proc/sys/vm/block_dump
/etc/init.d/klogd start
exit (quit 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行清除了内核日志.然后关闭记录器,手动(使用watch)转储到磁盘(内存缓冲区很小,这就是我们需要这样做的原因).让它运行大约五分钟左右,然后按CTRL-c监视进程.关闭日志记录并重新启动klogd后,最后使用awk的一点点分析结果.

  • 我从未尝试过虚拟化系统.如果你是通过sudo运行的,请注意你不能只做sudo echo 1>/proc/sys/vm/block_dump,因为只有echo是sudoed,而不是重定向.你需要做sudo bash -c"echo 1>/proc/sys/vm/block_dump" (5认同)

Geo*_*Geo 0

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