15

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

两个有趣的点:

  1. 尝试一次关闭一项系统服务,但无济于事。磁盘活动保持相当稳定并且出乎意料地高。

  2. 尽管进行了写入,但似乎并没有在磁盘上消耗更多的整体空间。

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

可以试试:

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

但想避免修补我的内核。

关于如何追踪这一点的任何想法?

4

8 回答 8

17

iotop 很好(实际上很棒)。

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

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

    
须藤-s
dmesg -c
/etc/init.d/klogd 停止
回声 1 > /proc/sys/vm/block_dump
rm /tmp/磁盘日志
观看“dmesg -c >> /tmp/disklog”
   完成收集数据后按 CTRL-C
回声 0 > /proc/sys/vm/block_dump
/etc/init.d/klogd 启动
退出(退出根外壳)

猫/tmp/磁盘日志| awk -F"[() \t]" '/(READ|WRITE|dirtied)/ {activity[$1]++} END {for (x in activity) print x, activity[x]}'| 排序 -nr -k2

dmesg -c 行清除您的内核日志。然后关闭记录器,手动(使用 watch)转储到磁盘(内存缓冲区很小,这就是我们需要这样做的原因)。让它运行大约五分钟左右,然后 CTRL-c 监视进程。关闭日志并重新启动 klogd 后,使用最后的一点点 awk 分析结果。

于 2009-01-08T08:03:02.553 回答
3

如果您使用的是比 2.6.20 更新的内核,那非常容易,因为这是包含 I/O 记帐的 Linux 内核的第一个版本。如果您正在编译自己的内核,请确保包括:

CONFIG_TASKSTATS=y
CONFIG_TASK_IO_ACCOUNTING=y

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

于 2008-12-27T20:17:45.507 回答
2

您可能想研究iotop for Linux。有一些 Solaris 版本随处可见,但例如有一个 Debian 软件包。

于 2008-10-30T12:39:01.150 回答
1

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

于 2014-08-03T07:59:08.900 回答
1

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

于 2008-10-30T08:42:41.610 回答
1

您也可以使用htop,启用 IO_RATR 列。Htop 是一个出色的顶部替代品。

于 2009-06-21T10:05:09.503 回答
0

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

于 2008-10-30T08:28:18.440 回答
0

我最近听说了一个 Filemon 克隆的 Mortadelo,但我自己还没有检查过:

http://gitorious.org/mortadelo

于 2010-02-17T00:59:02.473 回答