即使未安装磁盘(在 USB 外壳中)也会不断唤醒

即使未安装磁盘(在 USB 外壳中)也会不断唤醒

设置

我有 USB 外壳 (Buffalo DriveStation Quad),其中包含连接到我的 nas 服务器(ubuntu 服务器 14.04)的四个驱动器。该机箱配置为 JBOD 模式,因此我将在 Linux 中看到所有磁盘。

其中两个磁盘(sdb 和 sdc)使用软件 raid 配置为/dev/md0(raid1)。并且使用 ext4 文件系统/dev/md0安装为单个分区 ( /mnt/part1),无需日志记录。

另外两个磁盘(sdd 和 sde)使用 LVM 设置为一个卷组,我从其中安装了两个逻辑分区。其中一项是整个卷组容量的 90% ( /mnt/part2),另一项是 10% ( /mnt/part3)。两者都是 ext4,没有日志记录。

APM 问题

我的问题始于默认的 APM 模式,因为我注意到硬盘驱动器磁头每隔几分钟就会非常频繁地停放。在对这个主题进行了一些研究之后,我最终使用了hdparm -B198 /dev/sd[bcde].这似乎可以在一定程度上节省电力,但实际上并没有进行任何头部停车。

有睡觉吗?

我对目前的情况感到满意,但如果没有活动,我仍然希望驱动器进入睡眠状态。尤其是 sdb 和 sdc ( /mnt/part1),在 95% 的时间内都没有真正进行任何活动。无论我尝试过什么,问题似乎是驱动器的睡眠时间不会超过一两分钟。

卸载所有分区并发出命令hdparm -y /dev/sd[bcde]将使驱动器进入睡眠模式,但只会持续几分钟。之后他们都会一一醒来。我尝试通过启用 block_dump ( echo 1 > /proc/sys/vm/block_dump) 来调试该问题,但没有看到任何对磁盘的访问。

我还尝试使用 禁用 APM hdparm -B255 /dev/sd[bcde],然后命令它们休眠,但还是一样。驱动器仍然会在几分钟后唤醒。

我没有mdadm在守护进程模式下运行(每天只需一次检查),也不应该有其他任何东西探测驱动器。那么接下来要尝试什么有什么想法吗? Buffalo USB 外壳是否很蹩脚(而且它本身就是如此)?

更新#1

我花了时间了解发出后磁盘需要多长时间才能唤醒hdparm -y /dev/sd[bc]。以下时间戳说明了该模式:

00:00 hdparm -y /dev/sd[bc]
00:40 disks start to wake up
00:59 disks fully awake
01:00 hdparm -y /dev/sd[bc]
03:40 disks start to wake up
03:59 disks fully awake
04:00 hdparm -y /dev/sd[bc]
06:40 disks start to wake up
06:59 disks fully awake

也就是说,似乎有东西每 3 分钟检查/唤醒一次磁盘。第一个进入待机模式的命令恰好是距离检查点 40 秒。

更新#2

使用 重新启动机器acpi=off apm=off。也没有帮助。顺便说一句,该机器是联想L520笔记本电脑。以防万一有人发现相关。

答案1

可能有点矫枉过正,但SystemTap可以帮助您识别哪个进程正在该磁盘上执行 I/O。

准备SystemTap

[root@localhost ~]# stap-prep
snip

安装跟踪脚本

[root@localhost ~]# cat >/tmp/traceio2.stp
#! /usr/bin/env stap
global device_of_interest

probe begin {
  /* The following is not the most efficient way to do this.
      One could directly put the result of usrdev2kerndev()
      into device_of_interest.  However, want to test out
      the other device functions */
  dev = usrdev2kerndev($1)
  device_of_interest = MKDEV(MAJOR(dev), MINOR(dev))
}

probe vfs.write, vfs.read
{
  if (dev == device_of_interest)
        printf ("%s(%d) %s 0x%x\n",
            execname(), pid(), ppfunc(), dev)
}

找出你想要监控的设备ID,在本例中我将监控/dev/sda5

[root@localhost ~]#  df -k /
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda5       18141508 16293424    903496  95% /
[root@localhost ~]# ls -l /dev/sda5
brw-rw----. 1 root disk 8, 5 Jul  1 01:21 /dev/sda5
[root@localhost ~]# 

监视,使用十六进制的主要+次要数字 (8,5)。找出罪魁祸首。麾

[root@localhost ~]# /tmp/traceio2.stp 0x805
accounts-daemon(434) vfs_read 0x800005
accounts-daemon(434) vfs_read 0x800005
accounts-daemon(434) vfs_read 0x800005
lightdm(503) vfs_write 0x800005
bash(3036) vfs_read 0x800005
bash(3036) vfs_read 0x800005
^C
[root@localhost ~]#

相关内容