如何在 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 -k2dmesg -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 中记录正在使用磁盘的进程或内核活动?的主要内容,如果未能解决你的问题,请参考以下文章