我正在运行一个 Web 服务器 (Ubuntu 11.04),它表现出意外的高写入流量。当服务器根本不应该写入时,写入流量的数量与读取流量相当。
由于担心不必要的写入操作,我尝试分析系统出了什么问题。我可以排除大量 Apache 日志记录或访问时间问题(使用诺亚泰安装配置)。
为了追踪问题,我想查看写入了哪些文件。因此,我通过 block_dump 启用了 IO 登录(关于此主题的有用博客文章:sprocket.io)。每个文件系统活动都将记录在系统日志中。以下是我的系统的简短摘录:
8 月 21 日 18:22:55 xxxxx 内核:[3984721.590864] apache2(2761):读取 md2 上的块 1098502400(8 个扇区)
8 月 21 日 18:22:55 xxxxx 内核:[3984721.594005] kjournald(316):写入 md2 上的块 2224394648(8 个扇区)
8 月 21 日 18:22:55 xxxxx 内核:[3984721.594029] md2_raid1(260):写入 sdb3 上的块 2925532672(8 个扇区)
8 月 21 日 18:22:55 xxxxx 内核:[3984721.594044] md2_raid1(260):在 sda3 上写入块 2925532672(8 个扇区)
8 月 21 日 18:22:55 xxxxx 内核:[3984721.644244] apache2(2761):在 md2 上读取块 2242118744(8 个扇区)
好的,现在我知道写入了哪些块。但是有没有办法根据这些块 ID 来实际识别写入的文件名?
感谢您的帮助!
顺便说一句:我正在使用软件 Raid,这可能是问题的一部分。
答案1
假设是 ext2/ext3/ext4,从
[406420.877412] vi(12496): READ block 4522288 on dm-1 (8 sectors)
确定文件系统块大小:
# /sbin/dumpe2fs /dev/dm-1 | grep 'Block size'
dumpe2fs 1.42.3 (14-May-2012)
Block size: 4096
假设您的驱动器有 512 字节扇区,将块除以 4096/512(即除以 8 得到 565286)。
使用和debugfs
的组合:icheck
ncheck
debugfs: icheck 565286
Block Inode number
565286 142506
debugfs: ncheck 142506
Inode Pathname
142506 /etc/security/time.conf
编辑:在 md* 设备上执行此操作,而不是 sd* 设备上。sd* 设备 I/O 是软件 raid 的结果。
答案2
文件系统的抽象级别比块设备和软件 RAID 更高。也就是说,软件 RAID 99.9% 的可能性不是问题的一部分,它只是一个块设备。因此,您应该使用其他工具来分析您的 I/O 活动。我建议首先iotop
确定正在运行的进程中排名最高的写入者。然后您将能够使用lsof
并strace
确定正在写入哪些文件。
答案3
Linux 有一个内核系统叫做通知用于观察文件的任何更改。在用户空间中,可以使用inotify 工具( apt-get install inotify-tools
) 来监视目录。但是,每个文件都必须单独放置一个监视点。您可以递归地将它们应用于目录(甚至是根目录),但监视的越少,开销就越小。
缩小范围的其他选项包括:
atop
这将允许您查看哪些进程正在执行写入auditctl
它的语法非常晦涩,但允许对任何系统调用进行监视