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

Posted

技术标签:

【中文标题】如何在 GNU/Linux 中记录正在使用磁盘的进程或内核活动?【英文标题】:How can I record what process or kernel activity is using the disk in GNU/Linux? 【发布时间】:2010-09-19 23:00:15 【问题描述】:

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

两个有趣的点:

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

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

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

可以试试:

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

但想避免修补我的内核。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

任何原因导致 root 无法执行 'echo 1 > /proc/sys/vm/block_dump' 并出现以下错误“bash: echo: write error: Operation not allowed”?这是一个虚拟化环境,所以我猜这就是为什么...... :( 我从未尝试过虚拟化系统。如果您通过 sudo 运行,请注意您不能只执行 sudo echo 1 > /proc/sys/vm/block_dump,因为只有 echo 被 sudo,而不是重定向。你需要做 sudo bash -c "echo 1 > /proc/sys/vm/block_dump"【参考方案2】:

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

CONFIG_TASKSTATS=y
CONFIG_TASK_IO_ACCOUNTING=y

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

您也可以使用 htop,启用 IO_RATR 列。 Htop 是一个优秀的***替代品。

【讨论】:

【参考方案6】:

Brendan Gregg's iosnoop 脚本可以(启发式地)告诉您当前在最近的内核上使用磁盘 (example iosnoop output)。

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

http://gitorious.org/mortadelo

【讨论】:

以上是关于如何在 GNU/Linux 中记录正在使用磁盘的进程或内核活动?的主要内容,如果未能解决你的问题,请参考以下文章

linux分区格式都有哪些

EDA和工具_00_GNU/ Linux使用基础

获得Gnu/Linux系统与进程信息

Inxi:获取Linux系统和硬件信息的神器

Inxi:获取Linux系统和硬件信息的神器

简述gnu与linux的关系