磁盘(在USB机柜中)即使没有安装也不断唤醒


13

设定

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

其中两个磁盘(sdb和sdc)的软件RAID配置为/dev/md0(raid1)。并以ext4文件系统/dev/md0作为单个分区(/mnt/part1)挂载而没有日志记录。

其他两个磁盘(sdd和sde)都将LVM设置为一个卷组,从那里我已经安装了两个逻辑分区。其中之一是整个卷组容量(/mnt/part2)的90%,另一个是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笔记本电脑。以防万一有人发现它相关。


2
$ .02:尝试停止计算机上的所有内容(过分的守护进程可能正在四处寻找设备),请使用noatime挂载选项。
Laszlo Valko 2015年

@LaszloValko设法将进程减少到upstart-{socket,file}-bridge, dhclient, getty and sshd-没运气:(。当然有很多内核进程正在运行(括号中列出了一个)。还没有研究我是否可以通过一些内核参数来减少它们……而哪些将是很好的候选人。
托尼

1
判断是机箱还是操作系统的简单方法是旋转驱动器,然后断开USB。
马戏团猫咪

@qasdfdsaq,不幸的是,该Buffalo Drivestation具有一些出色的掉电功能。拔下USB电缆后,机箱会立即自行关闭。甚至电源开关也只有“关闭”和“自动”选项。
托尼2015年

1
只是黑暗中的一枪:检查updatedb.conf的修剪路径和绑定挂载,以便显式跳过这些路径(“定位”服务);不过,它很可能是其他类似的服务。
迈克尔

Answers:


2

可能有些过大,但是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 ~]#
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.